[JPA] JPA란?

2023. 3. 25. 22:31JAVA & SPRING/JPA

반응형

객체 지향 언어와 관계형 데이터베이스를 뗄 수 없는 관계이다. 그러나 이 두 가지의 패러다임은 너무 다르다.

객체 CRUD와 데이터 베이스의 CRUD부터 다르다. 객체의 필드가 하나 추가되게 된다면 데이터 베이스의 SQL문도 재작성해야 하는 상황이 생기기도 한다.

 

우리는 데이터베이스를 사용하기 위해 반복적이고 지루한 코드를 지속적으로 작업하게 된다. 또한 자바 객체를 SQL로 변경하고 SQL을 자바객체로 변경하는 작업도 진행해야 한다.

 

 

객체와 관계형 데이터베이스의 차이


  1. 상속
  2. 연관관계
  3. 데이터 타입
  4. 데이터 식별 방법

 

상속

객체는 상속이 가능하지만 데이터베이스에는 상속이란 개념은 없고 테이블의 슈퍼타입과 서브타입 관계만 존재한다.

만약 객체에서 상속을 표현했다면 데이터베이스에서 이를 표현하기 위해 DAO에 외래키인 값을 필드로 추가하고 테이블을 조인해야 하는 수고가 발생한다.

만약 자바 컬렉션에 저장하게 되면 어떻게 하면 될까? 단순히 컬렉션 객체에 add를 해주면 된다. 조회도 간단하게 가능하다.

 

 

연관관계

객체의 연관관계는 참조로 이루어지지만 관계형 데이터베이스의 경우 외래키로 이루어진다. 이로 인해 우리가 작업을 진행할 때에도 객체 지향 다운 코드가 아닌 데이터베이스의 의존적인 개발을 하게 된다. (객체를 테이블에 맞춰 모델링하게 됨)

 


 

객체답게 모델링하려고 한다면 데이터 베이스와 연결하기 위한 매핑 작업만 늘어나 개발보단 데이터베이스 연결에 더 신경 써야 하는 상황이 생긴다.

 

만약 관계형 데이터베이스가 아닌 자바 컬렉션에 저장하고 조회하고 입력했다면 한 줄에 작성하고 해결할 수 있는 문제인데, 패러다임이 다른 탓에 개발자들은 매핑작업에 몰두해야만 하는 것이다.

 

이외에 객체의 그래프 탐색, 엔티티 신뢰문제, 조기 로딩 문제, 비교하기(매핑을 하게 되면 새로운 객체를 생성하기 때문에 자바 컬렉션에 저장된 객체를 조회했을 때와 같은 객체라고 인식하지 않는다) 등 매핑작업의 다양한 어려움이 존재한다.

객체를 자바 컬렉션에 저장하듯 데이터베이스에 저장할 수 없을까? 이러한 문제를 해결하기 위해 우리는 JPA를 만들게 되었고 사용하고 있다.

 

JPA


  • JAVA Persistence API
  • 자바 진영의 ORM 기술 표준

JPA는 새로운 기술이 아니라 애플리케이션과 JDBC사이에서 동작한다. JPA는 객체와 DB사이에서 다양한 징검다리 역할(sql생성, JDBC API사용, 매핑 등)을 해주며 두 패러다임의 불일치 문제를 해결한다. 따라서 JPA를 사용하면 자바 컬렉션을 사용하듯이 간편하게 한 줄의 코드로 모든 걸 해결할 수 있다.

 

JPA 자바 표준 명세이며 인터페이스의 모음이다. JPA 2.1 표준 명세를 구현한 3가지 구현체(하이버네이트, EclipseLInk, DataNucleus)가 있는데 대부분의 사람들이 하이버네이트를 사용한다.

 

 

ORM?

Object-relational mapping(객체 관계 매핑)으로 객체는 객체대로 설계하고 RDBM은 RDBM대로 설계하도록 ORM 프레임워크가 중간에서 매핑 작업을 해준다. 오늘날에 사용되는 대중적인 언어에는 대부분 ORM 기술이 존재한다.

즉, ORM은 객체와 RDBM 두 기둥위에 있는 기술이라고 보면 된다.

 

 

JPA를 사용해야 하는 이유


ORM프레임워크가 중간에서 다 해결해주기 때문에 SQL 중심적인 개발에서 객체 중심의 개발이 가능하다.

이로 인해 생산성이 좋아지고 유지보수하기 편해진다. 또한 패러다임의 불일치를 해결할 수 있으며 성능면에서 더 나아진다.

이외에 데이터 접근 추상화와 벤더 독립성, 자바 표준이라는 장점을 가지고 있다.

 

 

생산성

  • 저장: jpa.persist(member)
  • 조회: Member member = jpa.find(memberId)
  • 수정: member.setName("변경 이름")
  • 삭제: jpa.remove(member)

 

유지보수

기존에는 필드가 변경(추가 및 삭제 등)될 시 모든 SQL를 수정해야 했다. 그러나 JPA는 필드가 추가하면 알아서 SQL처리를 해준다.

 

 

패러다임의 불일치 해결

  • JPA와 상속: 슈퍼타입 서브타입 관계를 해결하기 위해 SQL문을 두 번 작성해야 했지만 이제는 JPA는 알아서 동작하기에 개발자는 한 줄의 코드만 작성하면 됨

 

입력 예시

 

 

  • JPA와 연관관계: 원래는 외래키 값을 넣어주고 작업을 해야 하지만 JPA를 사용하면 연관관계를 저장하고 탐색을 해준다.
  • JPA와 객체 그래프 탐색: 자유롭게 객체 그래프를 탐색할 수 있고 엔티티를 신뢰할 수 있다(지연로딩).
  • JPA와 비교하기: 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.

 

예시

 

 

 

성능 최적화 기능

  1. 1차 캐시와 동일성(Identity) 보장
  2. 트랜잭션을 지원하는 쓰기 지연(Transactional write-behind): JDBC BATCH SQL 기능을 사용해서 여러 개의 SQL문을 한 번에 전송한다.
  3. 지연 로딩(Lazy loading): 즉시 로딩은 SQL로 한번에 연관된 객체까지 미리조회하지만 지연 로딩은 객체가 실제 사용될 때 로딩한다.
반응형