1. 예외 게층1 - 시작
🎯 목적
예외를 단순 오류 코드로 분류하지 않고, 객체 계층으로 설계하여 더 정밀하게 예외를 다룬다.
예시
// 모든 네트워크 관련 예외의 부모
public class NetworkClientExceptionV3 extends Exception { ... }
// 연결 실패 예외
public class ConnectExceptionV3 extends NetworkClientExceptionV3 {
private final String address;
...
}
// 전송 실패 예외
public class SendExceptionV3 extends NetworkClientExceptionV3 {
private final String sendData;
...
}
👍 장점
- 부모 타입으로 모든 자식 예외를 한 번에 catch 가능
- 자식 타입을 이용해 세분화된 예외 처리 가능
- 각각의 예외는 자체 정보를 가짐 → 코드 가독성 향상
2. 예외계층 2 - 활용
🎯 다양한 예외 상황에 따라 적절히 분기 처리
try {
client.connect();
client.send(data);
} catch (ConnectExceptionV3 e) {
log("[연결 오류] 주소: " + e.getAddress());
} catch (NetworkClientExceptionV3 e) {
log("[네트워크 오류] 메시지: " + e.getMessage());
} catch (Exception e) {
log("[알 수 없는 오류] 메시지: " + e.getMessage());
}
- catch는 상속 구조의 자식부터 부모 순서로 배치해야 함
- 필요한 경우 | 연산자를 통해 다중 예외를 한 번에 처리 가능
catch (ConnectExceptionV3 | SendExceptionV3 e) {
log("[연결 또는 전송 오류] 메시지: " + e.getMessage());
}
3. 실무 예외 처리 방안 1 - 설명
✅ 처리할 수 없는 예외
예: 네트워크, DB 연결 실패
→ 애플리케이션에서 복구 불가능
→ 사용자에게 오류 안내 메시지, 로그 남기기 필수
❌ 체크 예외의 단점
- throws 선언이 누적되면서 코드가 지저분해지고 가독성 저하
- 결국 throws Exception이라는 안 좋은 습관 발생
4. 실무 예외 처리 방안2 - 활용
✅ 언체크 예외로 리팩토링
public class NetworkClientExceptionV4 extends RuntimeException { ... }
public class ConnectExceptionV4 extends NetworkClientExceptionV4 { ... }
public class SendExceptionV4 extends NetworkClientExceptionV4 { ... }
장점
- throws 선언 필요 없음
- 필요한 경우에만 catch 가능
- 복구 불가능한 예외는 공통 처리 로직에서 일괄 처리
예시
try {
networkService.sendMessage(input);
} catch (Exception e) {
handleException(e);
}
private static void handleException(Exception e) {
System.out.println("죄송합니다. 시스템 오류가 발생했습니다.");
e.printStackTrace(); // 디버깅용 로그
if (e instanceof SendExceptionV4 se) {
log("전송 실패 데이터: " + se.getSendData());
}
}
5. Try-With-Resources
✅ 리소스 누수 방지 자동화
public class NetworkClientV5 implements AutoCloseable {
public void close() {
disconnect();
}
}
try (NetworkClientV5 client = new NetworkClientV5(address)) {
client.connect();
client.send(data);
}
장점
- finally 없이도 자원 반납 보장
- AutoCloseable 인터페이스 덕분에 코드 간결 + 안전
정리
| 항목 | 추천 방식 |
| 예외 설계 | 예외 계층을 정의해 세분화 |
| 복구 불가능한 예외 | 언체크 예외 (RuntimeException) 사용 |
| 자원 반환 | try-with-resources 또는 finally 사용 |
| 공통 예외 처리 | 한 곳에서 Exception을 catch 후 instanceof로 분기 |
'Java' 카테고리의 다른 글
| 자바 중급 2편 - 제네릭(2) (0) | 2025.05.15 |
|---|---|
| 자바 중급 2편 - 제네릭(1) (0) | 2025.05.11 |
| Java 중급 1 - 예외처리(3) (0) | 2025.05.05 |
| Java 중급 1 - 예외처리(2) (0) | 2025.05.04 |
| Java 중급 1 - 예외처리(1) (0) | 2025.05.02 |