Daily Dev Q&A: 자바의 예외 처리(Exception) 구조

2025. 11. 28. 18:45·Archive/Daily Dev Q&A

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이 터지면 스프링은 기본적으로 롤백하지 않습니다.
  • 해결:
    1. Checked Exception을 잡아서 Unchecked Exception(Custom Exception)으로 변환하여 던집니다. (가장 많이 쓰는 방법)
    2. @Transactional(rollbackFor = Exception.class) 옵션을 명시합니다.

3. 무분별한 throws Exception 지양

  • 메서드 선언부에 public void method() throws Exception이라고 쓰면, 호출하는 쪽에서 구체적으로 어떤 에러가 나는지 알 수 없습니다. 가능한 구체적인 예외(throws IOException)를 명시하세요.

예상 꼬리질문 정리

  1. Q: Error와 Exception의 차이는 정확히 무엇인가요?
    • Key Point: Error는 OutOfMemory처럼 시스템 레벨에서 발생하여 애플리케이션 코드로 복구가 불가능한 것, Exception은 개발자가 코드로 수습 가능한 것.
  2. Q: 자바의 try-with-resources 구문은 무엇이고 왜 쓰나요?
    • Key Point: Java 7부터 도입. AutoCloseable 인터페이스를 구현한 리소스(IO 스트림 등)를 사용 후 finally 블록 없이 자동으로 close() 해주는 기능. 리소스 누수(Memory Leak) 방지.
  3. 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
'Archive/Daily Dev Q&A' 카테고리의 다른 글
  • Daily Dev Q&A: 상속과 컴포지션(Composition)의 차이와, 언제 컴포지션을 사용하는가?
  • Daily Dev Q&A: 객체지향언어란? & 왜 JAVA가 객체지향언어인가?
  • Daily Dev Q&A: 자바는 컴파일 언어? 인터프린터 언어?
  • Daily Dev Q&A: 자바의 메모리 구조
tlsgkstj
tlsgkstj
짱구의 성장 일기
  • tlsgkstj
    코딩하는 짱구
    tlsgkstj
  • 전체
    오늘
    어제
    • 분류 전체보기 (159)
      • About (1)
      • Projects (35)
        • Personal Projects (21)
        • Team Projects (14)
      • Engineering (20)
        • CS & Tools (0)
        • Backend Core (15)
        • Frontend (1)
        • Infra & Cloud (2)
        • AI & Tools (1)
      • Trouble Shooting & Issues (0)
      • Growth & Career (38)
        • Interview Prep (0)
        • Retrospectives (38)
      • Archive (65)
        • TIL (8)
        • Daily Dev Q&A (56)
  • 블로그 메뉴

    • 홈
    • About
    • Projects
    • Tech Stack
    • Dev Log
    • GitHub
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    SpringBoot
    backend
    network
    데브페스트
    Project_Review
    Spring비교
    devlog
    클로드코드
    REACT
    프로덕트개발자
    spring
    경기기후바이브코딩
    DevFestIncheon2025
    aws_s3
    jpa
    커리어리셋
    java
    til
    OrphanRemova
    프로젝트회고
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
tlsgkstj
Daily Dev Q&A: 자바의 예외 처리(Exception) 구조
상단으로

티스토리툴바