Java Checked vs Unchecked Exception 완벽 이해하기
Java 예외 처리에서 가장 중요한 개념 중 하나가 바로:
Checked Exception
vs
Unchecked Exception
차이입니다.
실무 면접에서도 정말 자주 나오고,
실제 프로젝트 설계에도 엄청 큰 영향을 줍니다.
특히 현대 Spring Framework 실무에서는:
왜 RuntimeException(Unchecked)을 더 많이 쓰는가?
를 이해하는 것이 매우 중요합니다.
이번 글에서는:
- Checked / Unchecked 차이
- RuntimeException 구조
- 컴파일러 동작
- 설계 철학
- 현대 Spring 실무 전략
- 트랜잭션 rollback
- 계층 구조 문제
까지 깊게 정리해보겠습니다.
1. 전체 Exception 구조 복습
Java 예외 구조:
Throwable
├── Error
└── Exception
└── RuntimeException
2. 핵심 구분
매우 중요.
| Checked Exception | RuntimeException 제외 |
| Unchecked Exception | RuntimeException 계열 |
3. Checked Exception이란?
Checked exception 은:
컴파일러가 처리 강제하는 예외
입니다.
4. 대표 Checked Exception
| IOException | 파일/네트워크 문제 |
| SQLException | DB 문제 |
| FileNotFoundException | 파일 없음 |
5. 특징
컴파일러가:
“반드시 처리해라”
강제.
즉:
- try-catch
- throws
반드시 필요.
6. 예시
FileReader reader =
new FileReader("a.txt");
↓
컴파일 오류 가능.
7. 해결 방법 1
try {
} catch(IOException e) {
}
8. 해결 방법 2
void read() throws IOException
9. 왜 Checked Exception 만들었을까?
Java 초기 철학 때문.
핵심 목표:
복구 가능한 예외를 강제로 처리
입니다.
10. 대표 철학
예:
파일 없음
네트워크 오류
DB 장애
↓
“반드시 대응해야 한다”
11. Unchecked Exception이란?
RuntimeException 기반 예외.
12. 특징
컴파일러가 처리 강제 안 함
즉:
throw new RuntimeException();
해도:
try-catch 없어도 컴파일 가능
13. 대표 Unchecked Exception
| NullPointerException | null 접근 |
| IllegalArgumentException | 잘못된 인자 |
| IndexOutOfBoundsException | 범위 초과 |
| IllegalStateException | 잘못된 상태 |
14. 왜 unchecked일까?
보통:
개발자 코드 문제
에 가까운 경우 많기 때문.
즉:
컴파일러가 강제해도 해결 어려움
15. 가장 큰 차이
| 컴파일 검사 | O | X |
| 처리 강제 | O | X |
| 대표 원인 | 외부 환경 | 프로그래밍 오류 |
16. Checked Exception의 장점
대표 장점:
예외 처리 누락 방지
17. 예시
IOException
발생 가능하면:
컴파일러가 강제로 알림
18. 하지만 현실 문제가 생김
매우 중요합니다.
19. 대표 문제: throws 전파 지옥
예:
Repository
↓
Service
↓
Controller
20. Repository에서 IOException 발생
그러면:
throws IOException
전파 필요.
21. 결국 전체 계층 오염
controller()
throws IOException
까지 올라갈 수 있음.
22. 이것이 계층 결합 증가
즉:
하위 기술 예외가 상위 계층까지 침투
합니다.
23. 실무에서 매우 싫어하는 부분
특히 대규모 서비스에서:
throws Exception 남발
상황 발생 가능.
24. 그래서 현대 Spring은?
매우 중요.
대부분:
RuntimeException 기반 전략
사용.
25. 왜 RuntimeException 선호할까?
핵심 이유:
| 계층 오염 감소 | O |
| 코드 간결 | O |
| 전역 처리 쉬움 | O |
| Spring rollback 연동 | O |
26. Spring 트랜잭션과 연결
매우 중요합니다.
Spring Transaction Management 은 기본적으로:
RuntimeException 발생 시 rollback
수행.
27. Checked Exception은?
기본 설정에선:
rollback 안 할 수도 있음
28. 왜 이렇게 설계했을까?
Spring 철학:
Unchecked Exception
=
복구 어려운 비즈니스 실패
로 보는 경우 많음.
29. 예시
@Transactional
public void save() {
throw new RuntimeException();
}
↓
자동 rollback 가능.
30. Checked Exception이면?
throw new IOException();
↓
기본 rollback 안 될 수 있음.
31. 해결 방법
@Transactional(
rollbackFor = Exception.class
)
설정 가능.
32. 그런데 왜 기본은 RuntimeException만?
Spring이:
Checked Exception 남용 지양
철학에 가까웠기 때문.
33. 현대 Java 실무 흐름
매우 중요.
과거 Java 철학
Checked Exception 적극 사용
현대 Spring 실무
RuntimeException 중심
34. 대표적인 실무 패턴
예:
class BusinessException
extends RuntimeException
35. 이유
비즈니스 실패를:
Unchecked로 전파
하는 것이 보통 더 유연.
36. Checked Exception이 여전히 좋은 경우
그렇다고 완전히 사라진 건 아님.
37. 대표 사례
| 파일 처리 | 복구 가능 |
| 네트워크 재시도 | 대응 가능 |
| 외부 API | fallback 가능 |
38. 즉 핵심 기준
매우 중요.
“호출자가 복구 가능한가?”
입니다.
39. 복구 가능하면 Checked 고려
예:
파일 다시 선택
재시도
fallback 처리
가능.
40. 복구 어렵다면 RuntimeException
예:
비즈니스 정책 위반
개발자 실수
불가능한 상태
41. 대표 RuntimeException 예
throw new IllegalArgumentException();
↓
잘못된 API 사용
42. 예외 전환(Exception Translation)
실무에서 매우 중요.
43. 예시
catch(SQLException e) {
throw new DataAccessException(e);
}
44. 왜 중요할까?
하위 기술 예외를:
비즈니스 의미 예외로 변환
가능.
45. Spring도 사용
Spring DataAccessException 이 대표적.
JDBC Checked Exception을:
RuntimeException 계열로 변환
합니다.
46. 실무에서 자주 하는 실수
1) throws Exception 남발
계층 오염 심함.
2) Checked Exception 과도 사용
코드 복잡도 증가.
3) RuntimeException 무조건 나쁘다고 생각
현대 Spring은 오히려 적극 사용.
4) rollback 정책 이해 부족
트랜잭션 버그 발생 가능.
47. 핵심 비교 정리
| 컴파일 검사 | O | X |
| 처리 강제 | O | X |
| 코드 복잡도 | 증가 가능 | 비교적 단순 |
| Spring rollback | 기본 X 가능 | 기본 O |
| 현대 실무 사용 | 감소 추세 | 매우 많음 |
48. 핵심 흐름 요약
Checked
=
복구 가능한 외부 문제
Unchecked
=
비즈니스 실패/개발 오류
49. 가장 중요한 핵심 한 줄
현대 Java/Spring 실무에서는
“복구 가능한 예외만 Checked로 고려하고,
대부분은 RuntimeException 기반으로 설계”하는 흐름이 강하다
입니다.
50. 정리
Checked vs Unchecked Exception은 단순 문법 차이가 아닙니다.
실제로는:
- 계층 설계
- 트랜잭션 rollback
- Spring 예외 전략
- Exception Translation
- 유지보수성
전체와 연결되는 Java/Spring 핵심 설계 개념입니다.
특히 실무에서는:
- RuntimeException 선호 이유
- rollback 정책
- 예외 전환
- 계층 오염 방지
- 복구 가능성 기준
을 정확히 이해하는 것이 매우 중요합니다.
다음 글에서는:
try-catch-finally 흐름
을 JVM Stack Unwinding, finally 실행 보장, return 충돌, suppressed exception까지 포함해서 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java try-with-resources 원리 완벽 이해하기 (0) | 2026.05.29 |
|---|---|
| Java try-catch-finally 흐름 완벽 이해하기 (0) | 2026.05.29 |
| Java Exception 구조 완벽 이해하기 (0) | 2026.05.28 |
| Java 함수형 프로그래밍 패러다임 이해 완벽 정리 (0) | 2026.05.28 |
| Java Optional 남용 문제 완벽 이해하기 (0) | 2026.05.28 |
댓글