Spring

MVC / API 예외 처리

Dear-J 2025. 4. 15. 21:16

API 예외 처리

오류 페이지는 단순히 고객에게 오류 화면을 보여주고 끝

 

API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 함

produces = MediaType.APPLICATION_JSON_VALUE의 뜻

>> 클라이언트가 요청하는 HTTP Header의 Accept 값이 application/json일 때 해당 메서드 호출

>> 클라이언트가 받고 싶은 미디어 타입이 json이면 이 컨트롤러 메서드 호출

 

응답 데이터를 위해 Map을 만들고 statue, message 키에 값 할당

>> Jackson 라이브러리는 Map을 JSON 구조로 변환 가능

 

스프링 부트 기본 오류 처리

BasicErrorController

errorHtml() : produces = MediaType.TEXT_HTML_VALUE

>> 클라이언트 요청의 Accept 헤더 값이 text/html인 경우에 errorHtml()을 호출해 view 제공

 

error() : 그 외 경우에 호출, ResonseEntity로 HTTP Body에 JSON 데이터 반환

 

HandlerExceptionResolver

스프링 MVC는 컨트롤러(핸들러) 밖으로 예외가 던져진 경우 예외를 해결하고 동작을 새로 정의할 방법 제공

>> HandlerExceprtionResolver(ExceptionResolver)

예외 상태 코드 변환

>> 예외를 response.sendError(xxx) 호출로 변경해서 서블릿에서 상태 코드에 따른 오류를 처리하도록 위임

>> 이후 WAS는 서블릿 오류 페이지를 찾아서 내부 호출, 예를 들어 스프링 부트가 기본으로 설정한 /error 가 호출됨

 

뷰 템플릿 처리

>> ModelAndView에 값을 채워 예외에 따른 새로운 오류 화면 뷰 렌더링 해서 고객에게 제공

 

API 응답 처리

>> response.getWriter().println("hello"); 처럼 HTTP 응답 바디에 직접 데이터를 넣기 가능

>> 여기에 JSON 으로 응답하면 API 응답 처리 가능

 

EceptionHandlerExceptionResolver

API 예외 처리를 위한 @ExceptionHandler 애노테이션 제공

애노테이션을 선언하고 해당 컨트롤러에서 처리하고 싶은 예외 지정

지정한 예외 또는 그 예외의 자식 클래스 모두 잡기 가능

다양한 예외 한번에 처리 가능

 

 

ResponseStatusExceptionResolver

예외에 따라 HTTP 상태 코드 지정해주는 역할

 

@ResponseStatus가 달려있는 예외 

BadRequestException 예외가 컨트롤러 밖으로 넘어가면 ResponseStatusExceptionResolver 예외가 해당 애노테이션을 확인해서 오류 코드를 변경하고 메시지도 담음

 

ResponseStatusException 예외 처리

개발자가 직접 변경할 수 없는 예외일 때 사용

 

DefaultHandlerExceptionResolver

스프링 내부에서 발생하는 스프링 예외 해결

>> TypeMismatchException 처리

 

@ControllerAdvice

정상 코드와 예외 처리 코드를 분리

 

대상으로 지정한 여러 컨트롤러에 @ExceptionHandler, @InitBinder 기능 부여하는 역할

대상을 지정하지 않으면 모든 컨트롤러에 글로벌 적용

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 김영한, 스프링 MVC 2편, 백엔드 웹 개발 활용 기술

 

'Spring' 카테고리의 다른 글

MVC / 파일 업로드  (0) 2025.04.18
MVC / 스프링 타입 컨버터  (0) 2025.04.16
MVC / 예외 처리와 오류 페이지  (0) 2025.04.14
MVC / 로그인 처리 - 필터, 인터셉터  (0) 2025.04.13
MVC / 로그인 처리 - 쿠키, 세션  (0) 2025.04.12