Backend
home
⚠️

Spring 업데이트 시 Dirty Checking을 활용해야 하는 이유

생성 일시
2025/02/23 11:07
태그
SpringBoot
게시일
2025/02/23
최종 편집 일시
2025/02/23 11:14

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
복사
Dirty Checking 사용 시 변경된 필드만 업데이트
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에 반영되므로
서비스 계층에서 비즈니스 로직을 객체 중심으로 개발할 수 있음
DB 쿼리에 의존하는 코드 작성이 줄어듦
도메인 모델 중심의 개발이 가능해짐