[Spring] @DynamicUpdate란?

hhjj0506·2023년 1월 16일
0

개발

목록 보기
1/2

공부하게 된 계기

현재 진행중인 프로젝트인 I-Taxi에서 이전 기수의 개발자분이 작성했던 코드를 보고 의문이 들었던 점이 있었다.

// 코드 1
public Place updatePlace(long id, UpdatePlaceDto dto) {
    // 데이터 가져오기 ...
    place.updatePlace(dto);
    return place;
}
  
// 코드 2
public String deletePlace(Long id, String uid) {
	// 데이터 가져오기 ...
    place.setDeleted(true);
    placeRepository.save(place);
    return "Success";
}

두개의 코드 모두 id를 받아 해당 id를 가지고 있는 데이터를 DB로부터 가져와 필드를 수정한 후 저장하는 동일한 코드였는데, 차이점으로 하나는 기능을 실행한 후 다시 DB에 저장하는 save()를 실행하지 않는데도 DB에 자동으로 바뀐 정보가 저장되는 신기한 현상을 목격했다. 그 후 조금 더 코드를 찾아보고 나서는 Entity에서 @DynamicUpdate라는 아노테이션을 발견했다.

기능

@Entity
@DynamicUpdate
public class Place {}

JPA에서 Entity에서 사용되는 아노테이션으로 Entity에 추가해주면 해당 Entity에 변경된 필드가 있다면 모든 값들을 가지고 쿼리를 만들어 실행하는 것이 아니라 실제로 변경된 값들만 가지고 수정하는 쿼리를 만들어 실행해준다. 이런 기능 때문에 위에서 설명했던 코드에서 repository에 저장을 따로 하지 않아도 자동으로 변경사항이 저장되었던 것이다.

문제점

듣기만 해도 정말로 편한 기능이지만 편리한만큼의 문제점도 지니고있다.
먼저 Entity에서 어떤 column이 변경되었는지 알아내기 위해 현재 Entity의 상태를 항상 주시하고 있어야한다. 그리고 Entity의 column이 변경될때는 현재 Entity와 변경된 Entity의 상태들을 비교한 후 쿼리를 실행해야하기 때문에 오버헤드 현상이 일어나는 문제가 있고, 따라서 정말 필요한 경우에만 사용하여야 한다.

참고 : https://www.baeldung.com/spring-data-jpa-dynamicupdate

profile
눈부시게 높은 하늘 그보다 더 큰 꿈을 꿔

0개의 댓글