1. 예외 계층 그림
Throwable
최상위 예외이다.
하위에 Exception과 Error가 있다.
Error
메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구 불가능한 시스템 예외이다.
개발자는 Error를 처리하려고 해서는 안된다.
Exception : 체크 예외
애플리케이션 로직에서 사용할 수 있는 최상위 예외이다.
Exception과 그 하위 예외는 모두 컴파일러가 체크하는 체크 예외이다.
RuntimeException : 언체크 예외, 런타임 예외
Exception의 하위 예외이지만, 컴파일러가 체크하지 않는 언체크 예외이다.
RuntimeException과 그 하위 예외는 모두 언체크 예외이다.
흔히, 런타임 예외라고 부른다.
2. 자바에서 Checked Exception과 Unchecked Exception에 대해서 설명해주세요.
Checked Exception은 컴파일 시점에 확인되며, 반드시 처리해야 하는 예외이다. IOException, SQLException, ClassNotFoundException, FileNotFoundException 등이 이에 속한다. Checked Exception을 유발하는 메서드를 호출하는 경우, 메서드 시그니처에 throws를 사용하여 호출자에게 예외를 던지거나 try-catch를 사용하여 해당 예외를 반드시 처리해야 한다. Checked Exception은 프로그램의 안정성을 높이기 위해 설계되었다. 개발자가 예외 상황을 미리 예측하고 대비할 수 있도록 강제함으로써, 예외 처리의 누락을 방지한다.
Unchecked Exception은 런타임 시점에 발생하는 예외로, 컴파일러가 처리 여부를 강제하지 않는다. RuntimeException을 상속한 예외들이 해당된다. 일반적으로 프로그래머의 실수나 코드 오류로 인해 발생한다. 대표적인 Unchecked Exception으로 NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException, ClassCastException 등이 있다.
3. 각각 언제 사용해야 할까요?
Checked Exception은 외부 환경과의 상호작용에서 발생할 가능성이 높은 예외에 적합하다. 예를 들어, 파일 입출력, 네트워크 통신 등에서 발생할 수 있는 예외는 예측 가능하기 때문에 Checked Exception으로 처리하는 것이 좋다. Checked Exception은 프로그램의 안정성을 높이기 위해 설계되었기 때문에 해당 예외가 실제로 복구 가능한지, 예외 처리가 애플리케이션의 안정성에 기여하는지를 신중히 고려해서 사용해야 한다.
Uncheked Exception은 프로그램의 버그나 예측할 수 없는 상황을 나타내는 데 사용된다. 개발자가 모든 Checked Exception을 처리해야하는 것은 번거로운 일이 된다. 따라서, 예측 가능한 예외가 아니면, Unchecked Exception을 사용하는 것이 좋다. 추가적으로 Checked Exception을 사용하면 해당 예외를 의존해야 한다는 단점이 있는데, Unchecked Exception을 사용하면 의존하지 않고 생략 가능하기 때문에 의존관계를 참조하지 않아도 되는 장점이 있다.
4. Error와 Exception의 차이는 무엇인가요?
Error는 주로 JVM에서 발생하는 심각한 문제로, OutOfMemoryError, StackOverflowError 등 시스템 레벨에서 발생하는 오류이다. 개발자는 Error를 처리해서는 안 된다. 프로그램에서 처리할 수 없는 오류이기 때문이다.
Exception은 애플리케이션에서 사용할 수 있는 최상위 예외이다. 프로그램 내에서 예외 처리를 통해 오류 상황을 제어할 수 있다. Exception은 Checked Exception이고 컴파일러가 처리를 강제하기 때문에 반드시 처리를 해줘야 한다. 그 하위에 RuntimeException은 Unchecked Exception으로 해당 예외를 처리하지 않고 무시할 수 있다.
5. 예외 발생시 스프링 프레임워크의 @Transactional에서 기본 동작
- 기본적으로 Unchecked Exception에서만 롤백이 발생한다.
- Checked Exception의 경우 롤백이 발생하지 않고 트랜잭션이 커밋된다.
- 이는 스프링이 EJB(Enterprice JavaBeans) 관습을 따르기 때문이다.
5 - 1. @Transactional 의 rollbackFor 속성으로 롤백 시키기
- @Transactional 어노테이션은 개발자가 필요에 따라 조정할 수 있다.
- rollbackFor 속성을 사용하여 특정 예외에 대해 롤백 시킬 수 있다.
- rollbackFor 속성을 사용하지 않고, 롤백 시키려면 Checked Exception을 catch하여 Unchecked Exception으로 변환해서 throw 하면 된다.
References
https://www.maeil-mail.kr/question/50
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
https://engineerinsight.tistory.com/282
https://sup2is.github.io/2021/03/04/java-exceptions-and-spring-transactional.html
'백엔드 면접 질문' 카테고리의 다른 글
데이터베이스 인덱스에 대해서 설명해주세요. (0) | 2024.12.02 |
---|---|
일급 컬렉션이 무엇인가요? (1) | 2024.11.29 |
JPA의 N + 1 문제에 대해서 설명해주세요 (1) | 2024.11.27 |
Entity Manager에 대해 설명해주세요. (0) | 2024.11.26 |
JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 할까요? (0) | 2024.11.25 |