Persistence Context(영속성 컨텍스트)에 대하여

Timo·2022년 8월 15일
0

영속성 컨텍스트(Persistence Context)란 무엇인가?

JPA가 엔티티를 영구적으로 저장하기 위한 환경을 말한다. 엔티티 매니저 별로 영속성 컨텍스트를 가지고, 트랜잭션과 연관이 있다.

1차 캐시 역할

엔티티를 조회할 때에는 먼저 영속성 컨텍스트를 확인한다. 여기에 있으면 조회 SQL을 실행하지 않고, 이곳에서 반환한다. 없는 경우에는 조회 SQL을 실행해 영속성 컨텍스트 내부 1차 캐시 영역에 데이터를 보관한다. 이후에는 이 캐시 안에서 꺼내어 사용한다.

동일성 보장

SQL 조회를 통해 객체를 생성할 경우 매번 생성되는 객체가 다를 것이다. 하지만 영속성 컨텍스트를 내부에서는 엔티티의 ID 값을 기준으로 ID 값이 같다면 두 객체는 동등하다는 것을 보장해준다. (== 비교 성립)

변경 감지(Dirty Checking)

DB로부터 데이터를 조회해 영속성 컨텍스트 1차 캐시에 데이터(엔티티)를 보관할 때 스냅샷을 찍는다. 그리고 SQL이 플러시 되는 시점에 1차 캐시 데이터와 스냅샷 데이터를 비교한다. 달라진 게 있으면 UPDATE SQL을 생성하여 같이 실행한다. 변경된 내용을 감지하여 UPDATE SQL을 알아서 실행해주는 것이다.
추가 내용 출처

쓰기 지연

JPA에서는 persist() 메소드가 호출되어도 바로 SQL을 실행하지 않는다. flush() 되는 되는 시점에 SQL 구문을 DB로 보낸다.
추가 내용 출처

스프링에서 영속성 컨텍스트의 범위

JPA는 트랜잭션 단위로 영속성 컨텍스트가 부여되고 사용된다. 기본적으로 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다. 트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다. 그리고 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다.

EntityManager의 동시성 문제

스프링 프레임워크 안에서 EntityManager는 싱글톤으로 관리된다. 엔티티 매니저 내부의 영속성 컨텍스트는 DB의 트랜잭션 별로 관리되어야 하나 엔티티 매니저가 싱글톤이라면 다른 스레들 간에 공유될 수 있는 동시성 문제가 발생할 수 있다. 그러나 스프링 프레임워크는 엔티티 매니저에 가짜(아마도 프록시인듯) 엔티티매니저를 주입해두고, 이를 호출하면 현재 데이터베이스 트랜잭션과 관련된 실제 엔티티 매니저를 호출해 동시성 문제를 해결해준다고 한다.

참고 자료

profile
나는 매일 성장하는 사람

0개의 댓글