변경 감지는 영속성 컨텍스트가 관리하는 엔티티의 값이 변경되었는지 확인하고, 수정 SQL을 자동으로 생성하는 기능입니다. 따라서 영속 상태의 엔티티는 값을 변경한 뒤 별도의 update()나 save()를 호출하지 않아도 트랜잭션 커밋 시 데이터베이스에 반영됩니다.

엔티티가 영속성 컨텍스트에 들어오면 JPA 구현체는 일반적으로 최초 상태를 스냅샷으로 보관합니다. 플러시가 발생하면 현재 엔티티의 상태와 스냅샷을 비교하고, 변경된 엔티티가 있으면 UPDATE SQL을 쓰기 지연 저장소에 등록한 뒤 데이터베이스에 실행합니다. 플러시는 보통 트랜잭션 커밋 직전이나 JPQL 실행 전에 발생합니다.

변경 감지는 영속 상태의 엔티티에만 적용됩니다. 준영속 또는 비영속 엔티티의 값을 바꿔도 자동으로 반영되지 않으며, JPQL 벌크 연산은 영속성 컨텍스트를 거치지 않고 데이터베이스를 직접 수정하므로 변경 감지와 별개로 동작합니다.

@Transactional
public void changeName(Long memberId, String name) {
    Member member = entityManager.find(Member.class, memberId);
    member.changeName(name);
    // 커밋 시 변경 감지로 UPDATE SQL 실행
}
  • @DynamicUpdate