Update는 Spring Data JPA에서 메서드 명명법을 지원하지 않는다고 한다. Dirty Cheking이라는 편리한 기능을 제공하기 때문인 것 같다.
따라서 다음 두가지 방법을 사용할 수 있다.
- Dirty Checking
- 직접 쿼리
대부분 1번 방식인 Dirty Check를 사용할 것이고, 나도 1번밖에 사용해보지 않았다. 영속성 컨텍스트(1차 캐시)를 사용한다면 dirty checking이 정상적으로 수행되어 별다른 작업 없이 편리하게 update 쿼리를 수행할 수 있기 때문이다.
하지만 2번 방법을 시도하던 도중 에러가 발생했다. 2번 방식은 1차 캐시를 사용하지 않기 때문에, DB에 직접 쿼리를 날려야 한다.
org.hibernate.hql.internal.QueryExecutionRequestException:Not supported for DML operations
다음은 에러가 발생한 쿼리이다.
@Query("update Board b set b.viewCount = :viewCnt where b.id = :id")
void applyViewCntToRDB(Long id, Long viewCnt);
조회수를 반영하는 로직이며, Spring Data JPA에서는 @Query를 사용하여 JPQL 또는 nativeQuery를 생성할 수 있다.
하지만 이렇게만 하면 위에서 본 에러가 뜬다.
@Query 애노테이션을 통한 쿼리 생성에 사용되며, INSERT, UPDATE, DELETE, 그리고 DDL 구문을 사용할 때에는 @Modifying 애노테이션을 붙여줘야 한다
라고 되어있다.
즉, DB의 상태를 바꾸는 DML statement 또는 DDL statement가 @Query에 의해 생성된다면, 해당 애노테이션이 필요하다는 뜻이다.
따라서 해당 애노테이션을 붙여줘야 에러가 발생하지 않는다.
@Modifying
@Query("update Board b set b.viewCount = :viewCnt where b.id = :id")
void applyViewCntToRDB(Long id, Long viewCnt);