강의/자바 ORM 표준 JPA
JPA, 영속성 컨텍스트의 이점 (영속 엔티티의 동일성 보장)
daram
2022. 4. 9. 12:00
영속성 컨텍스트의 이점
앞서 영속성 컨텍스트의 이점은 5가지가 존재한다고 하였습니다.
• 1차 캐시
• 동일성(identity) 보장
• 트랜잭션을 지원하는 쓰기 지연 (transactional write-behind)
• 변경 감지(Dirty Checking)
• 지연 로딩(Lazy Loading)
이번에는 영속성 컨텍스트의 두번째 이점인 동일성 보장에 대해 알아보도록 하겠습니다.
동일성 보장
java 컬렉션에서 값을 가져 올때 동일한 주소 값을 가져오듯이, 같은 reference를 불러오면 동일성을 보장해줍니다.
이는 1차 캐시가 존재하기 때문에 가능한 것입니다.
코드를 먼저 살펴보도록 하겠습니다.
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
// code
Member findMember1 = em.find(Member.class, 101L);
Member findMember2 = em.find(Member.class, 101L);
System.out.println("result = " + (findMember1 == findMember2));
tx.commit();
em.close();
emf.close();
}
}
101L 아이디를 가지는 Member 객체를 두번 조회를 하고, ==을 이용하여 각 객체의 동일성을 비교하였습니다.
출력 결과를 아래에서 살펴보도록 하겠습ㄴ디ㅏ.
조회 query가 날아가고, 두 객체의 동일성 비교 결과 true를 반환하는 것을 확인할 수 있습니다.
마치 우리가 자바 컬렉션에서 똑같은 객체를 꺼내는 것과 동일한 데, 이는 1차 캐시가 존재하기 때문에 가능한 것입니다.
1차 캐시로 반복 가능한 읽기 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공합니다.