[TIL #7] 항해99 2023.02.12

강민규·2023년 2월 12일
0
post-thumbnail

Spring Data JPA와 같은 ORM 구현체에 대한 자료를 보거나 다루게 되다 보면
더티체킹이라는 단어를 종종 듣게 됩니다.

Dirty : 변경을 감지
Checking : 검사

이라는 뜻으로 조합하여 본다면 변경을 감지한다고 생각하고 접근하면 될것 같습니다.

🤔 더티 체킹(Dirty Checking) ?

Spring Data JPA와 같은 ORM 구현체를 다루다 보면 자주 등장하는 용어입니다.

JPA(Java Persistence API) 를 사용하면서 더티체킹과 트랜잭션의 관계에 대해서 알고 있지 않으면, 비즈니스 로직에서 다루는 엔티티 데이터가 꼬이는 경우가 발생하게 됩니다.

데이터가 꼬이는 경우를 방지하려면,
더티체킹(Dirty Cheking)이 어떤 상황에 사용이 되고 있는지 이해할 필요가 있어 준비하였습니다.

더티 체킹이 발생하는 상황

  • JPA는 엔티티 매니저가 엔티티를 저장/조회/수정/삭제를 합니다.
    : 그런데 엔티티 매니저가 지원하는 메서드를 찾아보면
    저장(persist) / 조회(find) / 수정(update) / 삭제(delete) 로 해당하는 메서드는 찾아볼 수 없습니다.

대신에 수정에 해당하는 더티체킹을 지원합니다.

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

  • 데이터베이스에 커밋 되는 데이터를 저장하는 시점은 아래의 3가지 케이스입니다.
  1. Transaction commit 시점
    2) EntityManager flush 시점
    3) JPQL 사용 시점
  • 또한, 영속성 컨텍스트(Persistence Context) 안에 있는 엔티티를 대상으로
    더티체킹이 일어납니다.

더티 채킹이 발생할때 충족되어야 하는 조건은 아래 두가지 조건이 있습니다
1. 영속 상태(Managed) 안에 있는 엔티티인 경우
2. Transaction 안에서 엔티티를 커밋 하는 경우

그리고 Transaction은 두 가지 방식으로 사용할 수 있습니다

  1. Service Layer 에서 @Transactional 어노테이션을 사용하는 경우
  2. EntityTransaction을 이용해서 트랜잭션의 범위를 지정하고 사용하는 경우

0개의 댓글