[Java] 예외 처리(Exception Handling) 완벽 가이드: 기초부터 실무 전략까지
프로그램을 만들다 보면 예상치 못한 상황을 마주하게 됩니다. 사용자가 숫자를 넣어야 할 곳에 문자를 넣거나, 네트워크가 갑자기 끊기는 식이죠. 자바는 이러한 '예외적인 상황'을 객체로 관리합니다. 오늘 이 포스팅 하나로 자바 예외 처리를 정복해 보겠습니다.
1. 예외(Exception)와 에러(Error)의 차이
가장 먼저 구분해야 할 것은 에러와 예외입니다.
- 에러(Error): JVM 레벨에서 발생하는 심각한 문제입니다. (예: OutOfMemoryError, StackOverflowError). 개발자가 코드로 수습할 수 없는 수준을 말합니다.
- 예외(Exception): 개발자가 짠 코드나 외부 환경에 의해 발생하며, 코드로 수습이 가능한 상황입니다.
2. 예외의 두 얼굴: Checked vs Unchecked
자바 예외는 크게 두 가지로 나뉩니다. 이 차이를 아는 것이 실무의 시작입니다.
| 구분 | Checked Exception | Unchecked Exception |
| 대표 클래스 | IOException, SQLException | RuntimeException 상속 클래스들 |
| 처리 여부 | 반드시 예외 처리를 해야 함 (컴파일 에러) | 예외 처리를 강제하지 않음 |
| 확인 시점 | 컴파일 단계 | 실행 단계 (Runtime) |
실무 팁: 최근 트렌드는 예외 처리를 강제하는 Checked Exception보다, 로직의 흐름을 방해하지 않는 Unchecked Exception을 선호합니다.
3. 예외 처리의 기본 문법: try-catch-finally
가장 표준적인 방법입니다.
Java
try {
// 1. 실행할 코드 (예외가 발생할 가능성이 있는 곳)
int result = 10 / 0;
} catch (ArithmeticException e) {
// 2. 예외 발생 시 처리할 로직
System.out.println("0으로 나눌 수 없습니다: " + e.getMessage());
} finally {
// 3. 예외 발생 여부와 상관없이 무조건 실행 (주로 리소스 반납)
System.out.println("작업을 종료합니다.");
}
4. 자바 7의 혁신: try-with-resources
파일이나 DB 연결처럼 사용 후 반드시 닫아야 하는 리소스는 finally에서 close()를 호출해야 했습니다. 하지만 자바 7부터는 훨씬 간결해졌습니다.
Java
// 별도로 close()를 호출하지 않아도 블록이 끝나면 자동 반납됨
try (FileReader reader = new FileReader("test.txt")) {
int data = reader.read();
} catch (IOException e) {
log.error("파일 읽기 실패", e);
}
5. 예외 던지기: throws vs throw
- throw: 개발자가 직접 예외를 발생시킬 때 사용합니다. (throw new RuntimeException();)
- throws: 메서드 선언부에 사용하여, 이 메서드를 호출하는 쪽으로 예외 처리를 떠넘길 때 사용합니다.
Java
public void process(int age) throws IllegalArgumentException { // 예외 떠넘기기
if (age < 0) {
throw new IllegalArgumentException("나이는 음수일 수 없습니다."); // 직접 발생
}
}
6. 실무에서 빛나는 예외 처리 전략 (Best Practices)
① 예외를 잡아서 숨기지 마세요 (Empty Catch)
Java
// 절대 금지! 에러가 왜 났는지 영원히 알 수 없게 됩니다.
try { ... } catch (Exception e) { }
② 비즈니스 예외는 커스텀 예외로 만드세요
단순히 RuntimeException을 던지는 것보다, 어떤 비즈니스 로직에서 에러가 났는지 명시하는 것이 유지보수에 좋습니다.
Java
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
③ 로그를 남길 때는 스택 트레이스를 포함하세요
e.getMessage()만 남기면 어디서 에러가 시작되었는지 알 수 없습니다. log.error("메시지", e) 처럼 예외 객체 자체를 넘기세요
7. 결론: 예외 처리는 '친절함'이다
예외 처리는 단순히 프로그램이 꺼지지 않게 만드는 작업이 아닙니다. 사용자에게는 적절한 안내 메시지를 주고, 동료 개발자에게는 디버깅의 단서를 제공하는 친절한 행위입니다.
오늘 배운 try-with-resources와 Custom Exception 전략을 사용해 더 견고한 자바 코드를 만들어 보세요!
'TECH > 웹개발' 카테고리의 다른 글
| [Java] 컬렉션 프레임워크 완벽 정리: List, Set, Map 차이점 모르면 면접 탈락? (0) | 2026.02.13 |
|---|---|
| 스프링 부트 전역 예외 처리(Global Exception) - 중구난방 에러 메시지 한 번에 정리하기 (0) | 2026.02.12 |
| [Java] 메서드 체이닝(Method Chaining) 완벽 가이드: 원리부터 실무 활용까지 (0) | 2026.02.10 |
| [Java] Optional 완벽 가이드: 더 이상 NullPointerException은 없다 (0) | 2026.02.09 |
| [Java] 람다식(Lambda) 완벽 가이드: 개념부터 실무 활용 예시까지 (0) | 2026.02.07 |