TransactionRequiredException: executing an update/delete query with root cause
@Transcational 어노테이션을 사용한다.
@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부분에 적어줌으로써 가독성을 높이려고 노력했다.
@Component
class CartRepositoryAdapter(
private val cartEntityRepository: CartEntityRepository<CartEntity, Long>
): CartRepository {
@Transactional
override fun createCart(name: String, userId: Long) {
cartEntityRepository.saveCart(name, userId)
}
}