[Spring] API 예외 처리

이연우·2025년 8월 20일

TIL

목록 보기
93/100

@ExceptionHandler

  • 컨트롤러 클래스 내에서 특정 예외를 처리하는 메서드를 정의하는 어노테이션
    예외가 발생했을 때 설정된 메서드가 호출되어 예외를 처리

  • 특정 컨트롤러 클래스 내부에서 발생한 예외를 처리하는 메서드 지정
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<Map<String, String>> handleIllegalArgumentException(IllegalArgumentException ex) {
    Map<String, String> response = new HashMap<>();
    response.put("error", ex.getMessage());

    return ResponseEntity
            .status(HttpStatus.BAD_REQUEST)
            .body(response);
}

🛠️ 특징

  • 특정 컨트롤러 내부에서만 예외 처리 가능
  • throw new로 예외 발생 → 지정된 메서드가 실행됨

📊 실행 예시

  1. IllegalArgumentException → 등록된 @ExceptionHandler 실행 ✅

  2. NullPointerException → 처리자 없음 → 500 Internal Server Error

  3. Service Layer Exception → 같은 컨트롤러의 핸들러 실행됨

  4. 핸들러 없는 컨트롤러 → 예외 전파됨 (500)

⚠️ 문제점

  • 컨트롤러 코드에 예외 처리 책임이 추가됨 → 단일 책임 원칙 위반
  • 컨트롤러마다 중복 코드 발생
  • 유지 보수, 재사용성 ↓

📢 @ControllerAdvice

  • @RestController를 포함하고 있어 반환 값이 자동으로 JSON 형태로 변환되며
    REST API에서 발생하는 예외를 처리할 때 사용함

  • 애플리케이션 전역에서 발생하는 예외를 처리하는 기능

🌍 @ControllerAdvice & @RestControllerAdvice

✨ 차이점

  • @ControllerAdvice → 전역 예외 처리, 주로 뷰(View) 반환
  • @RestControllerAdvice → 전역 예외 처리 + JSON 반환 (REST API용)
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<Map<String, String>> handleIllegalArgumentException(IllegalArgumentException ex) {
        Map<String, String> response = new HashMap<>();
        response.put("error", ex.getMessage());

        return ResponseEntity
                .status(HttpStatus.BAD_REQUEST)
                .body(response);
    }
}

🛠️ 특징

  • 모든 컨트롤러에 적용됨
  • 중복 코드 제거 → 유지보수 용이
  • REST API에서는 @RestControllerAdvice 권장 → 자동으로 JSON 응답

📂 Annotation 비교 정리

Annotation적용 범위반환 형식특징
@ExceptionHandler단일 컨트롤러 내부뷰 이름, 문자열, ResponseEntity특정 컨트롤러 전용
@ControllerAdvice애플리케이션 전역뷰 이름, 문자열모든 컨트롤러 전역 적용
@RestControllerAdvice애플리케이션 전역JSON (ResponseEntity)REST API 전역 적용, JSON 자동 변환

🧠 요약 정리

Annotation적용 범위반환 형식장점단점
@ExceptionHandler단일 컨트롤러 내부뷰 이름, 문자열, ResponseEntity- 특정 컨트롤러 예외를 세밀하게 처리 가능
- 계층별로 throw 만 하면 됨
- 컨트롤러마다 중복 코드 발생
- 단일 책임 원칙 위반
@ControllerAdvice애플리케이션 전역뷰 이름, 문자열- 모든 컨트롤러에 전역 적용
- 예외 처리 코드 재사용 가능
- REST API에서는 직접 JSON 변환 필요
@RestControllerAdvice애플리케이션 전역JSON (ResponseEntity)- REST API 전역 예외 처리
- JSON 자동 변환
- 유지보수성과 재사용성 ↑
- 외부 라이브러리 예외 처리 시 변환 로직 필요

👉 정리:

  • 단일 컨트롤러 전용@ExceptionHandler
  • 전역 처리 (뷰 기반)@ControllerAdvice
  • 전역 처리 (REST API, JSON 기반)@RestControllerAdvice

0개의 댓글