@Transactional은 private에 붙이면 안된다.

dasd412·2022년 12월 28일
0

MSA 프로젝트

목록 보기
16/25

문제 상황

    @Override
    public Long deleteDiaryWithSubEntities(DiaryDeleteRequestDTO dto) throws TimeoutException {

        removeDiaryWithSubEntities(dto.getDiaryId());

        sendMessageToWriterService(dto.getWriterId(), dto.getDiaryId());

        sendMessageToFindDiaryService();

        return dto.getDiaryId();
    }
    
    @Transactional
    private void removeDiaryWithSubEntities(Long diaryId) throws TimeoutException {
    // db 로직
    }

이 코드인 채로 도커 말아서 띄워봤더니, transactionRequiredException이 발생했다.
트랜잭션 붙였는데, 뭔 소린가 했다.

원인

제목 그대로 @Transactional은 private에 붙이면 안된다.
왜냐하면 해당 어노테이션은 private method에서는 동작하지 않기 때문이다.

해결

    @Override
    @Transactional
    public Long deleteDiaryWithSubEntities(DiaryDeleteRequestDTO dto) throws TimeoutException {

        removeDiaryWithSubEntities(dto.getDiaryId());

        sendMessageToWriterService(dto.getWriterId(), dto.getDiaryId());

        sendMessageToFindDiaryService();

        return dto.getDiaryId();
    }
    
    
    private void removeDiaryWithSubEntities(Long diaryId) throws TimeoutException {
    // db 로직
    }

public으로 노출되있는, 최상위 메서드에 @Transactional을 부착했다.

참고 링크

https://netframework.tistory.com/entry/Spring-Transactional%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

profile
아키텍쳐 설계와 테스트 코드에 관심이 많음.

0개의 댓글