What we have to do is to be forever curiously
testing new opinions and courting new impressions

우리가 해야 할 일은 끊임없이 호기심을 갖고
새로운 생각을 시험해보고 새로운 인상을 받는 것

Dirty Checking에 대하여

  • Dirty Checking이란
  • @DynamicUpdate


Dirty Checking이란

정의

Dirty는 상태 변화가 생긴 것을 의미

즉, Dirty Checking은 상태 변경 검사를 의미

JPA에서는 트랜잭션이 끝나는 시점에,

영속성 컨텍스트가 관리하는 Entity들

스냅샷으로 만들어 둔 최초 조회 상태를 기준으로,

상태 변화(dirty)가 생긴 Entity 객체의 모든 필드

데이터베이스에 자동으로 반영

예시

@Slf4j
@RequiredArgsConstructor
@Service
public class PayService {

    public void updateNative(Long id, String tradeNo) {
        EntityManager em = entityManagerFactory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin(); //트랜잭션 시작
        Pay pay = em.find(Pay.class, id);
        pay.changeTradeNo(tradeNo); // 엔티티만 변경
        tx.commit(); //트랜잭션 커밋
    }
}

데이터베이스에 update 쿼리를 전송하는 코드 없음

dirty-checking

변경 사항을 저장하지 않았음에도 update 쿼리가 실행


@DynamicUpdate

정의

필드가 늘어날 수록 전체 필드 Update 쿼리는 비효율적

→ @DynamicUpdate를 엔티티에 사용하여 dirty 필드만 Update 반영

예시

@Getter
@NoArgsConstructor
@Entity
@DynamicUpdate // 변경한 필드만 대응
public class Pay {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String tradeNo;
    private long amount;
}

dynamic-update

변경분 (trade_no)만 Update 쿼리에 반영된 것을 확인


댓글남기기