[JPA] Update 쿼리 개선

김상현·2022년 12월 19일
0

JPA

목록 보기
1/3
post-thumbnail

📍 서비스 기능 개선사항

📌 MEMBER INFO 페이지

  • 로그인 고객의 개인 정보를 확인할 수 있는 MEMBER INFO 페이지는 고객의 개인정보를 수정할 수 있는 기능이 존재한다.
  • 고객의 이름 정보에 해당하는 Name 속성의 값을 수정한 후 수정하기 버튼을 클릭했을 때 발생하는 쿼리에서 개선해야할 점을 발견하였다.

📌 업데이트 쿼리

  • Member Entity의 속성 중 username에 해당하는 값만 변경하였지만 결과는 모든 필드를 업데이트하는 쿼리가 발생했다.
  • 변경되지 않은 필드의 값을 업데이트하는 것은 리소스 낭비이기 때문에 문제를 개선하기 위해 구글링을 시작했다.

📍 기능 개선 과정

  • JPA에서는 Entity가 영속 상태이면 영속성 컨텍스트가 Entity를 관리한다.
  • 만약 Entity의 수정사항이 발생한다면 영속성 컨텍스트가 더티 체킹(Dirty Checking)을 통해 Entity를 관리한다.
  • JPA에서 더티 체킹(Dirty Checking)으로 생성되는 업데이트 쿼리는 전체 필드를 업데이트하는 방식을 기본값으로 사용한다.
  • 만약 변경된 필드의 값만 업데이트하는 쿼리를 생성하기 위해서는 Entity에 @DynamicUpdate 어노테이션을 선언해 주면 된다.

📌 @DynamicUpdate 추가

@Entity
@Getter
@NoArgsConstructor(access = PROTECTED)
@DynamicUpdate // [add] 변경된 필드의 값만 업데이트
public class Member {
.
.
.
}

📌 수정 후 생성된 쿼리

🔥 잘못된 정보 수정[2023.03.16]

  • @DynamicUpdate를 사용하면 캐시 된 쿼리가 아닌 동적 쿼리를 새로이 생성하고, 이 과정에서 오버헤드가 발생해 더 적은 필드만 수정됨에도 오히려 성능이 떨어집니다.
  • 따라서 특정 필드만 수정해야하는 상황에 다른 필드도 같이 수정되는 상황이 아니면 @DynamicUpdate의 사용을 지양하는 것이 더 나은 방법입니다.
profile
목적 있는 글쓰기

0개의 댓글