728x90
본 게시물은 인프런 김영한님의 JPA강의를 보고 정리한 글입니다
영속성 컨텍스트
- JPA를 이해하는데 가장 중요한 용어
- 엔티티를 영구 저장하는 환경이라는 뜻
EntityManager.persist(entity);
영속성 컨텍스트의 생명주기
- 비영속 (new/transient)
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 영속 (managed)
- 영속성 컨텍스트에 관리되는 상태
- 준영속 (detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
- 삭제 (removed)
- 삭제된 상태
영속성 컨텍스트의 이점
- 1차 캐시 동일성(identity) 보장
- 영속성 컨텍스트 안에 있는 1차 캐시 부터 조회하여 찾는다
- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- 영속성 컨텍스트 안의 쓰기 지연 SQL 저장소로 INSERT SQL을 생성해 보낸다
- 커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다 ->
flush
- 변경 감지(Dirty Checking)
- 1차 캐시의 스냅샷(최초로 영속성 컨텍스트/1차 캐시에 들어온 상태)과 Entity의 변경된 값들을 비교한다
그리고 변경된 부분을 DB에 반영한다
- 1차 캐시의 스냅샷(최초로 영속성 컨텍스트/1차 캐시에 들어온 상태)과 Entity의 변경된 값들을 비교한다
- 지연 로딩(Lazy Loading)
그래서 플러시(flush)가 뭔데?
플러시란 : 영속성 컨텍스트의 변경된 내용을 DB에 반영한다!!
플러시의 발생 순서
- 더티 체킹 (변경 감지)
- 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송 (등록,수정,삭제....)
영속성 컨텍스트를 플러시 하는 방법
em.flush()
- 직접 호출 (잘 사용하진 않는다)- 트랜잭션 커밋 - 플러시 자동 호출
- JPQL 쿼리 실행 - 플러시 자동 호출
플러시는!!
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 -> 커밋 직전에만 동기화 하면 됨
'JPA' 카테고리의 다른 글
JPA/DDD 관점에서의 직접 참조/간접 참조 (1) | 2024.10.11 |
---|---|
연관 관계가 Lazy Loading일 때, 해당 엔티티를 사용하는 메서드에 @Transactional이 없다면? (0) | 2024.08.22 |
Spring Data JPA에서 Fetch Join과 CountQuery를 사용한 페이징 최적화 (2) | 2023.07.18 |