더티 체킹은 트랜잭션 안에서 엔티티(Entity)의 변경이 일어났을 때, 변경된 내용을 자동으로 데이터베이스에 반영하는 것이다. JPA를 사용하면, 더티 체킹이라는 용어를 자주 듣게 된다. 이 개념이 무엇인지 간단히 알아보자.
더티 체킹은 Entity
에서 변경된 부분을 감지하여, 그 내용을 데이터베이스에 반영하는 것을 말한다. 더티 체킹을 통해 개발자는 명시적인 update
쿼리를 작성하지 않아도 된다. 이를 통해 코드의 간결성과 유지보수성을 높일 수 있다.
@Transactional
public void cancelOrder(Long orderId) {
// 주문 엔티티 조회
Order order = orderRepository.findOne(orderId);
// 주문 취소
order.cancel();
}
위의 cancelOrder
메소드를 보면, 주문 취소 로직이 실행되지만, update
쿼리는 없다. 그러나 JPA에서는 트랜잭션이 끝나는 시점에 데이터베이스에 변경된 내용이 반영된다.
orderId
로 주문 Entity
조회Entity
의 주문 상태를 취소로 변경트랜잭션이 끝나는 시점에 JPA는 해당 엔티티의 상태 변화를 감지하고, 변경된 내용을 데이터베이스에 update
쿼리로 반영해준다. 이를 더티 체킹이라고 한다.
Entity
조회update
쿼리 전달여기서 주의할 점은 더티 체킹은 영속성 컨텍스트가 관리하는 엔티티에만 적용된다는 것이다. 준영속, 비영속 상태의 엔티티는 값이 변경되어도 데이터베이스에 반영되지 않는다.
기본적으로 더티 체킹은 엔티티의 모든 필드를 update
쿼리로 전달한다. 하지만 필드가 많아지면 비효율적일 수 있다. 이때 @DynamicUpdate
를 사용하면, 변경된 필드만 반영되도록 할 수 있다.
@Getter
@NoArgsConstructor
@Entity
@DynamicUpdate
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String product;
public void cancel() {
// 주문 취소 로직
}
}
위 코드에서 @DynamicUpdate
어노테이션을 사용하면, cancel()
메소드로 인해 변경된 필드만 update
쿼리로 반영된다.
더티 체킹은 JPA가 제공하는 강력한 기능 중 하나로, 명시적인 쿼리 없이 엔티티의 변경 사항을 자동으로 데이터베이스에 반영해준다. 이를 통해 코드의 간결함과 유지보수성을 높일 수 있으며, @DynamicUpdate와 같은 기능을 통해 성능을 더욱 최적화할 수 있다.