출처: 자바 ORM 표준 JPA 프로그래밍
PersistenceContext: 영속성 컨텍스트
영속화의 의미는 데이터를(엔티티) 영구 저장하는 것.
그것에 사용되는 논리적인 환경이 영속성 컨텍스트이다.
EntityManager를 통해 접근할수 있다.
세부적으로는 EntityManagerFactory에서 EntityManager를 만들고, 그걸 트랜잭션 단위로 클라이언트가 사용한다.
생명주기
• 비영속 (new/transient)
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
• 영속 (managed)
영속성 컨텍스트에 관리되는 상태
• 준영속 (detached)
영속성 컨텍스트에 저장되었다가 분리된 상태
• 삭제 (removed)
삭제된 상태
영속성 컨텍스트의 이점
1차캐시
- 영속성 컨텍스트에 포함되는건데, 한번이라도 사용된(조회 포함) 엔티티는 1차캐시에 등록된다. 예를 들어 한번 더 같은 엔티티를 조회하면 db에서 오는게 아니라 캐시에서 조회된다.
동일성 보장
- 동일한 테이블을 조회하면, 조회후 다른 인스턴스에 담아도 주소값이 같다.
변경감지 - dirty checking
- 변경, 삭제시에는 em.persist()를 안해도, 알아서 db에 반영된다. 1차캐시에는 최초 엔티티가 담길때, 초기정보 스냅샷이 같이 담기는데, 나중에 flush()가 일어날때 스냅샷과 현재 엔티티 정보를 비교하고나서 둘이 다르면 그에 맞는 쿼리가 쓰기지연 SQL 저장소에 생성되고 db로 날아간다.
지연로딩 - lazy loading
- 연관관계가 매핑된 엔티티를 조회하는 상황에서, 조회한 엔티티 그 자체가 아닌 매핑된 엔티티를 전부 join해서 가져오는건 즉시로딩이라고 한다. 이는 예상치 못한 비싼 쿼리를 만들수도 있다(연관관계가 아주 많고, 그것들이 또 연관관계가 있고...) 그래서 조회할 엔티티 자체만 db에서 가져오늘걸 지연로딩이라고 한다. 나중에 매핑된 엔티티를 사용할때가 되서야 로딩된다.
+강의에서는 나중 시점에 배우지만, 난 다 완강한 뒤라서 적어둔다.
플러시
-영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것이다.
-플러시 한다고 영속성 컨텍스트가 비워지는건 아니다.
언제 일어날까?
• 변경 감지
• 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
• 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
(등록, 수정, 삭제 쿼리)
플러시 하는법은?
• em.flush() - 직접 호출
• 트랜잭션 커밋 - 플러시 자동 호출
• JPQL 쿼리 실행 - 플러시 자동 호출(데이터 반영 순서가 꼬여서 예상치 못한 일을 방지하기 위해)
'Dev > JPA' 카테고리의 다른 글
[강의정리] 프록시와 연관관계 관리 (0) | 2021.05.18 |
---|---|
[강의정리] 상속관계 매핑 (0) | 2021.05.18 |
[강의정리] 연관관계 매핑 (0) | 2021.05.17 |
[강의정리] 엔티티 매핑 (0) | 2021.05.17 |
[강의정리] SQL 중심적인 개발의 문제점 (0) | 2021.05.17 |