영속성에 대해 이해가 잘 안가서 다시 한 번 정리를 해봅니다.
영속성 캐시(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()로 조회한 동일 엔티티는 항상 같은 객체로 관리됩니다.
영속성 캐시의 한계
- 영속성 컨텍스트 범위
- 영속성 캐시는 EntityManager의 생명주기 동안만 유효합니다.
- EntityManager가 닫히거나 트랜잭션이 종료되면 캐시는 무효화됩니다.
- 2차 캐시와의 차이점
- 영속성 캐시는 1차 캐시로 트랜잭션 범위 내에서만 사용됩니다.
- JPA는 추가적으로 2차 캐시(Ehcache, Hazelcast 등)를 통해 애플리케이션 범위에서 캐시를 사용할 수 있습니다.
장점
- 성능 최적화
- 데이터베이스 조회를 최소화합니다.
- 동일한 트랜잭션 내에서 동일 엔티티를 재사용합니다.
- 데이터 일관성 유지
- 동일한 엔티티는 항상 동일한 인스턴스로 관리됩니다.
- 변경 감지를 통해 데이터베이스와의 동기화가 자동으로 이루어집니다.
'Spring > Spring JPA' 카테고리의 다른 글
[JPA] @DynamicUpdate 간단히 (0) | 2024.12.26 |
---|---|
[JPA]Spring에서 트랜잭션 롤백(RuntimeException, Checked Exception) (1) | 2024.12.09 |
[JPA] generate-ddl과 ddl-auto 차이 (1) | 2024.12.04 |
[JPA] hibernate.ddl-auto (0) | 2024.12.04 |
[JPA] Spring JPA 관련 yml 설정의 주요 항목 (0) | 2024.12.04 |