Back-End/JPA

JPA - 영속성 관리

Meluu_ 2024. 7. 1. 19:16

JPA 핵심

  • 객체와 관계형 데이터베이스 매핑
  • 영속성 컨텍스트

 

 

영속성 컨텍스트


의미 : 엔티티를 영구 저장하는 환경

 

영속성 컨텍스트는 논리적인 개념

엔티티 매니저를 통해 영속성 컨텍스트에 접근

 

J2SE 환경
엔티티 매니저 1 : 1 영속성 컨텍스트

J2EE, 스프링 프레임 워크같은 컨테이너 환경
엔티티 매니저 N : 1 영속성 컨텍스트

 

🌿 엔티티의 생명주기

  • 비영속 
    • 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
    • new / transient
    • ex) 객체를 생성한 상태 
  • 영속
    • 영속성 컨텍스트에 관리되는 상태
    • managed
    • ex) persist(객체);    - 객체는 영속상태이기에 관리 대상
  • 준영속
    • 영속성 컨텍스트에 저장되었다가 분리된 상태
    • detached
    • 준영속 상태로 만드는 법 
      1. em.detach(객체)  // 특정 엔티티만 준영속 상태로 전환
      2. em.remove(객체)  // 삭제
      3. em.clear()  // 영속성 컨텍스트를 완전히 초기화
      4. em.close()  // 영속성 컨텍스트를 종료
        1. 하이버네이트5.4.1Final 부터 영속성 컨텍스트 종료 후에도 트랜잭션이 종료상태가 아니라면 프록시를 초기화할 수 있다.
  • 삭제
    • 삭제된 상태
    • removed

 

💠 영속성 컨텍스트의 이점

  • 1차 캐시
    • { @Id : Entity } 형식으로 저장됨 
    • em.find(id) 값으로 조회시 1차 캐시에 있다면 Entity 반환
    • 캐시에 없으면 DB에서 조회후 1차 캐시에 저장한 다음 반환
  • 동일성(identity) 보장
    • 1차 캐시로 반복 가능한 읽기(REPEATABLE READ) 등급의 트랜잭션 격리수준을 애플리케이션 차원에서 제공
    • 같은 객체 조회 후 비교시 True
  • 트랜잭션을 지원하는 쓰기 지연
    • persist(객체)하면 쓰기 지연 SQL 저장소에 Insert SQL을 담는다. (버퍼)
    • 트랜잭션 시작후 commit()로 커밋 시 Insert SQL을 보낸다.
  • 변경 감지 (Dirty Checking)
    • 영속상태 엔티티의 한해서 데이터 수정자동으로 Update SQL을 생성한다.
  • 지연 로딩(Lazy)

 

 

✔️ 플러시


영속성 컨텍스트의 변경내용을 데이터베이스에 반영

 

플러시 발생 과정

  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송

 

플러시 하는 법

em.flush()  // 직접 호출
트랜잭션 커밋 // 플러시 자동 호출
JPQL 쿼리 실행 // 플러시 자동 호출 

 

💠 모드 옵션

em.setFlushMode(FlushModeType)
  • FlushModeType.AUTO : 커밋이나 쿼리 실행시 플러시 (default)
  • FlushModeType.COMMIT : 커밋할 때만 플러시 

 

❗ 플러시 유의점

  • 영속성 컨텍스트를 비우지 않음
  • 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화
  • 트랜잭션 작업단위가 중요
    • 커밋 직전에만 동기화 하면 됨

 

 

🔖 학습내용 출처


자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런

김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도

www.inflearn.com

 

'Back-End > JPA' 카테고리의 다른 글

JPA - 1:N 단방향과 양방향에 대해서  (0) 2024.07.09
JPA - 다양한 연관관계 매핑  (0) 2024.07.09
JPA - 연관관계 매핑 기초  (0) 2024.07.05
JPA - 엔티티 매핑  (0) 2024.07.05
JPA 소개  (0) 2024.07.01