[오늘의 배움] cannot reliably process 'remove' call 해결 - 커스텀 쿼리 메서드의 트랜잭션

2023. 11. 10. 16:20· 오늘의 배움
목차
  1. 🚨 에러가 발생한 상황
  2. ✅ 에러 해결
  3. 🐾 쿼리 메서드의 @Transactional

🚨 에러가 발생한 상황

투표 취소 API를 테스트 하던 중에 아래에 적힌 에러가 발생했다.

No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call

 

 

문제가 일어난 코드는 아래와 같다.

public void cancel(
    final Long voteId,
    final Long memberId
) {
    final Vote vote = voteReader.read(voteId);

    if (voterRepository.existsByVoteAndMemberId(vote, memberId)) {
        voterRepository.deleteByVoteAndMemberId(vote, memberId);
    }
}

 

✅ 에러 해결

에러를 읽어보니 사용가능한 트랜잭션을 가진 EntityManager가 없어서 'remove'를 할 수 없다고 한다. 이게 무슨 말인가 찾아보니 쓰기를 수행하는 메서드에는 @Transactional을 붙여줘야 한다는 것이다.

 

내가 작성한 메서드에는 @Transactional을 붙여주지 않아서 생긴 문제였다. @Transactional을 붙여주니까 에러는 해결됐다.

 

🐾 쿼리 메서드의 @Transactional

우리가 평소 사용하는 JpaRepository의 구현체는 SimpleJpaRepository이다. SimpleJpaRepository의 코드를 보면 조회 메서드를 제외하고 deleteXXX, saveXXX 메서드들에 모두 @Transactional이 붙어있는 것을 확인할 수 있다.

 

하지만 개발자가 정의한 쿼리 메서드에는 @Transactional이 붙어있지 않아서 직접 붙어줘야한다.

 

  1. 🚨 에러가 발생한 상황
  2. ✅ 에러 해결
  3. 🐾 쿼리 메서드의 @Transactional
'오늘의 배움' 카테고리의 다른 글
  • [오늘의 배움] JPA Cascade 맛보기
  • [오늘의 배움] MySQL 커버링 인덱스
yiseull
yiseull
느리지만 멈추지 않고, 코드 위에 경험과 신뢰를 쌓아갑니다. 작았던 눈덩이는 오늘도 한 줄의 코드와 함께 성장 중입니다. ⛄️🏂
yiseull
코드 위의 스노우볼
yiseull
  • 분류 전체보기 (17)
    • Java (1)
    • Spring (3)
    • 프로그래머스 백엔드 데브코스 (5)
    • 오늘의 배움 (3)
    • 회고 (3)
    • 트러블슈팅 (2)

최근 글

인기 글

hELLO · Designed By 정상우.v4.2.2
yiseull
[오늘의 배움] cannot reliably process 'remove' call 해결 - 커스텀 쿼리 메서드의 트랜잭션
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.