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 |