영속성 컨텍스트란?

Kuno17·2023년 5월 10일
0

CS공부

목록 보기
8/17
post-thumbnail

JPA를 이해하는데 가장 중요한 용어이다.
"엔티티를 영구 저장하는 환경" 이라는 뜻이다.

EntityManager.persist(entity)
이 뜻은 엔티티를 영속성 컨텍스트에 저장한다는 의미이다.

엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다.

엔티티의 생명주기

  1. 비영속(new/transient)
    영속성 컨텍스트와 전혀 관계없는 새로운 상태

  2. 영속(managed)
    영속성 컨텍스트에 관리되는 상태

  3. 준영속(detached)
    영속성 컨텍스트에 저장되었다가 분리된 상태

  4. 삭제(removed)
    삭제된 상태


비영속

단순히 객체를 생성한 상태를 의미한다.


영속


준영속, 삭제

em.detach(member);
회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태

em.remove(member);
객체를 삭제한 상태(삭제)


왜 쓰는가?

대략적으로 데이터 베이스와 애플리케이션 사이에 존제함을 알 수 있다.
영속성 컨텍스트의 이점은 다음과 같다.

  • 1차 캐시
  • 동일성(identity)보장
  • 트랜잭션을 지원하는 쓰기 지연(transactional-write-behind)
  • 변경 감지(Dirty Checking)
  • 지연 로딩(Lazy Loading)

1차 캐시

다음과 같이 member객체가 member1로 1차 캐시에 저장되면
조회를 다음과 같이 진행할때 1차 캐시를 우선적으로 탐색한다.

Member findMember = em.find(Member.class, "member1");
즉 데이터베이스로 쿼리를 날려서 조회하는게 아니다.

그런대 만약에 1차 캐시에 존제하지 않는 member2를 조회한다면?

그러나 사실 1차 캐시를 사용한다고해서 엄청나게 큰 성능적 이득을 얻을 수 없다.
엔티티 매니저는 데이터베이스 트랜젝션 단위로 만들고 트랜젝션이 끝나면 지워진다. 즉 한번의 요청마다 생성되고 종료된다 그렇기 때문에 애플리케이션 전체에서 공유하는 캐시는 아니다. 비즈니스 로직이 굉장히 복잡한 경우가 아니라면 큰 성능차이는 생기지 않는다.


영속 엔티티의 동일성 보장

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

System.out.println(a == b); //true

1차 캐시로 반복 가능한 읽기(REPEATABLE READ)등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리캐이션 차원에서 제공한다.


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

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
//엔티티 매니저는 데이터 변경시 트랜잭션을 시작해야 한다.
transaction.begin(); // [트랜잭션] 시작

em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.

//커밋하는 순간 데이터베이스에 INSERT SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋

변경 감지


영속석 컨텍스트를 플러시하는 방법
em.flush() 직접 호풀
트랜잭션 커밋 - 플러시 자동 호출
JPQL 쿼리 실행 - 플러시 자동 호출

profile
자바 스터디 정리 - 하단 홈 버튼 참조.

0개의 댓글