1. 코드의 간결성과 유지보수성 향상
만약 Dirty Checking을 활용하지 않는다면, 엔티티의 변경 사항을 반영하기 위해 직접 UPDATE 쿼리를 작성해야 합니다.
@Modifying
@Query("UPDATE User u SET u.name = :name, u.email = :email, u.age = :age WHERE u.id = :id")
void updateUser(@Param("id") Long id, @Param("name") String name, @Param("email") String email, @Param("age") int age);
Java
복사
public class Study {
public void updateStudy(String title, String description) {
this.title = title;
this.description = description;
}
}
Java
복사
@Override
@Transactional
public StudyUpdateResponse updateStudy(User user, Long id,
StudyUpdateRequest studyUpdateRequest) {
Study study = getStudy(id);
checkUserRole(study.getId(), user);
study.updateStudy(studyUpdateRequest.getTitle(), studyUpdateRequest.getDescription());
return StudyUpdateResponse.builder()
.id(study.getId())
.title(study.getTitle())
.description(study.getDescription())
.build();
}
Java
복사
2. 트랜잭션과 함께 안전한 일괄 업데이트 가능
Dirty Checking은 트랜잭션과 결합하여 여러 개의 업데이트를 일괄적으로 처리할 수 있습니다.
@Transactional
public void updateUserAndOrder(Long userId, String newName, Long orderId, String newStatus) {
User user = userRepository.findById(userId).orElseThrow();
user.setName(newName); // 변경 감지
Order order = orderRepository.findById(orderId).orElseThrow();
order.setStatus(newStatus); // 변경 감지
}
Java
복사
•
하나의 트랜잭션에서 User와 Order 객체의 변경 사항을 감지하여 한 번에 UPDATE 쿼리 실행
•
만약 중간에 예외가 발생하면 자동으로 롤백되어 데이터 일관성 유지
•
여러 개의 UPDATE가 실행되는 경우에도 JPA의 최적화 기능을 활용하여 성능을 향상
3. 객체 지향적인 개발 방식 유지
Dirty Checking을 사용하면 객체의 상태 변경을 통해 DB의 상태를 반영하는 객체 지향적인 개발 방식을 유지할 수 있습니다.
•
서비스 계층에서 비즈니스 로직을 객체 중심으로 개발할 수 있음
•
DB 쿼리에 의존하는 코드 작성이 줄어듦
•
도메인 모델 중심의 개발이 가능해짐