Java Exception 구조 완벽 이해하기
Java 개발에서 가장 중요한 개념 중 하나가 바로:
Exception(예외)
입니다.
실무에서는:
- DB 오류
- 네트워크 오류
- 파일 오류
- null 문제
- 비즈니스 오류
전부 예외 처리와 연결됩니다.
하지만 많은 초보 개발자는:
try-catch만 쓰면 되는 거 아냐?
정도로 이해하는 경우가 많습니다.
실제로 Java 예외 시스템은:
- Throwable 계층 구조
- Checked Exception
- Unchecked Exception
- JVM Stack Unwinding
- Error vs Exception
까지 연결되는 매우 중요한 Java 핵심 구조입니다.
이번 글에서는:
- Exception 구조
- Throwable 계층
- Error vs Exception
- Checked / Unchecked
- RuntimeException
- Stack Trace
- JVM 예외 처리 흐름
까지 깊게 정리해보겠습니다.
1. Exception이란?
Exception 은:
프로그램 실행 중 발생하는 비정상 상황
입니다.
2. 예외 예시
대표적으로:
- 파일 없음
- DB 연결 실패
- 배열 범위 초과
- null 접근
- 네트워크 장애
등.
3. Java 예외 구조 핵심
매우 중요합니다.
Java 모든 예외의 최상위 부모는:
Throwable
입니다.
4. 전체 구조
Throwable
├── Error
└── Exception
└── RuntimeException
5. Throwable이란?
Throwable 은:
JVM이 던질 수 있는 모든 문제의 최상위 클래스
입니다.
6. Throwable 하위 두 종류
| Error | 시스템 레벨 심각 오류 |
| Exception | 애플리케이션 처리 가능 오류 |
7. Error란?
매우 중요합니다.
8. 대표 Error
- OutOfMemoryError
- StackOverflowError
- VirtualMachineError
9. 특징
애플리케이션이 복구하기 어려움
입니다.
즉 보통:
잡으려고 하지 않음
10. OutOfMemoryError 예시
Heap 메모리 부족
상황.
11. 왜 catch 잘 안 할까?
이미 JVM 상태가:
불안정
할 가능성 큼.
즉:
정상 복구 어려움
12. Exception이란?
반대로:
애플리케이션 레벨 문제
입니다.
13. 대표 Exception
- IOException
- SQLException
- NullPointerException
- IllegalArgumentException
14. Exception 내부 구조
여기서 또 나뉨.
Exception
├── Checked Exception
└── RuntimeException
15. Checked Exception
매우 중요합니다.
16. 특징
컴파일러가 처리 강제
합니다.
즉:
- try-catch
- throws
반드시 필요.
17. 대표 Checked Exception
| IOException | 파일/네트워크 IO 문제 |
| SQLException | DB 문제 |
| FileNotFoundException | 파일 없음 |
18. 예시
FileReader reader =
new FileReader("a.txt");
↓
컴파일 오류 가능.
19. 왜 강제할까?
목표:
복구 가능한 예외 처리 강제
입니다.
20. RuntimeException
매우 중요합니다.
21. 특징
컴파일러가 강제 안 함
입니다.
즉:
try-catch 없어도 컴파일 가능
22. 대표 RuntimeException
| NullPointerException | null 접근 |
| IllegalArgumentException | 잘못된 인자 |
| IndexOutOfBoundsException | 범위 초과 |
| ArithmeticException | 0 나누기 |
23. 왜 unchecked일까?
대부분:
개발자 실수
에 가까운 경우 많기 때문.
24. NullPointerException 예시
String s = null;
s.length();
↓
NPE 발생
25. Checked vs Unchecked 핵심 차이
| 컴파일 검사 | O | X |
| 처리 강제 | O | X |
| 대표 원인 | 외부 환경 | 프로그래밍 오류 |
26. JVM 예외 처리 흐름
매우 중요합니다.
27. 예외 발생 시
예:
throw new RuntimeException();
28. JVM 동작
현재 메서드 종료
↓
호출 스택 따라 위로 전파
됩니다.
29. 이것이 Stack Unwinding
Stack unwinding 이란:
예외 발생 시 호출 스택을 되돌아가며 catch 찾는 과정
입니다.
30. 흐름 예시
main()
↓
service()
↓
repository()
↓
예외 발생
↓
repository 종료
↓
service로 전달
↓
main까지 전달
31. catch 발견 시
거기서 처리
됩니다.
32. 없으면?
프로그램 종료 가능
(JVM main thread 기준)
33. Stack Trace란?
매우 중요합니다.
34. 예시
at UserService.save(UserService.java:10)
35. 의미
예외가 발생한 호출 경로
입니다.
즉:
디버깅 핵심 정보
36. throw vs throws
많이 헷갈림.
37. throw
throw new RuntimeException();
↓
실제 예외 발생
38. throws
void read() throws IOException
↓
예외 전파 선언
39. finally 블록
매우 중요합니다.
40. 특징
예외 여부와 관계없이 실행
됩니다.
41. 대표 사용
- 파일 close
- DB connection 반환
- lock 해제
42. 예시
finally {
connection.close();
}
43. try-with-resources 등장 이유
리소스 자동 해제 목적.
44. 예시
try (
BufferedReader br = ...
) {
}
↓
자동 close 수행.
45. Exception Chaining
매우 중요합니다.
46. 예시
throw new RuntimeException(e);
47. 왜 중요할까?
원래 예외 정보 유지 가능.
즉:
근본 원인(cause) 추적
가능.
48. Custom Exception
실무에서 매우 중요.
49. 예시
class BusinessException
extends RuntimeException
50. 목적
비즈니스 의미 명확화
입니다.
51. 왜 RuntimeException 상속 많이 할까?
현대 Spring 실무에서는 보통:
Unchecked Exception 선호
경향 강함.
52. 이유
Checked Exception 남용 시:
- throws 전파 지옥
- 코드 오염
- 계층 결합 증가
가능.
53. Spring과 연결
Spring Framework 은 대부분:
RuntimeException 기반
처리.
예:
- DataAccessException
- Transaction rollback
등.
54. Exception 처리 전략 중요
실무 핵심:
“어디서 잡을 것인가”
입니다.
55. 너무 일찍 catch하면 문제
예:
catch(Exception e) {}
↓
예외 삼킴(swallowing)
문제 발생 가능.
56. 실무에서 자주 하는 실수
1) Exception 전체 catch
문제 원인 숨김 가능.
2) printStackTrace만 사용
실무에서는 logging framework 사용 필요.
3) Checked Exception 남용
계층 전파 지옥 가능.
4) RuntimeException 무조건 나쁘다고 생각
현대 Spring은 오히려 많이 사용.
57. 핵심 구조 정리
Throwable
├── Error
└── Exception
└── RuntimeException
58. 핵심 흐름 요약
예외 발생
↓
Stack Unwinding
↓
catch 탐색
↓
처리 or 프로그램 종료
59. 가장 중요한 핵심 한 줄
Java Exception 시스템은
“예외 상황을 객체와 계층 구조로 관리하는 메커니즘”
입니다.
60. 정리
Java Exception 구조는 단순 try-catch 문법이 아닙니다.
실제로는:
- Throwable 계층
- Checked/Unchecked
- Stack Unwinding
- RuntimeException 전략
- JVM 예외 처리 메커니즘
전체와 연결되는 Java 핵심 실행 구조입니다.
특히 실무에서는:
- Error vs Exception
- RuntimeException 사용 전략
- 예외 전파
- Exception Chaining
- 비즈니스 예외 설계
를 정확히 이해하는 것이 매우 중요합니다.
다음 글에서는:
Checked vs Unchecked Exception
을 현대 Spring 실무 전략, 트랜잭션 rollback, 계층 설계, RuntimeException 선호 이유까지 포함해서 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java try-catch-finally 흐름 완벽 이해하기 (0) | 2026.05.29 |
|---|---|
| Java Checked vs Unchecked Exception 완벽 이해하기 (0) | 2026.05.28 |
| Java 함수형 프로그래밍 패러다임 이해 완벽 정리 (0) | 2026.05.28 |
| Java Optional 남용 문제 완벽 이해하기 (0) | 2026.05.28 |
| Java Optional<T> 사용법 완벽 이해하기 (0) | 2026.05.28 |
댓글