본문 바로가기
Back-End/JPA

JPA) 1차 캐시

by 어렵다어려웡 2022. 3. 11.

영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시 라고 한다.

영속 상태 엔티티는 모두 이곳에 저장된다.

 

쉽게 이야기 하면 영속성 컨텍스트 내부에 Map으로 된 컬렉션이 있는데

이곳에 id를 식별자로 하는 엔티티 인스턴스가 저장된다.

 

Member member = new Member();
member.setId("member1");
member.setUsername("회원1");

em.persist(member);

 

 

1차 캐시의 키는 식별자 값이다. 그리고 식별자 값은 DB의 기본 키와 매핑되어있다.

따라서 영속성 컨텍스트에 데이터를 저장하고 조회하는 모든 기준은 DB 기본 키값이다.

1차 캐시에서 조회

em.find() 를 호출 하면 우선 1차 캐시에서 식별자 값으로 엔티티를 찾는다.

 

만약 엔티티가 있으면 1차캐시(메모리)에서 그 인스턴스를 가져오고 아니라면

DB를 조회해서 엔티티를 생성하고 그 값을 1차 캐시에 캐싱한다.

 

 

영속성 컨텍스트는 1차 캐시에 회원 엔티티를 저장하면서 동시에 SQL을 만들어서 쓰기 지연 저장소에 보관을한다.

이후 트랜잭션 커밋을 하면 플러시가 호출되어서 쓰기지연 저장소에 보관된 SQL을 DB에 전달하게 되고

동기화를 하게 된다.

 

쓰기 지연이 가능한 이유

여러개의 트랜잭션을 커밋하면 함께 저장되고 롤백할때도 같이 된다.

등록 쿼리를 그떄그때 전달하던 한번에 전달하던 커밋을 하지 않는다면

소용이 없다. 어떻게든 커밋을 하기 직전에 SQL을 전달하기만 한다면 상관이 없다.

'Back-End > JPA' 카테고리의 다른 글

JPA) 변경 감지 (Dirty Check)  (0) 2022.03.11
JPA) 영속성 컨텍스트 개념 및 특징  (0) 2022.03.11
JPA) EM, EMF  (0) 2022.03.11
JPA란?  (0) 2022.03.11
QueryDsl 설정하기 ( Gradle 5.0 이상 )  (0) 2022.03.11