JPA
- Java Persistence API
- 자바 진영(자바 플랫폼 SE, EE)의 ORM 기술 표준
ORM
- Object-relational mapping [객체 관계 매핑]
데이터 베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법 - 위키백과
- 객체는 객체대로, 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크(JPA, Hibernate, EclipseLink etc)가 중간에서 매핑
동작 방식
- JPA 는 Java Application 과 JDBC 사이에서 동작
사용 이유
- 객체 중심으로 개발이 가능
- 객체지향적인 코드 작성이 가능하면서, 생산성이 향상
- 유지보수에 탁월
3.1 데이터 필드가 추가되는 경우 JPA는 해당 객체의 필드만 추가하면 됨
3.2 기존 SQL에서는 해당하는 모든 SQL를 수정
- 패러다임의 불일치 해결
4.1 상속관계
4.2 연관관계
4.3 객체 그래프 탐색
4.4 비교
- 성능 최적화
5.1 1차 캐시와 동일성(Identity) 보장
-> 같은 트랜잭션 안에서는 동일한 Entity를 반환 -> 캐싱된 Entity를 반환
5.2 트랜잭션을 지원하는 쓰기 지연(Transactional Write-Behind)
-> 트랜잭션을 Commit할 때까지 SQL를 모아서 한번에 처리 (JDBC BATCH SQL 기능)
5.3 지연 로딩(Lazy Loading)
-> Update, Delete로 인한 Row Rock(락) 시간을 최소화
-> commit 시점에 해당 쿼리를 수행
-> 지연 로딩 : 객체가 실제 사용될 때 로딩
-> 즉시 로딩 : Join Sql로 한번에 연관된 객체까지 미리 조회
Dialect (방언)
- JPA는 특정 데이터베이스에 종속적이지 않음
- Dialect 설정으로 JPA에게 어떤 종류의 DBMS를 사용하는지 알려줄 수 있음
/META-INF/persistence.xml 설정
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
JPA 구동 방식
- Persistence 는 META-INF/persistence.xml 설정 정보를 조회
- Persistence 가 EntityManagerFactory 생성
val emf: EntityManagerFactory = Persistence.createEntityManagerFactory(persistenceUnitName)
- EntityManagerFactory 가 각각의 필요한 EntityManager를 생성
3.1 조회, 저장 등 클라이언트 요청마다 생성되어 처리 후 없어지는 존재
val em: EntityManager = emf.createEntityManager()
✔️ 예제 코드
fun main(args: Array<String>) {
runApplication<>(*args)
val emf: EntityManagerFactory = Persistence.createEntityManagerFactory("hello")
val em: EntityManager = emf.createEntityManager()
val tx: EntityTransaction = em.transaction
tx.begin()
try {
( ... )
tx.commit()
} catch (e: Exception) {
tx.rollback()
} finally {
em.close()
}
emf.close()
}
주의
- 엔티티 매니저 팩토리(EntityManagerFactory)는 하나만 생성하여 Application 전체에서 공유
- 엔티티 매니저(EntityManager)는 쓰레드 간에 공유해서는 안됨
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행
JPQL
- JPA를 사용하면 엔티티 객체를 중심으로 개발을 하고, 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색을 함
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하기 때문에, 검색 조건이 포함된 SQL이 필요
- JPQL 은 객체를 대상으로 검색하는 객체 지향 쿼리 이며, 특정 데이터베이스 SQL에 의존하지 않음
참고 : 인프런 강의[자바 ORM 표준 JPA 프로그래밍 - 기본편]