본문 바로가기

Spring/Spring JPA

[JPA] 영속성 캐시(Persistence Context)

영속성에 대해 이해가 잘 안가서 다시 한 번 정리를 해봅니다.

 

영속성 캐시(Persistence Context)란?

영속성 캐시는 JPA의 핵심 개념 중 하나로, 엔티티 객체를 메모리 내에서 관리하는 엔티티 저장소입니다. 영속성 컨텍스트라고도 불리며, **EntityManager**를 통해 동작합니다. 이는 애플리케이션과 데이터베이스 간의 중간 계층 역할을 하며 성능을 최적화하고 데이터의 일관성을 유지합니다.

 

특징 및 작동 방식

1. 1차 캐시

  • 엔티티를 데이터베이스에서 가져오거나 저장할 때, EntityManager는 먼저 영속성 컨텍스트(1차 캐시)에 데이터를 저장합니다.
  • 동일한 트랜잭션 내에서 동일한 엔티티를 요청하면, 데이터베이스를 다시 조회하지 않고 캐시된 객체를 반환합니다.
  • 데이터베이스에 대한 불필요한 쿼리 실행을 줄이고 성능을 개선합니다.
EntityManager em = ...;
Member member1 = em.find(Member.class, 1L); // DB에서 조회 후 영속성 캐시에 저장
Member member2 = em.find(Member.class, 1L); // 캐시에서 조회
System.out.println(member1 == member2); // true

 

2. 변경 감지(Dirty Checking)

  • 영속성 컨텍스트에 관리되는 엔티티는 자동으로 변경 사항을 감지합니다.
  • 트랜잭션이 커밋될 때 변경된 데이터를 자동으로 데이터베이스에 반영합니다.
member.setName("New Name"); // 영속성 컨텍스트가 변경을 감지
em.getTransaction().commit(); // 변경된 내용이 DB에 반영

 

3. 쓰기 지연(Batch Writing)

  • persist를 호출하면, 엔티티는 영속성 컨텍스트에 저장되고 SQL INSERT 문은 즉시 실행되지 않습니다.
  • 트랜잭션 커밋 시점에 한꺼번에 SQL을 실행하여 성능을 최적화합니다.
Member member = new Member("John");
em.persist(member); // SQL 실행 안 함
em.getTransaction().commit(); // 이 시점에 INSERT SQL 실행

 

4.동일성 보장

  • 같은 영속성 컨텍스트 내에서는 동일한 엔티티 객체를 보장합니다.
  • 즉, em.find()로 조회한 동일 엔티티는 항상 같은 객체로 관리됩니다.

영속성 캐시의 한계

  1. 영속성 컨텍스트 범위
    • 영속성 캐시는 EntityManager의 생명주기 동안만 유효합니다.
    • EntityManager가 닫히거나 트랜잭션이 종료되면 캐시는 무효화됩니다.
  2. 2차 캐시와의 차이점
    • 영속성 캐시는 1차 캐시로 트랜잭션 범위 내에서만 사용됩니다.
    • JPA는 추가적으로 2차 캐시(Ehcache, Hazelcast 등)를 통해 애플리케이션 범위에서 캐시를 사용할 수 있습니다.

장점

  1. 성능 최적화
    • 데이터베이스 조회를 최소화합니다.
    • 동일한 트랜잭션 내에서 동일 엔티티를 재사용합니다.
  2. 데이터 일관성 유지
    • 동일한 엔티티는 항상 동일한 인스턴스로 관리됩니다.
    • 변경 감지를 통해 데이터베이스와의 동기화가 자동으로 이루어집니다.