inblog logo
|
백엔드블로그-dohyeong
    JPA

    [JPA] 03. 영속성 관리

    Aug 18, 2023
    [JPA] 03. 영속성 관리
    Contents
    JPA 가장 중요한 2가지엔티티 매니저 팩토리와 엔티티 매니저영속성 컨텍스트비영속영속준영속, 삭제영속성 컨텍스트의 이점

    JPA 가장 중요한 2가지

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

    엔티티 매니저 팩토리와 엔티티 매니저

    notion image
     

    영속성 컨텍스트

    “엔티티를 영구 저장하는 환경” 이라는 뜻임
    논리적인 개념
    눈에 보이지 않는다
    엔티티 매니저를 통해서 영속성 컨텍스트에 접근

    📌 엔티티의 생명주기
    notion image

    비영속

    jpa와 관련없는 상태
    객체를 생성한 상태

    영속

    엔티티 매니저로부터 객체를 persist한 상태

    준영속, 삭제

    엔티티를 영속성 컨텍스트에서 분리한다.
    영속 → 준영속
    • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리
    • 영속성 컨텍스트가 제공하는 기능을 사용 못함
    em.detach(entity) em.clear() em.close()
     

    영속성 컨텍스트의 이점

    1차캐시
    엔티티 조회, 1차 캐시
    notion image
    DB 를 안보고 캐시값을 먼저 보고 찾음 → 없다면 DB 조회 → 1차 캐시에 없는 member2 를 1차 캐시에 저장 → 반환
    1차 캐시는 트랜잭션 안에서만 동작하기 때문에 크게 이점은 없음
    영속 엔티티의 동일서 보장
    → 1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
     
    트랜잭션을 지원하는 쓰기 지연
    notion image
     
    쓰기 지연하는 상태
    notion image
     
    transaction.commit() 시 DB에 flush 해줌
    notion image
     
    변경 감지 ( Dirty Checking )
    notion image
    1. 최초로 영속할 때 1차 캐시에 스냅샷을 저장함
    1. 엔티티와 스냅샷과 비교
     
    엔티티 삭제
    Member memberA = em.find(Member.class, "memberA"); em.remove(memberA);
    플러시
    영속성 컨텍스트의 변경내용을 데이터베이스에 반영
    플러시 발생
    • 변경 감지
    • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
    • 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송
    영속성 컨텍스트에 플러시 하는 방법
    • em.flush() - 직접 호출
    • 트랜잭션 커밋 - 자동 호출
    • JPQL 쿼리 실행 - 자동 호출
     
    플러시는
    • 영속성 컨텍스트를 비우지 않음
    • 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
    • 트랜잭션이라는 작업 단위가 중요 → 커밋 직전에만 동기화하면 된다.
     

    준영속 상태로 만드는 방법

    • em.detach(entity) → 특정 엔티티만 준영속 상태로 전환
    • em.clear() → 영속성 컨텍스트를 완전히 초기화
    • em.close() → 영속성 컨텍스트를 종료
    Share article

    백엔드블로그-dohyeong

    RSS·Powered by Inblog