Backend
home
⚠️

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

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

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 쿼리에 의존하는 코드 작성이 줄어듦
•
도메인 모델 중심의 개발이 가능해짐