01. JPA(Java Persistence API)
1. JPA란?
JPA란 JAVA의 ORM(Object-Relational Mapping) 기술 표준으로 JAVA 객체(Object)와 관계형 데이터베이스(RDB)를 중간에서 매핑해주는 ORM 프레임워크이다.
2. JPA 사용 이유
1) SQL 중심 > 객체 중심 개발
2) 생산성
> JPA가 SQL문을 만들어 주기 때문에 persist, find, setXX, remove 메서드로 CRUD 수행
3) 유지보수
> 컬럼 추가 시 SELECT/INSERT/UPDATE/DELETE 모든 DML문 수정이 필요했으나, JPA의 경우 필드만 추가
4) 패러다임의 불일치 해결
> 상속, 연관관계, 객체 그래프 탐색, 비교
5) 성능
(1) 1차 캐시와 같은 트랜잭션 안에서는 같은 엔티티를 반환하는 동일성 보장
(2) 트랜잭션을 지원하는 쓰기 지연(transaction write-behind)
> 트랜잭션을 커밋하기 전까지 INSERT SQL문을 모았다가 JDBC BATCH SQL 기능을 사용해 한번에 전송
> 트랜잭션 커밋 시 UPDATE, DELETE 실행 후 바로 커밋하기에 로우(ROW)락 시간 최소화
(3) 지연 로딩(Lazy Loading)
> JOIN SQL로 한번에 연관된 객체를 미리 조회하지 않고 객체가 실제 사용될 때 로딩
6) 데이터 접근 추상화와 벤더 독립성
> 데이터베이스를 변경해도 코드 수정 불필요. JPA가 방언(dialect)에 맞는 SQL문 작성
7) 표준
tip) 방언(dialect)
> SQL 표준을 지키지 않는 특정 DB만의 고유한 기능
3. JPA 구동 방식
> EntityManagerFactory는 하나만 생성해서 애플리케이션 전체가 공유, EntityManager는 쓰레드간 공유를 하지 않는다. JPA의 모든 데이터 변경은 트랜잭션 안에서만 실행한다.
4. 영속성 컨텍스트
> 영속성 컨텍스트란 엔티티를 영구 저장하는 환경이라는 뜻의 논리적인 개념이다. EntityManager를 통해 영속성 컨텍스트에 접근한다.
> 영속성 컨텍스트의 이점
1) 1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
2) 동일성(identity) 보장
3) 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
4) 변경 감지(Dirty Checking)
5) 지연 로딩(Lazy Loading)
상태 | 정의 |
비영속 (new/transient) | 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 |
영속 (managed) | 영속성 컨텍스트에 관리되는 상태 |
준영속 (detached) | 영속성 컨텍스트에 저장되었다가 분리된 상태 |
삭제 (removed) | 삭제된 상태 |
메서드 | 정의 |
persist | detached 상태의 엔티티를 다시 영속화 |
merge | 최초 생성된 엔티티 영속화 |
flush | 영속성 컨텍스트의 변경내용을 데이터베이스에 반영 |
detach | 특정 엔티티만 준영속 상태로 전환 |
clear | 영속성 컨텍스트 초기화 |
close | 영속성 컨텍스트 종료 |
tip) 영속성 컨텍스트를 플러시하는 방법
1) em.flush() - 직접 호출
2) 트랜잭션 커밋 - 플러시 자동 호출
3) JPQL 쿼리 실행 - 플러시 자동 호출