김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.
3. 영속성 관리
영속성 컨텍스트
- 엔티티를 관리하는 환경입니다.
엔티티 생명주기
new / transient (비영속)
- 엔티티 객체를 생성한 시점의 상태입니다.
- 영속성 컨텍스트와 전혀 연관이 없습니다.
managed (영속)
- 영속성 컨텍스트에 저장된 상태입니다.
detached (준영속)
- 영속성 컨텍스트에 저장되었다가 분리된 상태입니다.
- 영속성 컨텍스트에서 삭제됨: 1차 캐시, 해당 엔티티 관련 쿼리 (내부 쿼리 저장소)
removed (삭제)
- 엔티티 객체가 삭제된 상태입니다. (데이터베이스에 삭제될 예정)
- 준영속 상태의 엔티티가 대상입니다. (비영속 -> 영속 -> 준영속 -> 삭제)
상태 메서드
find(): 엔티티 조회
Member member = em.find(Member.class, "member1");
- 식별자: PK와 매핑됨
- 조회 과정
- 1차 캐시 조회
- (1차 캐시에 없을 경우) 데이터베이스 조회 + 1차 캐시에 저장
persist(): 엔티티 등록
- 엔티티를 영속성 컨텍스트에 등록합니다. (1차 캐시에 저장)
- 쓰기 지연
- 커밋 전까지, INSERT 쿼리 보관 (to 내부 쿼리 저장소)
- 커밋 시(flush), 모인 쿼리들 전송 (to 데이터베이스)
flush(): 엔티티 변경사항 반영
- 스냅샷 (1차 캐시)
- 영속성 컨텍스트에 최근 상태를 기록 (엔티티 별)
- (현재 상태와 스냅샷 비교) 변경 데이터 존재 시, 수정쿼리 생성 + 전송 (to 내부 쿼리 저장소)
- 수정 쿼리
- (기본전략) 모든 필드 업데이트
- 재사용성 (수정쿼리 동일) / 데이터 전송량 증가
- 수정될 필드만 업데이트: @DynamicUpdate
- (기본전략) 모든 필드 업데이트
- Flush Mode
- FlushModeType.AUTO: 커밋, 쿼리 실행
- FlushModeType.COMMIT: 커밋
detach(): 영속 상태의 엔티티를 준영속 상태로 전환
merge(): 영속성 컨텍스트에 다시 연결
- 새로운 엔티티 인스턴스 반환
- 인수로 받은 엔티티와 반환된 엔티티의 ID값 동일
- 인수로 받은 엔티티는 여전히 준영속
remove() : 엔티티를 영속성 컨텍스트에서 삭제
clear(): 영속성 컨텍스트를 완전히 초기화
close(): 영속성 컨텍스트를 종료
출처
'Spring > Spring Data JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 5. 연관관계 매핑 기초 (0) | 2023.12.27 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 4. 엔티티 매핑 (1) | 2023.11.28 |
[자바 ORM 표준 JPA 프로그래밍] 2. JPA 시작 (0) | 2023.11.28 |
[자바 ORM 표준 JPA 프로그래밍] 1. JPA 소개 (0) | 2023.11.28 |
[Spring Data JPA] 2-2. Transactionality (0) | 2023.10.18 |