• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

querydsl 로 @CreationTimestamp 사용이 가능한가요?

20.07.31 08:08 작성 조회수 268

0

안녕하세요. 강의를 보고 querydsl 을 실무에 적용하고자 학습중이었습니다. 

실제로 적용하고 querydsl 로 업데이트 쿼리를 만들어 시도하니 정상적으로 작동하긴 했지만

Entity에 정의된 @UpdateTimestamp 라던가 Audit를 이용한 @LastModified가 무시되는걸로 확인됐습니다.

혹시나 해서 테스트코드를 짜보니, 엔터티를 검색하여 가져온 다음 set을 하는 경우엔 위의 기능들이 동작했지만

querydsl 의 update....execute() 를 사용할 경우 안되더군요.

querydsl 을 사용하여 저 기능들을  활용할 방법이 있을까요? 만약 없다면 어떻게 해야하나요?

참고로 현재 사용중인 프로젝트 버전은 스프링부트 1.5.8 이며 JPA 2.1 , Hibernate는 5.2.18, querydsl 4.1.3 버전입니다.

답변 2

·

답변을 작성해보세요.

2

안녕하세요. edu님

JPA에서는 엔티티를 직접 변경해서 업데이트 하는 방법이 있고, JPQL을 사용해서 업데이트 하는 방법도 있습니다.

이렇게 JPQL을 사용해서 엔티티를 통하지 않고, 직접 업데이트 하는 것을  벌크연산이라 합니다.

Querydsl은 결국 JPQL을 실행하는 것이기 때문에 JPQL을 사용해서 업데이트 하는 벌크 연산 기능을 사용한 것 입니다.

벌크 연산은 엔티티를 통하지 않고 DB에 직접 반영하기 때문에 Entity에 정의된 모든 이벤트가 무시됩니다!

(@UpdateTimestamp, @LastModified는 다 이벤트를 통해서 실행됩니다.)

JPA에서 엔티티의 변경은 엔티티의 값을 수정해서, 변경감지에 의해서 변경하도록 개발하셔야 합니다. 벌크연산은 꼭 성능을 최적화해야 하는 등의 어쩔 수 없는 경우에만 사용하셔야 합니다. 그리고 벌크 연산을 사용하면 @UpdateTimestamp, @LastModified 등의 값도 직접 벌크연산에서 업데이트 해주셔야 합니다.

벌크연산에 대한 더 자세한 내용과 주의점은

JPA 기본편에 있는

객체지향 쿼리 언어2 - 중급 문법 -> 벌크연산 편을 참고해주세요^^

1

정말 감사합니다 ㅎㅎㅎ 영속성을 이용할때만 동작하는걸 보고 어렴풋이 그러지 않을까하긴 했는데 어디에도 확신시켜 줄

문서나 이야기를 찾지 못했었거든요 ㅠㅠ 그래서 불가능한게 아닌데 저만 이상한건가 했습니다.

update 이후 영속성 객체에 flush()해줘야 한다는 말씀 주의깊게 들었습니다!