JPA에서 변경 감지(Dirty Checking) 기능을구현하기 위해 사용하는 내부 메커니즘 중 하나
엔티티의 초기상태를 복사하여 저장한값을 의미, 이를 통해 엔티티 객체의 변경 여부를 감지할 수 있음
스냅샷이 필요한 이유
JPA는 데이터베이스와 객체 간 동기화를 위해 엔티티의 변경 여부를 확인해야 한다
이를 위해 엔티티가 영속성 컨텍스트에 저장될때 스냅샷을 만들어 초기 상태를 기록한다
트랜잭션이 커밋되거나 flush()가 호출될때 현재 엔티티의 상태와 스냅샷을 비교하여 변경사항이 있는지 판단한다
스냅샷 작동 방식
1. 엔티티 영속 상태로 전환
- em.persist() 를 호출하거나 데이터베이스에서 조회하여 엔티티가 영속성 컨텍스트에 저장되면, 스냅샷이 생성된다
- 스냅샷은 엔티티의 초기 상태를 복사하여 저장한 데이터
2. 변경사항 감지
- 트랜잭션 도중 엔티티의 속성을 변경하면, JPA는 엔티티의 현재 상태와 스냅샷을 비교한다
- 두 상태가 다르면 변경된것으로 간주하고 Dirty Checking 이 발생한다
3. 데이터베이스 업데이트
- 트랜잭션 커밋시 변강사항이 있는 엔티티에 대해 UPDATE SQL이 생성되고 실행된다
예시
@Entity
public class Member {
@Id @GeneratedValue
private Long id;
private String name;
private int age;
// Getter, Setter, 기본 생성자
}
// 엔티티 매니저를 통해 엔티티 관리
Member member = em.find(Member.class, 1L); // 영속 상태로 관리
member.setName("New Name"); // 엔티티 속성 변경
// 트랜잭션 커밋 또는 flush() 시
// 1. 스냅샷(초기 상태)과 엔티티의 현재 상태 비교
// 2. 변경 사항("name" 속성)이 있으면 UPDATE 쿼리 실행
em.flush();
- 스냅샷 생성 : em.find()로 엔티티를 조회할때, 초기값("name = Old Name", "age = 30")이 스냅샷에 저장됨
- 변경 사항 비교 : setName("New Name") 호출 후, 스냅샷과 현재 상태를 비교하여 변경 사항을 감지
- 쿼리 생성 : 변경 사항이 있는 경우, UPDATE SQL 생성 및 실행
스냅샷의 장점
1. 자동 변경 감지
- 개발자가 명시적으로 변경 사항을 알리지 않아도, 엔티티의 변경을 자동으로 추적
2. 효율적인 SQL 실행
- 변경된 데이터에 대해서만 SQL이 생성되고 실행되어 성능을 최적화
3. 객체와 데이터베이스 간 일관성 유지
- 영속성 컨텍스트를 통해 객체의 변경 상태가 데이터베이스와 동기화됨
스냅샷의 단점 및 주의 사항
1. 메모리 사용량 증가
- 스냅샷은 엔티티의 초기 상태를 메모리에 저장하므로, 많은 엔티티를 관리하면 메모리 사용량이 증가할 수 있음
2. 큰 엔티티 관리 시 성능 저하
- 엔티티가 많은 속성을 가진 경우, 상태 비교 작업이 성능에 영향을 미칠 수 있음
3. 변경 감지의 한계
- 컬렉션(예: List, Set) 변경은 즉시 감지되지 않으며, @ElementCollection이나 관계 매핑(예: OneToMany)의 변경은 추가 작업이 필요
정리
1. 스냅샷이란?
- 엔티티의 초기 상태를 저장한 데이터
- 변경 감지(Dirty Checking) 기능을 지원하기 위한 메커니즘
2. 역할
- 엔티티의 현재 상태와 초기 상태를 비교하여 변경 사항을 감지
- 변경된 엔티티에 대해 데이터베이스 작업(SQL)을 실행
3. 장점
- 변경 사항 자동 감지
- 효율적인 데이터베이스 동기화
4. 단점
- 메모리 사용량 증가
- 속성 비교 비용 증가
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
[Spring Boot] Page (0) | 2024.12.27 |
---|---|
[Spring Boot, Java] Cascade (0) | 2024.12.26 |
[Spring Boot, JPA] 영속성 컨텍스트 (0) | 2024.12.24 |
[Spring Boot] @ManyToOne, @OneToMany (1) | 2024.12.22 |
[Spring Boot] Eager, Lazy (0) | 2024.12.21 |