🛠 @Modifying

정의

@ModifyingSpring Data JPA에서 @Query로 UPDATE, DELETE 같은 변경 쿼리를 실행하도록 지정하는 애너테이션이다.

조회용 JPQL과 달리, 변경 쿼리는 별도 처리 표시가 필요하다.

🧩 Artifact

  • @Modifying을 사용하려면 Spring Data JPA 의존성이 필요하다.
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

🔧 역할

  • @Query를 사용한 UPDATE, DELETE 실행을 가능하게 한다.
  • 변경 작업이므로 @Transactional과 함께 사용하는 경우가 많다.
  • 필요에 따라 flushAutomatically, clearAutomatically 옵션을 사용할 수 있다.

🧪 사용법

@Modifying 적용 예시

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

public interface UserRepository extends JpaRepository<User, Long> {

    @Modifying
    @Transactional
    @Query("UPDATE User u SET u.status = 'INACTIVE' WHERE u.id = :id")
    int deactivateUser(Long id);
}

@Transactional과 함께 사용하는 이유

  • 변경 쿼리는 트랜잭션 안에서 실행하는 것이 자연스럽다.
  • @Modifying만으로는 변경 작업의 일관성을 보장하기 어렵다.
  • clearAutomatically = true를 사용하면 영속성 컨텍스트를 초기화할 수 있다.
@Modifying(clearAutomatically = true)
@Query("DELETE FROM User u WHERE u.status = 'INACTIVE'")
void deleteInactiveUsers();

⚠️ 주의사항

  • 조회 쿼리에는 사용하지 않는다.
  • 변경 쿼리는 영속성 컨텍스트와 DB 상태가 달라질 수 있으므로 주의해야 한다.
  • 필요하면 flushAutomaticallyclearAutomatically 옵션을 함께 검토한다.

📌 정리

  • @Modifying은 JPA 변경 쿼리를 실행할 때 사용하는 애너테이션이다.
  • @Query와 함께 UPDATE, DELETE를 수행할 수 있다.
  • 트랜잭션과 영속성 컨텍스트 관리가 중요하다.

연결문서

댓글남기기