본문 바로가기
언어/spring

ResponseEntityExceptionHandler부터 ErrorController까지

by 김뱅쓰 2025. 3. 30.

1. 문제

- 강의를 듣다가 커스텀 예외처리를 할때 왜 Response EntityExceptionHandler를 상속받아서 예외처리를 할까?

+

  • REST API를 만들면서 예외 처리가 왜 필요한지
  • 예외를 제대로 처리하지 않으면 어떤 문제가 생기는지 (ex: null 반환 + 200 OK)

2. Spring의 예외 처리 흐름 정리

💡 핵심 다이어그램으로 보여주면 좋아

scss
복사편집
[요청] ↓ DispatcherServlet ↓ Controller ↓ (예외 발생) ↓ ExceptionResolver ├─> @ExceptionHandler ├─> @ControllerAdvice + ResponseEntityExceptionHandler ├─> BasicErrorController + DefaultErrorAttributes ↓ HTTP Response 반환
  • Spring이 예외를 어디서, 어떤 순서로 처리하는지 설명
  • 각 단계에서 우리가 개입할 수 있는 포인트 소개

3. ResponseEntityExceptionHandler의 역할과 커스터마이징

  • Spring이 내부적으로 어떤 예외들을 이 클래스로 처리하는지
  • 대표 예외: MethodArgumentNotValidException, MissingServletRequestParameterException 등
  • @ControllerAdvice와 함께 확장하는 방법
  • 오버라이딩 예시

4. @ExceptionHandler(Exception.class)와의 관계

  • catch-all 처리기로서의 역할
  • 다른 예외 핸들러들이 처리 못한 예외를 마지막으로 잡아냄
  • ResponseEntityExceptionHandler와 같이 썼을 때 우선순위 설명

5. BasicErrorController, DefaultErrorAttributes의 역할

  • 예외가 아무 데서도 처리되지 않았을 때 기본적으로 호출됨
  • 자동 응답 JSON의 구조 (timestamp, status, error, message, path)
  • ErrorAttributes를 커스터마이징해서 JSON 포맷 바꾸는 법

6. 실전 예제 코드

  • 사용자 정의 예외 생성
  • 컨트롤러에서 예외 발생
  • 전역 예외 처리기로 잡아서 JSON 응답 반환
  • 유효성 검사 실패 시 응답 커스터마이징

7. 마무리 & 팁

  • 언제 어떤 방식으로 예외를 처리해야 하는지 요약
  • ResponseEntityExceptionHandler는 기본 예외 + 커스터마이징
  • ErrorAttributes는 에러 응답 포맷 통일할 때
  • 직접 예외를 던지고 예외처리기에서 ResponseEntity로 컨트롤하는 게 RESTful

✨ 마크다운 예시 (블로그용)

markdown
복사편집
### ResponseEntityExceptionHandler란? Spring이 제공하는 기본 예외 처리 추상 클래스입니다. 컨트롤러 단에서 자주 발생하는 예외들을 자동으로 처리해주며, 우리가 오버라이딩해서 응답 형식이나 메시지를 바꿀 수 있습니다. ```java @Override protected ResponseEntity<Object> handleMethodArgumentNotValid(...) { // 커스텀 응답 }

예외 처리 우선순위 흐름

  1. 컨트롤러 내부 @ExceptionHandler
  2. @ControllerAdvice의 @ExceptionHandler
  3. ResponseEntityExceptionHandler의 오버라이드 메서드
  4. BasicErrorController의 기본 에러 처리
Spring 프레임워크에서는 애플리케이션 전반에 걸친 일관된 예외 처리를 위해 @ControllerAdvice 또는 @RestControllerAdvice 어노테이션의 사용을 권장합니다. 이 어노테이션들은 여러 컨트롤러에서 발생하는 예외를 중앙에서 관리할 수 있도록 도와주며, 이를 통해 중복된 예외 처리 코드를 제거하고 유지보수성을 향상시킬 수 있습니다.

@ControllerAdvice와 @RestControllerAdvice의 차이점:

  • @ControllerAdvice: @Controller가 적용된 클래스에 대한 전역 예외 처리를 제공합니다. 주로 뷰를 반환하는 컨트롤러에서 사용됩니다.
  • @RestControllerAdvice: @RestController가 적용된 클래스에 대한 전역 예외 처리를 제공합니다. JSON 또는 XML과 같은 데이터를 반환하는 RESTful API 컨트롤러에서 주로 사용됩니다.
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html
 

ControllerAdvice (Spring Framework 6.2.5 API)

Specialization of @Component for classes that declare @ExceptionHandler, @InitBinder, or @ModelAttribute methods to be shared across multiple @Controller classes. Classes annotated with @ControllerAdvice can be declared explicitly as Spring beans or auto-d

docs.spring.io


재작성!