2. 영속성 컨텍스트

2922 단어 JPAJPA

영속성 컨텍스트

  • JPA의 가장 핵심적인 내용 중 한가지는 바로 엔티티를 영구 저장하는 환경영속성 컨텍스트 이다.
  • 물리적인 개념이 아닌 논리적인 개념이다. JPA를 사용하면 엔티티 매니저를 통해 영속성 컨텍스트에 접근하게 된다.

생명 주기

  • 비영속 (new/transient)
    : 영속성 컨텍스트와 전혀 관계없는 새로운 상태
  • 영속 (managed)
    : 영속성 컨텍스트에 의해 관리되는 상태
  • 준영속 (detached)
    : 영속성 컨텍스트에 저장되었다가 분리된 상태
    : 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.
  • 삭제 (deleted)
    : 삭제된 상태
// 객체 생성 (비영속)
Member member1 = new Member();
member.setId("member1");
Member member2 = new Member();
member.setId("member2");

EntityManager em = emf.createEntityManager();
em.getTransaction().begin(); // transaction 시작

// 객체 저장 (영속)
em.persist(member1);
em.persist(member2);

// 영속성 컨텍스트에서 분리 (준영속)
em.detach(member1);
// 객체를 삭제한 상태 (삭제)
em.remove(member2);

영속성 컨텍스트로 얻을 수 있는 이점

#1 에서 JPA 의 이점에 대해서 언급했었다. 영속성 컨텍스트는 아래와 같은 이점을 제공해줄 수 있다.

1차 캐시

  • em.find(member.class, "member2") find 메서드를 호출하면 JPA 는 영속성 컨텍스트 에 있는 엔티티를 먼저 조회한다.
  • DB 에 접근하지 않아도 되기 때문에 성능상에 이점을 제공한다.

영속 엔티티의 동일성 보장

Member a = em.find(member.class, "member")
Member b = em.find(member.class, "member")

System.out.println(a==b) // true
  • 트랜잭션의 격리 수준을 DB 가 아닌 APP 차원에서 제공하기 때문에 동일한 엔티티를 보장해준다.

트랜잭션을 지원하는 쓰기 지연

  • persist() 시 SQL 은 DB에 바로 보내지지 않고 쓰기 지연 SQL 저장소에 저장되었다가 commit() 이 되는 시점에 flush 되면서 DB 로 전송된다.
  • SQL을 모아뒀다가 한번에 보내기 때문에 DB에 접근하는 횟수를 줄일 수 있다.

변경 감지 (Dirty Checking)

  • 영속성 컨텍스트는 1차 캐시 내에서 스냅샷과 엔티티를 비교해 변경이 감지되면 쓰기 지연 SQL 저장소에 update 쿼리를 저장해뒀다가 commit 되는 시점에 DB에 반영한다
  • 삭제도 이와 같은 방식을 이용한다.

플러시 ?

영속성 컨텍스트의 변경 내용을 DB 에 반영하는 것을 말한다.

플러시의 결과

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

플러시를 사용하는 방법

  • em.flush()
    : 직접 호출하는 방식
  • transaction.commit()
    : 플러시 자동 호출
  • JPQL 쿼리 실행
    : 플러시 자동 호출

출처

좋은 웹페이지 즐겨찾기