본문 바로가기

Web/DB

[Spring JPA] Update Query 작성 시 @Modifying @Transactional

728x90

 

 

JPA를 사용하면서 엔티티에서 @Setter 어노테이션을 모두 제거하게 되었다

엔티티 사용시에 setter 사용을 지양하도록 하라는 설명들을 보면서 왜 그런지에 대해서 많은 공부를 하게 된 것 같다.

그러면 데이터에 수정이 있어야할 경우에는 어떻게 해야할까?

전체를 다 들고와서 계속 올리는 건 너무 쓸데없는 코드가 되지 않을까

한참 고민을 하다가 

내가 작업하고 있는 것은 수 많은 컬럼 중에 하나의 boolean 상태만 바꾸는 것이라 @Query 를 사용해보기로 했다.

 

그런데 바로 DML 오류ㅎ...

 

not supported for dml operations update

 

 

 

왜 INSERT, UPDATE, DELETE 문을 쿼리로 짰을 때 @Modifying @Transactional을 붙이라고 하는 걸까??

 

 

 

@Modifying

@Query 를 붙인 쿼리들은 영속성이 아닌 바로 데이터 베이스에 직접 접근하게 된다

JPA 메서드 네이밍으로 만들어진 쿼리가 아니라 직접적으로 접근을 하다보니 영속성 컨텍스트 관리 때문인 것으로 보인다

 

그리고 해당 @Modifying 을 사용할때 같이 사용할 수 있는 attribute 들이 있다

 

@Modifying(clearAutomaticallty = boolean) < 이는 연산 직 후 영속성 컨텍스트를 clear 해주겠느냐는 속성이다.

상황에 따라 적용하면 될 듯 하다.

 

@Transactional

이는 데이터를 수정하거나 삭제하는 도중에 문제가 됐을 때 롤백하도록 하는 어노테이션이다.

728x90