본문 바로가기
JAVA & SPRING/JPA

JPA 기본편0 (영속성 관리, 영속성 컨텍스트 이점(1))

by 눈오는1월 2024. 2. 15.
728x90

본 내용은 인프런 김영한 강사님 JPA 기본 편 강의를 듣고 정리한 내용입니다.

https://www.inflearn.com/course/ORM-JPA-Basic

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런

JPA 를 공부하고 책을 보며 어려웠던 내용을 위주로 먼저 보았습니다. 옆에서 1:1 과외해주는 것 같이 생생하고 이해 잘되는 설명, 예제(코드)가 너무 좋았습니다. 어느 것 하나 애매함없이 모두

www.inflearn.com

 

JPA에서 가장 중요한 2가지(중요!)

  • 객체와 관계형 데이터베이스 매핑하기
  • 영속성 컨텍스트

영속성 컨텍스트란?

  • 영속성 컨텍스트는 논리적인 개념
  • 눈에 보이지 않는다.
  • 엔티니 매니저를 통해서 영속성 컨텍스트에 접근

* 굳이 풀어서 설명하면 엔티티를 여구 저장하는 환경이라는 뜻이다.

 

엔티티 생명주기

엔티티 생명주기

  • 비영속
  • 영속
  • 준영속
  • 삭제

비영속

- 영속성 컨텍스트랑 전혀 관계없는 상태 (객체만 만든 상태)

비영속 상태

영속

-영속성 컨텍스트에 관리되는 상태

영속 상태

    위 이미지처럼 Persist로 Entitymanager에 저장되어 관리되는 상태

준영속

-영속성 컨텍스트에서 분리된 상태

삭제

-말 그대로 삭제된 상태

 

 

영속성 컨텍스트의 이점

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

1차 캐시

엔티티매니저에 1차 캐시라고 불리는 저장 공간이 있는데 여기서 영속된 상태일 때 값이 캐시에 저장된다

즉, 디비에 쿼리를 보내기 전에 캐시에 있는 것을 바로 가져올 수 있다.

위 코드를 돌렸을 때 결과

위 코드처럼 em.persist(member); 를 하게 되면 엔티티매니저 내부에 1차캐시에 member가 저장된다 

그 후 findMember는 디비에서 조회하는 것이 아닌 1차 캐시에서 조회돼서 가져올 수 있다. 

(아래 결과를 find를 했지만 select 쿼리가 나가지 않는 것을 알 수 있다.)

만약 1차 캐시에 없으면 그때 디비에서 찾아서 가져온다.

 

1차 캐시를 강제로 비워두고 조회 한 코드
위 코드 실행 결과

em.flush() em.clear()는 나중에 다루겠지만 주석처리 되어있는 역할을 수행한다. 즉 여기서는 엔티티매니저에 있는 1차 캐시를 지우고 디비 쿼리를 commit()전에 미리 보낸다고 생각하면 된다. 

이렇게 했을 때 결과에서 보이는 것처럼 디비 쿼리가 먼저 나온 후에 출력이 진행되고, 이때는 1차 캐시에 조회되지 않아서 select 쿼리로 디비에서 조회해서 가져오는 것을 알 수 있다.

728x90