[Spring/TIL] JPA Dirty Checking

Marryakirise·2024년 1월 8일
0

Spring/TIL

목록 보기
3/5

JPA Dirty Checking

  • 여기서 Dirty란, 부정적인 의미가 아닌 ‘상태의 변화가 생겼다’ 라는 의미로 해석
    Dirty Checking : 상태 변경 검사

  • 더티 체킹은 Transaction 안에서 엔티티의 변경이 일어나면, 변경 내용을 자동으로 데이터베이스에 반영하는 JPA 특징이다.

  • 그렇다면, 엔티티의 변경이 일어났을 때 데이터베이스에 변경 데이터를 저장하는 시점은 언제인가?

    1) Transaction commit 시점

    2) EntityManager flush 시점

    3) JPQL 사용 시점

  • 더티 체킹이 일어나기 위해서는 영속 상태(Managed)안에 있는 엔티티이여야하며, Transaction 안에서 엔티티를 변경하는 경우이여야 한다.

  • 다음과 같이 더티체킹이 일어나서 user의 업데이트에 대한 메서드를 호출하지 않았음에도 불구하고, Query가 발생됨

@Service
public class ExampleService {
     @Transactional
     public void updateInfo(Long id, String name) {
          User user = userRepository.findById(id);
          user.setName(name);
     }
}
  • 다음과 같은 예시가 있다.
public void updateInfo() { 
    User user = userRepository.findById(2L)
        .orElseThrow(() -> new ErrorCodeException(ErrorType.USER_IS_NOT_EXISTING));
    user.setEmail("hello@gmail.com");
    System.out.println(userRepository.existsByEmail("hello@gmail.com"));
}
  1. User table에서 PK id가 2인 User 엔티티 객체 조회
  2. User의 email을 hello@gmail.com으로 수정
  3. hello@gmail.com을 email로 가진 user 엔티티 유무 확인

@Transactional를 사용한 경우와 사용하지 않은 경우를 비교해보자.

  • @Transactional을 사용한 경우에는 2번에서 Dirty checking이 발동되며, 2번 과정에서 수정되었기에 true를 출력
  • @Transactional을 사용하지 않은 경우에는 2번 과정에서 수정되지 못해 false를 출력
    • 수정되지못한 내용을 반영하고 싶은 경우, 원하는 시점에 save, saveAndFlush를 사용

참고 자료

https://interconnection.tistory.com/121

profile
감자의 개발 일기

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN