본문 바로가기
JPA

트랜잭션 예외처리 롤백

by 근즈리얼 2024. 4. 1.
728x90

개인 프로젝트를 하며 만났던 당황스러운 상황에 대해서 포스팅을 해보려고 합니다.

 

결론부터 말씀드리면 트랜잭션 사용 중 예외가 발생하면 롤백이 발생하는데 unCheked예외일 경우에만 롤백이 발생한다! 입니다.

 

간단한 예시 상황을 만들어 보겠습니다. (학습목표 포함!)

  1. 멤버와 팀이 존재한다.
  2. 팀을 저장할 때 멤버를 함께 생성한다.
  3. 팀은 성공적으로 insert쿼리가 나갔고 멤버를 저장하는 타이밍에 예외가 발생한다.
  4. 이때 checkedException과 unCheckedException이 발생했을 때 어떻게 다른지 확인해보자~

우선, 제가 잘못 알고 있었던 부분은 '예외의 따라서 롤백이 되는 것이 아닌 예외가 발생하면 무조건 롤백' 입니다.

따라서, 위의 상황에서 4번에 상관없이 무조건 팀도 롤백이 되는 줄 알았습니다.

 

서비스 로직만 있어도 충분할거 같아서 서비스 로직만 가져왔습니다.

@Transactional
fun createTeam(createTeamRequest : CreateTeamRequest) {

    val team = Team(id = null, name = createTeamRequest.teamName, member = null)

// team 생성
    teamRepository.save(team)

    createMember()
}

// 일부러 예외를 발생시킴
private fun createMember() {
    throw Exception("일부러 발생~")
}

 

 

위의 코드를 봤을 때, 저는 team은 생성이 안될줄 알았지만..

 

서버에러가 발생해도

 

 

아래의 사진처럼 팀이 생성된 것을 확인할 수 가 있었습니다.

 

하지만.. 제가 계속 왜 안되지라고 생각했던 이유는 실무에서나 과거 개인 플젝에서는 예외를 발생시켜도 잘 롤백 됐던 경험이 있었기 때문입니다.

 

이유를 알아내기 위해 테스트를 진행했고
이유는! RuntimeException()을 상속받은 예외처리를 하고 있었기 때문이었습니다.

아래는 코드를 일부 수정한 것입니다.

@Transactional
    fun createTeam(createTeamRequest : CreateTeamRequest) {

        val team = Team(id = null, name = createTeamRequest.teamName, member = null)

        teamRepository.save(team)

        createMember()
    }

    // 일부러 예외를 발생시킴
    private fun createMember() {
        throw RuntimeException("일부러 발생~")
    }

 

 

서버에러가 발생

 

데이터베이스에 데이터 없음

 

테스트를 통해서 정확하게 예외에 따라서 다른것을 확인했습니다.

사실 개인 프로젝트에서도 전체 예외처리를 만들기 전에 임의로 Exception을 터지게 만들었다보니 처음 겪는 일이었습니다. 어떻게 보면 백엔드 개발자로써 당연히 알아야했던 부분인거 같기도 하지만.. 부족한 부분을 채워가며 포스팅을 마치겠습니다.

728x90

댓글