Java에서 문제 상황을 알리는 타입으로 검사예외, 런타임예외, 에러를 제공합니다. 여기서 검사예외를 Checked Exception(검사예외)으로 지칭하며 런타임예외, 에러 두개를 합쳐서 Unchecked Exception(비검사 예외)로 지칭합니다.
여기서 Error는 개발자가 예측하기도 쉽지 않고 처리할 수 있는 방법도 없습니다. 그렇기 때문에 개발자가 직접 구현하는 비검사 Unchecked Exception(비검사 예외)는 모두 RuntimeException
의 하위 클래스여야 합니다.
위에서도 명시하였지만 Checked Exception(검사예외)와 Unchecked Exception(비검사예외)의 특징을 한눈에 파악하기 위해 표로 정리해보겠습니다.
여기서 자칫 오해할 수 있는 부분이 있는데 트랜잭션 처리 부분입니다. 사실 트랜잭션에서 Unchecked Exception과 Checked Exception에서 트랜잭션 처리는 개발자가 직접 정할 수 있습니다. 많은 글에서 트랜잭션 처리에 대해 저렇게 비교한 이유는 기본적으로 Spring에서 Checked Exception일때는 롤백을 하지 않고 Unchecked Exception에서는 롤백을 하도록 설정되어 있기 때문일 것입니다.
트랜잭션 처리와 Exception부분에 대해 잘 못된 내용에 대해서는 백기선님이 설명해주신 동영상을 공유합니다!
자바 공부를 어떻게 하길래, "언체크드 예외 발생시 트랜잭션 롤백?_youtube 동영상
Spring에서도 기본적인 설정이지 @Transactional 어노테이션의 아래 옵션으로 충분이 설정이 가능합니다!
rollbackFor, rollbackForClassName, noRollbackFor, noRollbackForClassName
@Transactional(rollbackFor = Exception.class)
public void something1(int a) {
...
}
@Transactional(noRollbackFor = { ExceptionA.class, ExceptionB.class })
public void somthing2() {
...
}
Unchecked Exception(비검사예외)와 Checked Exception(검사예외)의 선택 기준은 복구할 수 있는지 여부 입니다. 복구할 수 있는 상황이면 검사 예외를, 프로그래밍 오류라면 비 검사 예외를 던지고 확실하지 않다면 비 검사 예외를 던지면 됩니다(Checked Exception는 개발자들 사이에서 필요성 자체에 대해 의견이 분분하기도 합니다..).