영속성 컨텍스트(Persistence Context)
- 엔티티를 관리하는 논리적인 공간이다.
- DB 와의 동기화를 위해 엔티티 변경 정보를 관리한다.
- 엔티티를 등록, 해제할 수 있어 그 상태를 관리하는 엔티티 생명주기가 존재한다.
엔티티 생명 주기
- em.persist(member); 를 하면 Member 객체가 영속성 컨텍스트에 등록되어 commit 시 CRATE 쿼리로 변환해 실행하여 DB와 동기화를 한다.
- persist() 호출 전인 객체(비영속) 나 detached(준영속)나 removed(삭제) 된 엔티티는 아무리 setter로 데이터를 변경하거나 무슨 짓을 해도 DB 에 반영되지 않는다. 영속성 컨텍스트는 그 사실을 모르기 때문이다.
- flush(): 영속성 컨텍스트와 DB 를 동기화하는 메소드
쓰기 지연
- JPA는 엔티티가 변경된다고 해서 바로바로 DB에 반영되는게 아니라 변경 사항을 영속성 컨텍스트에 저장한다.
- 트랜잭션이 commit 될 때 비로소 영속성 컨텍스트의 정보를 활용해 DB 쿼리를 생성하여 실행한다.
영속성 컨텍스트의 구성 요소: 1차 캐시
Member member = em.find(Member.class, "1");
Member member1 = em.find(Member.class, "1");
member == member1 인 이유
- 영속성 컨텍스트 에는 1차 캐시가 존재한다.
- find() 가 호출되면 캐시에서 먼저 찾고 없으면 DB 에서 가져와 캐시에 담는다.
- id가 "1" 인 엔티티는 한 번 가져온 이력이 있으므로 cache hit 이 발동해 동일한 엔티티를 반환하는 것이다.
영속성 컨텍스트의 구성 요소: 스냅샷
update 방식
- 영속상태(영속성 컨텍스트에 들어간 엔티티) 는 객체 setter() 만 호출해도 영속성 컨텍스트 안 캐시 데이터가 변경된다. 이것을 변경 감지라고 한다.
- commit이 실행되면 엔티티 초기값을 저장한 스냅샷과 엔티티를 비교해 다르면 UPDATE 쿼리 생성 후 실행한다.
[JPA] 영속성 컨텍스트(Persistence Context) : 엔티티 관리 공간
레퍼런스
자바 ORM 표준 jpa 프로그래밍 책
글 읽어주셔서 언제나 감사합니다. 좋은 피드백, 개선 피드백 너무나도 환영합니다.
'SearchDeveloper > Java' 카테고리의 다른 글
ListenableFuture 의 Callback Hell 해결하기 (0) | 2023.05.03 |
---|---|
Java 애플리케이션 메모리 누수(Memory leak) 잡기 - jstat, MAT (0) | 2022.10.02 |
Java 에서 테스트용 도커 컨테이너 띄우는 법 : TestContainer (4) | 2022.06.21 |
[JAVA] stream 코드 스니펫 (0) | 2021.05.30 |
[번역] Pro Java Programming - 자바 아키텍쳐 (0) | 2020.10.18 |