[JPA] Entity Manager & Persistene Context

한호성·2023년 1월 12일
0

JPA

목록 보기
2/2

글의 목적

JPA 의 간단한 구동 원리와, 영속성 컨텍스트 구성 및 이점에 대해 설명하는 글 입니다.

JPA 구동방식

  1. 프로젝트의 설정 정보 조회 후, DB Connect
  2. Entity Manager Factory를 통해 Entity Manager 생성
  3. Entity Manager를 통해 영속성 컨텍스트에 캐싱 및 sql 저장소에 query 저장
  4. 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 마다 생성되기 때문에 하나의 요청마다 생긴다 . 그렇기 때문에 실질적으로 비지니스 로직이 많이 복잡하지 않는다면, 유효한 결과를 얻기 힘들다.

profile
개발자 지망생입니다.

0개의 댓글