Next-Squad/Interview-Question

[자바] 33. CheckedException과 UnCheckedException의 차이

CMSSKKK opened this issue · 1 comments

CheckedException과 UnCheckedException의 차이

키워드

스프링 트랜잭션 Commit Rollback

기본적으로 CheckedException과 UnCheckedException의 차이는 예외 계층에서 먼저 살펴볼 수 있습니다.

예외는 throwable 하위에 Exception, Error로 나눠집니다. (Error도 uncheckedException)

Exception 하위에 유일하게 RuntimeException 그리고 그 하위를 상속한 예외는 UncheckedException 입니다.
다시 말하면 RuntimeException만을 제외하고는 모든 Exception 하위는 checkedException이 됩니다.

1. 기본적인 자바에서의 차이

기본적으로 자바에서만 두 예외의 차이를 따져보자면, 말 그대로 컴파일러가 체크를 하는가? 안하는가? 입니다.
CheckedException은 try-catch로 예외를 잡아서 처리하거나, throws 키워드를 통해서 선언해야합니다.
그렇게 하지 않으면 컴파일 에러가 발생합니다. 이와 반대로 UncheckedException의 경우, try-catch 또는 throws를 생략해도 컴파일 에러가 발생하지 않는 것입니다.

예외를 잡거나 throws 할 때, 상위 익셉션을 잡으면 모든 하위 타입 또한 처리할 수 있습니다.

CheckedException은 컴파일러가 체크를 해주기 때문에 개발자의 실수를 바로 확인할 수 있다는 장점이 있지만, 사소하거나 중요하게 신경쓸 수 없는 것, 그리고 개발자가 코드로 예외를 처리할 수 없는 상황에도 try-catch 또는 throws를 선언해줘야 단점이 있습니다. (처리할 수 없는 예외임에도 불구하고 예외를 의존하게 되는 경우가 발생하는 경우도 있음.)

그래서 CheckedException은 비즈니스 로직상 의도적으로 던지는 예외에만 사용하는 것이 좋습니다. (반드시의 개념은 아님)

스프링에서도 자바 초기 클래스가 던지는 CheckedException(예를 들어, SQLException, IOException)을
개발자가 처리할 수 없기 때문에 DataAccessException와 같은 UnchekcedException으로 포장해주기도 합니다.

2. 스프링 트랜잭션에서의 차이

CheckedException과 이 발생했을 때, 트랜잭션을 롤백하느냐 커밋하느냐의 차이입니다.
기본적으로 CheckedException(Exception과 그 하위의 예외) 발생하더라도 커밋을 진행합니다.
UnCheckedException(RuntimeException과 그 하위의 예외, Error)가 발생하면 트랜잭션을 롤백합니다.

스프링 기본적으로 CheckedException은 비즈니스 의미가 있을 때 사용하고, UnCheckedException는 복구 불가능한 예외로 가정합니다.

하지만 이 차이가 무조건적인 것이 아니기 때문에 noRollbackfor 또는 rollbackfor 와 같이 설정해줄 수 있습니다.

References

  • 스프링 DB 1,2편, 김영한, 인프런