JPA 영속성 컨텍스트 - 조회

Daniel6364·2022년 8월 2일
0

영속성 컨텍스트의 특징

  • 영속성 컨텍스트와 식별자 값

    • 엔티티를 식별자값으로 구분 (@Id로 테이블의 기본 키와 매핑한 값)
    • 영속 상태는 식별자 값이 반드시 있어야 함. (없으면 예외 발생)
  • 영속성 컨텍스트와 데이터베이스 저장

    • 영속성 컨텍스트에 엔티티를 저장하면 JPA는 보통 트랜잭션을 커밋하는 순간 데이터베이스에 반영 - flush
  • 영속성 컨텍스트가 엔티티를 관리할 때의 장점

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

엔티티 조회

  • 영속성 컨텍스트는 내부에 캐시를 가지고 있음 - 1차 캐시
  • 영속 상태의 엔티티는 모두 이곳에 저장
  • 영속성 컨텍스트 내부에 Map이 하나 있는데
    • key@Id로 매핑한 식별자고
    • value는 엔티티 인스턴스
// 엔티티를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

//엔티티를 영속
em.persist(member);
  • 1차 캐시에 회원 엔티티를 저장. 회원 엔티티는 아직 데이터베이스에 저장되지 않았다.
  • 1차 캐시의 key는 식별자 값.
  • 식별자 값은 데이터베이스 기본 키와 매핑.
  • 따라서 영속성 컨텍스트에 데이터를 저장/조회하는 모든 기준은 데이터베이스 기본 키 값.
Member member = em.fin(Member.class, "member1");
// 첫 번째 파라미터는 엔티티 클래스 타입
// 두 번째는 조회할 엔티티의 식별자 값

1차 캐시에서 조회

  • em.find()를 호출하면 먼저 1차 캐시에서 엔티티를 찾고
  • 1차 캐시에 없으면 데이터베이스에서 조회한다.
// 다음 코드는 1차 캐시에 있는 엔티티를 조회
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

//엔티티를 영속
em.persist(member);

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

데이터베이스에서 조회

  • em.find()를 호출했는데 1차 캐시에 없으면
  • 엔티티 매니저는 데이터베이스를 조회해서 엔티티를 생성
  • 그리고 1차 캐시에 저장한 후 영속 상태의 엔티티를 반환
Member findMember2 = em.find(Member.class, "member2"); 

1차 캐시에 없어 데이터베이스 조회

1. em.find(Member.class, "member2") 실행
2. member2가 1차 캐시에 없으므로 데이터베이스에서 조회
3. 조회한 데이터로 member2 엔티티를 생성, 1차 캐시에 저장(영속 상태)
4. 조회한 엔티티를 반환
5. 결과적으로 member1, member2 엔티티 인스턴스는 1차 캐시에 있다.
6. 따라서 이 엔티티들을 조회하면 메모리에 있는 1차 캐시에서 바로 불러온다. (성능상 이점이 있다)

영속 엔티티듸 동일성 보장

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

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

→ 1차 캐시에 있는 같은 엔티티 인스턴스를 반환하기 때문에 a == b 는 true
영속성 컨텍스트는 성능상 이점과 엔티티의 동일성을 보장

profile
The Office Lover

0개의 댓글