[JPA] Dirty Checking 이란? (update)

BlackBean99·2022년 8월 21일
2

JPA

목록 보기
1/3

업데이트 쿼리를 작성하지 않아도 update 를 할 수 있는 방법이 있습니다.

EntityMenager를 DataJpa에서 사용을 하는데
실제로 코드를 보시면 별도로 데이터베이스에 save 하지 않습니다.

        EntityManager em = entityManagerFactory.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin(); //트랜잭션 시작
        Pay pay = em.find(Pay.class, id);
        pay.changeTradeNo(tradeNo); // 엔티티만 변경
        tx.commit(); //트랜잭션 커밋
  1. 트랜잭션이 시작되고
  2. 엔티티를 조회하고
  3. 엔티티의 값을 변경하고
  4. 트랜잭션을 커밋합니다.

엔티티 값이 변경되면 DirtyChecking을 합니다.

JPA에서 트랜젝션이 끝나는 시점에 변화가 있는 모든 엔티티를 DB에 반영해줍니다.
트랜젝션이 끝나는 시점에 Update Query르르 실행합니다.

이는 영속성 컨텍스트가 관리하는 엔티티만 적용됩니다.

다만 준영속/비영속 엔티티는 DirtyChecking을 하지 않습니다.

그렇다면 일부만 update하고 싶다면?

일부만 update

기본적으로 모든 필드를 update를 하는데 만약 테이블에 필드가 50개가 넘어간다면 매번 update를 전부 하는데는 어려움이 있습니다.

그래서 이럴 경우에는 @DynamicUpdate로 변경 필드만 반영하게 합니다.

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

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

    private long amount;

이런식으로 Entity를 선언해주면 일부만 바뀌어도 Update쿼리에 반영됩니다!

Reference : https://jojoldu.tistory.com/415?category=637935

profile
like_learning

0개의 댓글