[JPA] executing an update/delete query with root cause

김지원·2024년 5월 7일
post-thumbnail

전체 오류

TransactionRequiredException: executing an update/delete query with root cause

오류 해석

  • DML 중에서도 데이터의 상태를 조작하거나 변경하는 명령어 (insert, update, delete)에는 transaction이 필요하다.

오류 해결 방법

@Transcational 어노테이션을 사용한다.

  • JpaRepository
@Repository
interface CartJpaRepository: CartEntityRepository<CartEntity, Long> {
    @Transactional
    @Modifying
    @Query(value = "INSERT INTO cart(name, user_id) VALUES (:name, :userId)", nativeQuery = true)
    override fun saveCart(name: String, userId: Long)
}

인터넷에 있는 많은 예제 코드들은 @Transactional이 @Query를 사용하는 함수에 많이 붙어 있어 적었지만 사실 @Transactional을 구현체에서 사용하는 것이 맞을지는 고민해봐야될 것 같긴하다.

필자는 구현체에서 트랜잭션을 관리하기보다는
다른 구현체에서 사용하는 adapter부분에 적어줌으로써 가독성을 높이려고 노력했다.

  • RepositoryAdapter
@Component
class CartRepositoryAdapter(
    private val cartEntityRepository: CartEntityRepository<CartEntity, Long>
): CartRepository {
    @Transactional
    override fun createCart(name: String, userId: Long) {
        cartEntityRepository.saveCart(name, userId)
    }
}
profile
backend-developer

0개의 댓글