글의 목적
JPA 의 간단한 구동 원리와, 영속성 컨텍스트 구성 및 이점에 대해 설명하는 글 입니다.
JPA 구동방식
- 프로젝트의 설정 정보 조회 후, DB Connect
- Entity Manager Factory를 통해 Entity Manager 생성
- Entity Manager를 통해 영속성 컨텍스트에 캐싱 및 sql 저장소에 query 저장
- EntityTranscation을 통해 sql 저장소 query db에 전송
주의할점
- EntityManagerFactroy는 하나의 어플리케이션을 만들어 전체에 공유한다.
- 엔티티 매니저는 쓰레드간의 공유하면 안된다 -> 즉 Request 하나당 EM을 만들어서 사용하고 Close 한다.
Persistence Context (영속성 컨텍스트)
- 영속성 컨테스트란 논리적 개념으로, Java Application 과 DB 사이의 중간다리 역할이라 생각 가능하다. Entity Manager를 통해 접근 가능하다.
영속성 컨텍스트 내부를 확인해보면
다음 그림처럼 1차캐시, 쓰기지연 SQL 저장소가 있다 각각의 역할에 대해 설명하자면,
1차 캐시
-
DB에 쿼리를 통해 CRU 된 객체들은 영속성 컨텍스트에 caching 되고, 그 상태를 SnapShot을 저장해두며, 같은 쿼리를 보내기전에, 있는지 확인하고 가져와서 DB CONNECTION 을 줄인다.
-
Dirty Check (상태 변경 감지) 쿼리를 보내기 전에 snapshot과 객체 데이터를 비교하여 변경사항이 있을 시, update 쿼리를 쓰기 지연 sql 저장소에 넣는다 (@Transcational readonly ) 옵션이 아마 이런 이유 불필요한 과정을 없애기 위해 사용된 것 같다.
쓰기 지연 저장소
- transcation commit 하기전에 DB에 보낼 쿼리들을 모아두는 곳이라 생각하면 된다.
- transcation commit() 하고 난 후,
변경 감지 -> 수정된 엔티티 쓰기 지연 sql 저장소 등록 -> 저장소 쿼리 데이터베이스 전송 이런식이다.
#cf) 영속성 컨텍스트는 각 EntityManager 마다 생성되기 때문에 하나의 요청마다 생긴다 . 그렇기 때문에 실질적으로 비지니스 로직이 많이 복잡하지 않는다면, 유효한 결과를 얻기 힘들다.