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는 개발자들 사이에서 필요성 자체에 대해 의견이 분분하기도 합니다..).