스프링

[JPA] 영속성 관리[2]

zumsim 2024. 11. 26. 22:29
728x90
반응형
영속성 컨텍스트의 특징

 

1. 영속성 컨텍스트는 엔티티를 식별자 값(@Id)으로 구분한다.

    따라서 영속 상태는 식별자 값이 반드시 있어야 한다.

2. 영속성 컨텍스트에 엔티티를 저장하면 JPA는 트랜잭션을 커밋하는 순간 엔티티를 데이터베이스에 반영하며, 이것을 플러시(flush)라 한다.

3. 영속성 컨텍스트가 엔티티를 관리하면 다음과 같은 장점이 있다.

  • 1차 캐시
  • 동일성 보장
  • 트랜잭션을 지원하는 쓰기 지연
  • 변경 감지
  • 지연 로딩

 

엔티티 조회

 

영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시라 한다. 영속 상태의 엔티티는 모두 이곳에 저장된다.

1차 캐시의 키는 식별자 값(@Id)이고 이 값은 데이터베이스 기본 키와 매핑되어 있다.

ex) Member member = em.find(Member.class, "member1")
find() 메소드의 첫 번째 파라미터는 엔티티 클래스의 타입이고, 두 번째는 식별자 값이다.
find()를 호출하면 먼저 1차 캐시에 해당 키 값의 데이터가 있는지 찾아보고 없으면 데이터베이스에서 조회한다.

 

영속 엔티티의 동일성 보장

 

다음 코드를 통해 식별자가 같은 엔티티 인스턴스를 조회해서 비교해보자.

Member a = em.find(Member.class, "member1");
Member b = em.find(Member.class, "member1");
System.out.println(a == b); // 동일성 비교

 

앞에서 말했듯 첫 번째 find()를 호출할 때 1차 캐시에 없다면 데이터베이스에서 조회하여 가져오고, 두 번째 find()를 호출하면 1차 캐시에 있는 인스턴스를 반환한다. 따라서 같은 인스턴스이기에 a==b는 당연히 참이다.

 

동일성과 동등성
- 동일성(identity) :실제 인스턴스가 같다. 따라서 참조 값을 비교하는 == 비교의 값이 같다.
- 동등성(equality) : 실제 인스턴스는 다를 수 있지만 인스턴스가 가지고 있는 값이 같다. ex) 자바의 equal() 메소드

 

728x90
반응형