[JPA] 영속성 컨텍스트 , 1차 캐시, 2차 캐시

김정연·2024년 4월 10일

자바orm표준JPA

목록 보기
2/2
post-thumbnail

1차 캐시, 2차 캐시에 대해 알아보는 내용

영속성 컨텍스트

  • 식별자 값
    영속성 컨텍스트는 엔티티를 식별자값으로 구분한다. 그래서 영속상태는 무조건 pk가 있어야 한다.
  • 데이터베이스 저장
    JPA는 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된다. 이것을 flush라고 한다.
  • 장점
    1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 변경 감지, 지연 로딩

1차캐시

영속성 내부에는 캐시를 가지고 있는데 이것을 1차 캐시라고 한다. 엔티티 매니저로 조회하거나 변경하는 모든 것은 1차 캐시에 저장된다. 그리고 트랜잭션을 커밋하거나 플러시를 호출하면 그 때 1차 캐시에 있는 내용을 데이터 베이스에 동기화 한다.

예를 들어 find 메서드를 쓸 때 1차캐시에서 객체를 찾는데 동일한 트랜잭션 내에서만 1차캐시가 존재하기 때문에 이미 1차캐시안에 있는 것을 조회하는 것은 흔치 않다.

2차 캐시

2차 캐시는 공유캐시라 불리는데 애플리케이션이 종료될 때까지 유지된다. 데이터를 조회할 때 1차캐시에서 찾고 없으면 2차캐시로 가고 그래도 없으면 데이터베이스에서 찾는다. 2차 캐시를 잘 활용하면 데이터 베이스 조회 횟수를 획기적으로 줄일 수 있다.

만약 2차 캐시에 찾는 값이 있다면 객체의 복사본을 만들어반환한다. 왜냐하면 그 객체를 동시에 수정하는 문제가 발생할 수 있음을 미리 방지하는 것이다.

플러시

플러시(flush())는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다. 플러시를 실행하면 변경 감지가 동작해서 영속성 컨텍스트에 있는 엔티티와 스냅샷을 비교해서 수정된 엔티티를 찾아낸다. 그리고 수정쿼리를 작성한다.
또한 쓰기 지연 SQL 저장소의 쿼리도 데이터 베이스로 전송한다.

영속성 컨텍스트를 플러시 하는 방법

  • em.flush() 호출
  • 트랜잭션 커밋 시
    데이터 베이스에 변경 내용을 SQL로 전달하지 않고 트랜잭션만 커밋하면 반영되지 않으므로 플러시를 호출해서 데이터 베이스에 반영해야 한다.
  • JPQl 쿼리 실행 시
profile
백엔드 개발자

0개의 댓글