Topic (오늘의 주제)
자바의 예외 계층 구조(Hierarchy)와 처리 전략: Checked vs Unchecked
Why (왜 사용하는가? 왜 중요한가?)
이 개념이 실무, 설계, 면접에서 중요한 이유를 정리합니다.
- 실무: 프로그램이 비정상적으로 종료되는 것(Crash)을 막고, 사용자에게 적절한 에러 메시지를 제공하기 위해 필수적입니다.
- 구조적 의미: 스프링(Spring) 같은 프레임워크에서 트랜잭션(Transaction) 롤백(Rollback) 정책을 결정하는 기준이 됩니다. (이 부분이 매우 중요합니다)
- 면접 의도: 단순한 예외 처리 문법(try-catch)을 넘어서, Checked Exception과 Unchecked Exception의 차이를 명확히 이해하고 적절하게 구분해서 사용하는지 확인합니다.
Core Concept (핵심 개념 정리)
자바의 예외는 모두 Throwable 클래스를 상속받으며, 크게 **Error(시스템 오류)**와 **Exception(애플리케이션 오류)**으로 나뉩니다. 가장 중요한 것은 Exception 내부의 두 갈래입니다.

| 요소 | 내용 |
| 계층 구조 | java.lang.Throwable (최상위) ├── Error: 시스템 레벨 문제 (JVM 메모리 부족 등) └── Exception: 개발자가 처리해야 할 문제 ├── Checked Exception: RuntimeException 상속 X └── Unchecked Exception: RuntimeException 상속 O |
| Checked vs Unchecked | 1. Checked Exception (컴파일 예외) - 검사 시점: 컴파일 단계 (Compiler) - 강제성: 반드시 try-catch 또는 throws로 처리해야 함. - 트랜잭션: 기본적으로 롤백(Rollback) 안 함. - 예시: IOException, SQLException 2. Unchecked Exception (런타임 예외) - 검사 시점: 실행 단계 (Runtime) - 강제성: 명시적인 처리를 강제하지 않음. - 트랜잭션: 기본적으로 롤백(Rollback) 함. - 예시: NullPointerException, IllegalArgumentException |
| 장점/단점 | Checked: 안정성 보장(실수 방지), 그러나 코드가 번잡해짐. Unchecked: 코드가 간결함, 그러나 개발자의 부주의로 에러 발생 가능. |
| 동작 흐름 | 예외 발생(throw) → 메서드 스택을 따라 상위로 전파 → catch 블록을 만나면 처리 → 처리되지 않으면 JVM이 종료되고 스택 트레이스 출력. |
Interview Answer Version (면접 답변식 요약)
"자바의 예외는 크게 복구 불가능한 Error와 복구 가능한 Exception으로 나뉩니다.
Exception은 다시 Checked Exception과 Unchecked Exception으로 구분되는데, 가장 큰 차이는 컴파일러의 처리 강제 여부와 트랜잭션 롤백 여부입니다.
Checked Exception은 파일 입출력처럼 외부 요인에 의해 발생할 수 있어 컴파일러가 예외 처리를 강제하며, 기본적으로 트랜잭션 롤백이 발생하지 않습니다.
반면, Unchecked Exception은 RuntimeException을 상속받으며, 주로 개발자의 로직 실수로 발생하고, 실행 시(Runtime)에 확인됩니다. 스프링 환경에서는 이 예외가 발생하면 기본적으로 트랜잭션이 롤백됩니다."
Practical Tip (사용 시 주의할 점 & 활용 예)
실무 코드 작성 및 프레임워크 사용 시 주의해야 할 핵심 포인트입니다.
1. 예외 '꿀꺽' 금지 (Swallowing Exception)
Java
// 절대 하지 말아야 할 코드 (최악의 패턴)
try {
someMethod();
} catch (Exception e) {
// 아무것도 안 함 (로그조차 안 남김)
}
- 문제: 에러가 발생했는데 시스템은 정상인 척 계속 돌아갑니다. 나중에 문제가 커졌을 때 원인을 찾을 수 없습니다(디버깅 지옥). 최소한 로그(log.error())는 남겨야 합니다.
2. Transaction과 Rollback 처리 (Spring Framework)
- 상황: 데이터를 저장하다가 에러가 났는데, 데이터가 롤백되지 않고 일부만 저장되는 문제.
- 원인: SQLException 같은 Checked Exception이 터지면 스프링은 기본적으로 롤백하지 않습니다.
- 해결:
- Checked Exception을 잡아서 Unchecked Exception(Custom Exception)으로 변환하여 던집니다. (가장 많이 쓰는 방법)
- @Transactional(rollbackFor = Exception.class) 옵션을 명시합니다.
3. 무분별한 throws Exception 지양
- 메서드 선언부에 public void method() throws Exception이라고 쓰면, 호출하는 쪽에서 구체적으로 어떤 에러가 나는지 알 수 없습니다. 가능한 구체적인 예외(throws IOException)를 명시하세요.
예상 꼬리질문 정리
- Q: Error와 Exception의 차이는 정확히 무엇인가요?
- Key Point: Error는 OutOfMemory처럼 시스템 레벨에서 발생하여 애플리케이션 코드로 복구가 불가능한 것, Exception은 개발자가 코드로 수습 가능한 것.
- Q: 자바의 try-with-resources 구문은 무엇이고 왜 쓰나요?
- Key Point: Java 7부터 도입. AutoCloseable 인터페이스를 구현한 리소스(IO 스트림 등)를 사용 후 finally 블록 없이 자동으로 close() 해주는 기능. 리소스 누수(Memory Leak) 방지.
- Q: 실무에서 Custom Exception(사용자 정의 예외)은 언제, 왜 만드나요?
- Key Point: 표준 예외(IllegalArgumentException 등)만으로 비즈니스 로직의 구체적인 상황(예: NotEnoughStockException)을 표현하기 어려울 때, 예외 이름만으로 의미를 전달하고 관리를 용이하게 하기 위해 사용.
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: 상속과 컴포지션(Composition)의 차이와, 언제 컴포지션을 사용하는가? (0) | 2025.12.02 |
|---|---|
| Daily Dev Q&A: 객체지향언어란? & 왜 JAVA가 객체지향언어인가? (0) | 2025.12.01 |
| Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어? (0) | 2025.11.28 |
| Daily Dev Q&A: 자바의 메모리 구조 (0) | 2025.11.26 |
| Daily Dev Q&A: 자바의 Garbage Collection (0) | 2025.11.25 |