티스토리 뷰

Spring

JPA 영속성 컨텍스트

soo__ 2022. 4. 28. 20:19

영속성 컨텍스트란?

  • Entity를 영구 저장하는 환경
    • 애플리케이션과 DB 사이에서 객체를 보관하는 가상의 DB 같은 역할
  • EntityManager를 통해 영속성 컨텍스트에 접근하고 관리할 수 있음
    • EntityManager를 통해 Entity를 저장하거나 조회하면, EntityManager는 영속성 컨텍스트에 Entity를 보관하고 관리함
      persist 메서드를 통해 영속성 컨텍스트에 저장
    • EntityManager는 여러 Thread가 동시에 접근하면 동시성 문제가 발생할 수 있음

 

영속성 컨텍스트의 장점

  • 동일성(identity) 보장
    • 마치 자바 컬랙션에서 조회하듯이, JPA가 영속 Entity의 동일성을 보장해줌
    • Entity를 조회해올 때 1차 캐시부터 뒤져서 해당되는 Key값을 가진 Entity가 있으면 조회해옴
    • 1차 캐시에 없다면, 그때 DB에 조회 쿼리르 날려서 조회 후 1차 캐시에 저장
       Key; @Id (DB pk로 매핑한 필드)
       Value; @Entity (JPA가 관리하는 Entity 객체)
  • 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
    • persist 메서드를 통해 Entity를 1차 캐시에 넣음
    • 해당 Entity를 분석하여 SQL을 생성
    • 생성한 SQL을 쓰기 지연 SQL 저장소에 쌓아둠
    • 트랜잭션 커밋 시 쓰기 지연 SQL 저장소에 있던 쿼리들이 flush되면서 DB에 반영
    • 따라서, SQL 최적화 여지가 생기는 이점을 가짐
  • 변경감지 (Dirty Checking)
    • save 메서드만으로 내부 변경점을 알아서 update해주는 기능 
    • 영속성 컨텍스트 flush 메서드가 호출되면, JPA는 1차 캐시에 저장된 Entity와 스냅샷을 비교
      스냅샷; 최초로 1차 캐시에 들어온 상태를 저장해둔 것
       flush 메서드는 영속성 컨텍스트를 비우지 않음, 단지 변경 내용을 DB에 동기화하는것
    • 다른 부분이 있다면 JPA는 UPDATE 쿼리를 쓰기 지연 SQL 저장소에 저장
    • 변경 감지 관련 유의점 참고
  • 지연 로딩 (Lazy Loading)

 

Entity의 생명주기

  • 비영속 (New)
    • 객체 생성 후 영속성 컨텍스트에 저장되지 않은 상태
       단순히 자바 객체를 생성하고 초기화만 해준 상태
    • JPA가 관리하지 않음
  • 영속 (Managed)
    • persist 메서드를 통해 영속성 컨텍스트 안에서 관리되고 있는 Entity 객체
  • 준영속 (Detached)
    • 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제 (Removed)

 

 

'Spring' 카테고리의 다른 글

Spring Boot의 다중 요청 처리 (+서블릿 컨테이너)  (0) 2022.05.23
JUnit 4와 5 비교  (0) 2022.05.16
Redisson 분산락  (0) 2022.04.27
컴포넌트 스캔과 수동 Bean 등록  (0) 2022.04.24
OSIV  (0) 2022.04.24
공지사항
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31