백엔드/Spring

Spring DB Transaction에서의 UncheckedException, CheckedException

infitry 2022. 8. 16. 19:10
반응형

Java ChcekdException, UncheckedException과 Srping에서 DB @Transactional 어노테이션을 사용했을 때  어떻게 되는지에 대한 글입니다.

 

Exception은 자바에 대한 부분이고, @Transactional은 Spring에 대한 부분이라 카테고리를 Java로 잡아야 할지, Spring 으로 잡아야 할지 굉장히 고민되었던 부분입니다.😅

 

일단 자바의 Exception은 크게 두 부류로 나뉩니다.

Checked Exception과 RuntimeException을 상속받은 Unchecked Exception으로 나뉘어집니다.

RuntimeException은 이름에서도 알 수 있듯이 실행 시 발생하는 Exception이고, Checked Exception은 컴파일 시 확인할 수 있는 Exception입니다.

 

컴파일 시?라고 한다면, 저희가 자바로 개발을 하면, 소스를 작성할 때 IDE 님께서 Try ~ Catch로 묶으시거나 메소드에 throw 하셔야 한다고 친절하게 알려주시는 경우가 있습니다. 이 경우가 바로 Checked Exception 인 경우입니다.

RuntimeException은 친절하게 알려주시지 않습니다.. 에러가 날지 IDE님도 모르시거든요.

 

그럼 이 두 종류의 Exception이 @Transactional 어노테이션이 걸린 @Service 메소드에서 어떻게 동작할까요?

기본 설정이 Unchecked Exception 은 트랜잭션을 롤백하게 되어있고, Checked Exception은 throw 해도 롤백을 하지 않게 되어있습니다. 즉, IOException 같은 CheckedException은 기본적으로 롤백이 되지 않게 설정되어있습니다.

 

아래와 같이 @Transactional의 요소 중 rollbackFor를 사용하면 CheckedException이 발생하여도 DB 트랜잭션 롤백 처리를 할 수 있습니다.

@Transactional(rollbackFor = IOException.class)

 

사실 현재까지 개발할 때 크게 상관하지 않았습니다.

왜냐면 항상 자연스럽게, Checked Exception이 발생하면 try ~ catch구문으로 감싼 후 RuntimeException을 상속받은 Exception을 throw 했기 때문입니다. (잘 쓰고는 있었지만, 잘 알고 쓰진 못했네요.🤨)

 

요즘 공부하면서 느끼는 부분은 하나하나 확실하게 알고 쓰는 게 중요한 것 같습니다.

그리고, 직접 해보는 게 제일 와닿는 것 같네요. (위의 내용은 직접 다 실험해 봤습니다.)

 

혹시 내용이 알고 계신 내용과 다르면 언제든 댓글로 알려주세요~

 

반응형