25. 더티 체킹(Dirty Checking)

강재영's avatar
Aug 27, 2024
25. 더티 체킹(Dirty Checking)
 
💡
더티 체킹은 JPA나 Hibernate와 같은 ORM 프레임워크에서 제공하는 기능으로, 엔티티가 영속성 컨텍스트에 의해 관리되는 동안 엔티티의 상태가 변경되었는지를 감지하는 메커니즘입니다.
 

예시코드

@RequiredArgsConstructor @Service public class BoardService { private final BoardRepository boardRepository; //트렌젝션 종류시 변경을 감지해서 flush한다. 더티체킹 @Transactional public void 게시글수정(int id, BoardRequest.UpdateDTO updateDTO, User sessionUser) { // 1. 게시글 조회(없으면 404) Board board = boardRepository.findById(id); if (board == null) { throw new Exception404("존재하지 않는 게시글 입니다."); } // 2. 권한체크 if (board.getUser().getId() != sessionUser.getId()) { throw new Exception403("게시글을 수정할 권한이 업습니다."); } // 3. 게시글 수정 board.setTitle(updateDTO.getTitle()); board.setContent(updateDTO.getContent()); }
따로 쿼리에 update메서드를 호출 안해도
 
board.setTitle(updateDTO.getTitle()); board.setContent(updateDTO.getContent());
@Transactional에 의해 관리되는 메서드가 끝나고 트랜잭션이 종료될 때, JPA는 영속성 컨텍스트에 의해 관리되는데 관리되고 있는 객체를 set을 통해 바꾸기만해도 자동으로 트랜잭션 종류시 flush를 해주고 커밋된다.
 

테스트

@Test public void updateByIdV2_test() { //given int id = 1; Board board = boardRepository.findById(id); //when board.setTitle("제목수정10"); board.setContent("내용수정10"); //트랜잭셕이 종류되면 flush()가 자동으로 실행 System.out.println("-------------"); em.flush(); System.out.println("222222222222"); }
em.flush()의 명시적 호출: 테스트 환경에서 트랜잭션 종료 시점이 명확하지 않거나 자동으로 롤백될 가능성이 있기 때문에, 중간에 flush()를 호출하여 더티 체킹으로 인한 변경 사항이 데이터베이스에 반영되었는지 확인합니다.

요약

  • 더티 체킹(Dirty Checking): 영속성 컨텍스트에서 관리되는 엔티티의 상태 변화를 자동으로 감지하고, 트랜잭션이 종료될 때 데이터베이스에 반영하는 기능입니다.
  • 트랜잭션 종료 시 플러시(Flush): @Transactional에 의해 관리되는 메서드가 끝날 때, JPA는 더티 체킹을 통해 엔티티의 변경 사항을 자동으로 flush()하여 데이터베이스에 저장합니다.
  • 개발자가 명시적으로 save()update()를 호출하지 않아도 엔티티의 변경 사항이 자동으로 처리됩니다.
    이 메커니즘 덕분에 JPA를 사용하면 엔티티의 상태를 직관적으로 관리할 수 있으며, 데이터베이스와의 동기화를 효율적으로 처리할 수 있습니다.
    Share article

    강재영 블로그