영속성 컨텍스트란?
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 |