🔍 더티 체킹이란?
- 엔티티 객체의 변경을 자동으로 감지하고 DB에 반영해주는 기능
- JPA가 영속성 컨텍스트에서 관리 중인 엔티티의 변경 사항을 추적
✅ 동작 원리
- 트랜잭션 내에서 엔티티를 조회 (영속 상태)
- 엔티티의 필드 값을 변경
- 트랜잭션 커밋 시점에 스냅샷(초기 상태)과 비교
- 값이 달라졌다면
UPDATE SQL 자동 생성
✅ 주의사항
- 반드시 트랜잭션 범위 안에서만 더티 체킹이 동작함 (
@Transactional 필요)
- 영속 상태가 아닌 객체(Detached 상태)는 변경해도 반영되지 않음
- 실수로 트랜잭션 밖에서 수정하면 UPDATE가 발생하지 않음
- 즉시 반영이 아닌
flush() 또는 커밋 시점에 쿼리 실행
💻 코드 예제로 보기
@Transactional
public void updateMember(Long id, String newName) {
Member member = memberRepository.findById(id).orElseThrow();
member.changeName(newName);
}
save()나 update()를 직접 호출하지 않아도 됨
- 트랜잭션 커밋 시점에
UPDATE member SET name=? WHERE id=? 쿼리가 자동 발생