영속성 컨텍스트란,

길셔·2022년 8월 14일
0

JPA

목록 보기
3/7

1. 영속성 컨텍스트란,

  • jpa에서 가장 중요한 용어로, “엔티티를 영구 저장하는 환경”이라는 뜻이다.

  • EntityManager.persist(”entity”); 를 통해 생성해서 접근할 수 있다.

  • 눈에 보이지 않는 논리적인 개념

  • 엔티티의 생명주기
    • 비영속 ( new / transient ) : 영속성 컨텍스트와 전형 관계가 없는 새로운 상태
    • 영속 ( managed ) : 영속성 컨텍스트에 관리되는 상태
    • 준영속 ( detached ) : 영속성 컨텍스트에 저장됐다가 분리된 상태
    • 삭제 ( removed ) :삭제된 상태


2. 엔티티 조회, 1차 캐시


  • BEFORE, AFTER 사이에 em.persist(member)로 저장을 했는데 콘솔을 보면 BEFORE, AFTER 후에 저리된걸 볼수 있다.
    이건 등록될 때 1차 캐시로 먼저 저장을 하고 commit 될 때 저장하는 구조이기 때문이다. 이때 em.find는 commit 시점이 아니라 캐시에서 확인 후 있으니까 바로 반환 받는다.


3. 영속 엔티티의 동일성 보장

  • 처음 실행할 때 한 번 가져오고 캐시에 저장한 후에 존재하면 캐시에서 가져오기 때문에 콘솔을 보면 1번만 실행하고 캐시에 저장된 데이터를 가져오는걸 볼 수 있다.
    그리고 캐시에 저장된 데이터를 가져오기 때문에 둘은 같은 엔티티로 비교하면 true가 나온다.


4. 트랜잭션을 지원하는 쓰기 지원


  • insert문으로 DB에 등록하는 쿼리가 있어도 1차 캐시에 저장하고 COMMIT되는 시점에 등록되는데, 1차 캐시에 저장될 때 쓰기 지연 SQL 저장소에도 저장된다.
    그래서 1차 캐시에 저장하고, 쓰기 지연 SQL 저장소에도 저장하고 COMMIT 될 때 같이 저장된다.


  • 설명이 읽고 코드를 보면 순서가 이해가 잘 될 것이다.

  • 그래서 로직상 ===가 마지막인데 콘솔에 출력된 걸 보면 ===가 먼저 나오고 INSERT문이 마지막에 2번 진행되는 걸 확인할 수 있다.



  • 그럼 나는 10개 이상 쿼리가 쌓이는걸 원치않은데.. 싶으면 persistence.xml에서 배치 옵션을 추가하면 보다 세밀하게 JPA를 사용할 수 있다.

  • 빨간줄의 표시가 쿼리문이 10가 되면 먼저 COMMIT을 진행하는 옵션이다.


5. 엔티티 수정

  • 수정시에는 내용을 수정하고 persist에 넣는 작업이 필요없다.


  • 콘솔을 보면 peresist에 넣는 작업이 없음에도 자동으로 update문이 적용된 걸 확인할 수 있다.

  • 저렇게 가능한 이유는 영속 컨텍스트가 만들어지고 1차 캐시에 저장되기 전에 flush()가 적용되면서 초기의 상태를 스냅샷이라는 영역에 저장을 하고, 1차 캐시가 저장될 때 비교해서 변경된 부분이 있으면 자동으로 쓰기 지연 SQL 저장소에 저장이 되고 DB에 flush를 먼저하고 commit이 된다.

6. 엔티티 삭제

  • 삭제는 엔티티에서 대상 조회 후 em.remove로 삭제하면 끝이다. 영속성 컨텍스트에서 삭제하는 구조는 저장되고 삭제되는 것만 다르지 insert와 같다.

출처 : 인프런 김영한 강사님

profile
까먹지말자

0개의 댓글