**Dirty Checking(더티 체킹)**은 객체의 상태 변화를 감지하여 데이터베이스에 반영하는 메커니즘으로, 주로 ORM(Object-Relational Mapping) 프레임워크에서 사용됩니다. 이 기법은 애플리케이션의 객체(엔티티)가 변경되었는지 자동으로 추적하고, 변경된 내용을 데이터베이스에 반영하여 일관성을 유지하는 데 도움을 줍니다.
1. Dirty Checking의 동작 방식
- 객체 로드: 애플리케이션에서 데이터베이스로부터 엔티티를 로드합니다. 이 시점에서 ORM 프레임워크는 로드된 객체의 상태를 기록해 둡니다.
- 상태 추적: 엔티티의 상태가 변경되는지 감시합니다. 예를 들어, 엔티티의 필드 값이 변경되면 ORM 프레임워크는 이를 감지합니다.
- 변경 감지: 트랜잭션이 커밋되거나 세션이 종료되기 전에, ORM 프레임워크는 엔티티의 초기 상태와 현재 상태를 비교합니다. 이 과정에서 변경된 필드가 있는지 확인합니다.
- 변경 사항 반영: 만약 엔티티에 변경이 감지되면, ORM 프레임워크는 자동으로 변경된 필드를 데이터베이스에 반영하는 SQL
UPDATE쿼리를 생성하여 실행합니다. 이 과정이 "dirty checking"입니다.
2. Dirty Checking의 장점
- 자동화된 업데이트: 개발자가 수동으로 객체의 변경 여부를 추적하거나, 직접 데이터베이스 업데이트 쿼리를 작성할 필요가 없습니다. ORM 프레임워크가 이를 자동으로 처리합니다.
- 효율성: 변경된 필드만을 업데이트하기 때문에, 불필요한 전체 업데이트를 피하고, 데이터베이스에 대한 부담을 줄입니다.
- 데이터 일관성: 데이터베이스와 애플리케이션 간의 데이터 일관성을 유지할 수 있습니다. 애플리케이션의 상태 변화가 데이터베이스에 적절히 반영되기 때문에 데이터가 동기화된 상태로 유지됩니다.
3. Dirty Checking의 단점
- 추가적인 리소스 소모: 엔티티의 초기 상태와 현재 상태를 비교해야 하므로, 성능에 약간의 부하가 발생할 수 있습니다. 특히, 많은 수의 엔티티가 로드된 경우 성능 이슈가 생길 수 있습니다.
- 잠재적인 버그: 개발자가 객체의 상태를 명확하게 이해하지 못하면, 예상하지 못한 업데이트가 발생할 수 있습니다. 예를 들어, 불필요한 객체 변경이 발생하면, 이는 원하지 않는 데이터베이스 업데이트로 이어질 수 있습니다.
4. Dirty Checking의 활용 예시
대부분의 현대적인 ORM 프레임워크(예: Hibernate, JPA)에서 Dirty Checking은 기본 기능으로 제공됩니다. 예를 들어, Hibernate에서는 엔티티가 변경되면
@Entity 클래스의 필드가 Dirty Checking을 통해 감지되고, 트랜잭션이 커밋될 때 변경 사항이 자동으로 데이터베이스에 반영됩니다.예시 - update 쿼리문을 사용하지 않고 데이터를 수정하기
@Transactional
public void 게시글수정(int id, BoardRequest.UpdateDTO updateDTO, User sessionUser) {
// 1. 게시글 조회 (없으면 404)
Board board = boardRepository.findById(id);
// 2. 권한체크
if(board.getUser().getId() != sessionUser.getId()){
throw new Exception403("게시글을 수정할 권한이 없습니다");
}
// 3. 게시글 수정
board.setTitle(updateDTO.getTitle());
board.setContent(updateDTO.getContent());
} // Transactional이 종료되면서 flush() 자동 호출됨(더티체킹)결론
Dirty Checking은 객체 상태의 변화를 자동으로 감지하여 데이터베이스에 반영하는 강력한 메커니즘입니다. 이를 통해 데이터베이스와 애플리케이션 간의 데이터 일관성을 유지하고, 개발자가 객체의 상태를 일일이 추적하지 않아도 되므로, 애플리케이션의 복잡성을 줄이고, 유지보수성을 높이는 데 큰 도움이 됩니다.
Share article