본문 바로가기
Spring Data

영속성 컨텍스트

by sangfeeeeel 2021. 11. 24.

영속성 컨텍스트란?


  • JPA를 이해하는데 가장 중요한 용어
  • "엔티티를 영구 저장하는 환경"이라는 뜻
  • EntityManager.persist(entity)
  • 영속성 컨텍스트는 논리적인 개념
  • 눈에 보이지 않는다.
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근

 

영속성 컨텍스트의 이점


1. 엔티티 조회, 1차 캐시

Member member = new Member();
member.setId("member1");
member.setName("회원1");

//1차 캐시에 저장됨
em.persist(member);

//1차 캐시에서 조회
Member findMember = em.find(Member.class, "member1");

- 한 트랜잭션 안에서만 1차 캐시가 작동하므로 큰 이점은 없다.

 

2. 영속 엔티티의 동일성 보장

Member a = em.find(Member.class, 101L);
Member b = em.find(Member.class, 101L);

System.out.println(a == b); //동일성 비교 true

- 1차 캐시로 반복 가능한 읽기(REPEATABLE READ)등급의 트랜잭션격리 수준을

  DB가 아닌 애플리케이션 차원에서 제공

 

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

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

em.persist(memberA);
em.persist(memberB);
//여기까지 INSERT SQL을 DB에 보내지 않는다.

//커밋하는 순간 DB에 INSERT SQL을 보낸다.
transaction.commit(); //트랜잭션 커밋

- 영속화 할때가 아닌, 커밋하는 순간 쓰기지연 SQL저장소의 쿼리들이 DB로 날아감

 

4. 변경 감지(Dirty Checking)

EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();
transaction.begin();

//영속 엔티티 조회
Member member1 = em.find(Member.class, "member1");

//영속 엔티티 데이터 수정
member1.setName("hi");

transaction.commit(); //트랜잭션 커밋

- 예를들어, em.update(member) 이런 코드들이 필요하다고 생각할 수 있지만,

영속성 컨텍스트로 변경이 자동으로 감지되어 수정된다.

'Spring Data' 카테고리의 다른 글

페치 조인(fetch join)이란?  (0) 2021.12.03
즉시 로딩과 지연 로딩  (0) 2021.11.27
프록시란?  (0) 2021.11.26
엔티티의 생명주기  (0) 2021.11.24