SPRING FRAMEWORK

JPA annotation @DynamicUpdate?

Ambitions 2020. 5. 7. 11:05

오늘은 테이블에 대한 Entity를 만들 떄 항상 선언해 주었던 @DynamicUpdate에 대해서 정리해본다.

 

기본적으로 @DynamicUpdate는 Spring JPA에서 제공하는 기능이다. (JPA, Hibernate, Spring JPA가 같은 의미는 아님)

개발을 하면서 @DynamicUpdate 어노테이션이 무슨역할을 하는지도 모른채 대부분의 Entity에 선언해줬었는데,

최근들어 왜 선언해야하는지 궁금증이 생겨서 조금 조사해봤다, 간단하게 정리하면 다음과 같다.

 

JPA는 서버가 실행될 때 CURD에 관한 SQL문을 캐싱해놓는데, 여기서 UPDATE문에 UPDATE 대상이 모든 열로 선언되어 있다는 거다, 컬럼(필드)가 20개라면 20개 컬럼에 대한 업데이트문이 선언되어 있는 것이다. 

(update table set col, col2, col3 ..... col20 where ...) <- 이런식으로

만약 임의의 컬럼하나가 업데이트되면 업데이트된 컬럼을 제외한 나머지는 기존 값을 업데이트하는 쿼리문이 실행된다는 것이다. 

 

대부분의 컬럼 값이 업데이트되는 빈도가 많은 테이블의 경우 문제가 없으나, 특정 값만 업데이트 되는 빈도가 많은경우(수정일, 수정자 등..) 효율성에 대한 문제가 있다는 것이다. 

하지만 @DynamicUpdate를 이용하게 되면 실질적으로 업데이트가 이뤄지는 컬럼에 대한 UPDATE SQL문을 생성한다.

따라서 기존 모든 컬럼을 업데이트하는 것에 비해 리소스적 측면에서 이득을 얻을 수 있다는 것이다.

 

여기서 문제는 모든 엔티티에 @DynamicUpdate를 선언해주는 것이 좋은 방법인가? 인데 내가 참고한 문서에서는 필요한 경우에만 선언해서 사용하라고 한다. 아마 추측하기로는 JPA는 캐시메모리를 이용하고 있기 때문에 업데이트를 하는 컬럼이 많아질경우 SQL문을 생성하고 실행하는 것 보다 캐시메모리에 존재하는 데이터를 이용하는 것이 더 효율적이기 떄문이라고 생각한다.

 

따라서 오늘의 결론은 적재적소에 @DynamicUpdate를 사용하자! 이다.