[JPA] @Query를 사용한 Update 쿼리 에러

bagt13·2023년 2월 23일
0

JPA

목록 보기
12/13
post-custom-banner

📘 Spring Data JPA의 Update

Update는 Spring Data JPA에서 메서드 명명법을 지원하지 않는다고 한다. Dirty Cheking이라는 편리한 기능을 제공하기 때문인 것 같다.

따라서 다음 두가지 방법을 사용할 수 있다.

  1. Dirty Checking
  2. 직접 쿼리

대부분 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를 생성할 수 있다.

하지만 이렇게만 하면 위에서 본 에러가 뜬다.


✅ 해결 방법

@Modifying

@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);
profile
주니어 백엔드 개발자입니다😄
post-custom-banner

0개의 댓글