Spring/Spring Data JPA

[자바 ORM 표준 JPA 프로그래밍] 3. 영속성 관리

noahkim_ 2023. 11. 28. 11:57

김영한 님의 "자바 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(): 영속성 컨텍스트를 종료

 

 

출처