[ShowMyCNFT] 더티 체킹(dirty checking)

junghan·2023년 4월 10일
0

SpringBootProject

목록 보기
25/35
post-thumbnail

더티체킹이란?

더티 체킹(dirty checking)은 JPA에서 영속성 컨텍스트(Persistence Context)가 관리하는 엔티티 객체의 상태 변화를 감지하는 기능입니다. 영속성 컨텍스트는 엔티티 객체를 로딩하거나, 생성하거나, 변경사항을 추적하는 등의 역할을 합니다.
이때, 엔티티 객체의 상태 변화를 추적하여 변경 내용을 데이터베이스에 반영하는 것이 더티 체킹입니다.

더티 체킹은 다음과 같은 과정으로 동작합니다.

  1. 영속성 컨텍스트가 엔티티 객체를 로딩합니다.
  2. 엔티티 객체의 변경사항을 추적합니다. 이때, 변경사항은 엔티티 객체의 필드 값 변경, 컬렉션에 원소 추가/삭제 등이 포함됩니다.
  3. 트랜잭션을 커밋할 때, 영속성 컨텍스트는 변경사항을 데이터베이스에 반영합니다.

예를 들어보겠습니다.

@Transactional
 public Long update(Long id, PostsUpdateRequestDto requestDto) {

      Posts posts = postsRepository.findById(id)
            .orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id="+ id));

      posts.update(requestDto.getTitle(), requestDto.getContent()); //영속성 컨텍스트

      return id;

   }

posts.update(requestDto.getTitle(), requestDto.getContent()); 코드는 Posts 클래스에 정의된 update 메소드를 호출하게 됩니다.
이 메소드는 title과 content 필드를 인자로 받아서 해당 값을 사용해 Posts 객체의 상태를 변경합니다.
이때 변경된 상태는 영속성 컨텍스트에 저장되기 때문에, 이후에 postsRepository.save() 메소드를 호출하지 않고도 DB에 변경된 내용이 반영됩니다.

따라서, update 메소드를 호출하는 것만으로도 Posts 테이블의 값을 변경할 수 있습니다. 이때 @Transactional 어노테이션이 붙어있기 때문에, update 메소드 실행이 DB 트랜잭션 안에서 이루어지게 됩니다.
이후에 해당 트랜잭션은 메소드가 종료되면서 자동으로 커밋되기 때문에, 변경된 내용이 DB에 반영됩니다.

이를 통해 개발자는 직접 데이터베이스에 반영하는 로직을 작성하지 않아도 됩니다. 따라서 더티 체킹은 JPA에서 CRUD(Create, Read, Update, Delete) 작업을 수행하는 데 매우 유용한 기능입니다.

물론 당연히 이런 상태 변경 검사의 대상은 영속성 컨텍스트가 관리하는 엔티티에만 적용됩니다.

  • detach된 엔티티 (준영속)
  • DB에 반영되기 전 처음 생성된 엔티티 (비영속)

등 준영속/비영속 상태의 엔티티는 Dirty Checking 대상에 포함되지 않습니다.
즉, 이러한 대상들은 값을 변경해도 데이터베이스에 반영되지 않습니다.


https://jojoldu.tistory.com/415

profile
42seoul, blockchain, web 3.0

0개의 댓글