예외 API 응답
개요
- 지금까지 예외 발생시, 오류 페이지로 응답하는 방법에 대해 알아보았다.
- 만약 예외발생시 API 스타일로, JSON 응답을 하려면 어떻게 해야할까?
- 그리고
BasicErrorController
의 한계는 무엇일까?
BasicErrorController
기능
BasicErrorController
의 자세한 내용은 이전 게시글을 참고하자.
BasicErrorController
는 아래와 같이 두 가지 기능을 제공한다.
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {}
@RequestMapping
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {}
errorHtml(...)
@RequestMapping(produces = MediaType.TEXT_HTML_VALUE)
- 클라이언트 요청의 Accept 헤더 값이
text/html
인 경우에 호출된다.
- 클라이언트 요청의 Accept 헤더 값이
ModelAndView
를 반환하며, 뷰를 제공한다.
error(...)
- 그외 경우에 호출된다.
ResponseEntity
로 반환하며, HTTP Body에 JSON 데이터(에러정보)를 반환한다.
- 스프링은 오류 발생시, 기본적으로
/error
를 내부요청한다.BasicErrorController
는/error
요청을 처리한다.- 이때, 요청의 Accept 헤더가
text/html
이면,errorHtml(...)
이 매핑된다. - 이때, 요청의 Accept 헤더가
application/json
이면,error(...)
가 매핑된다.
- 이때, 요청의 Accept 헤더가
BasicErrorController
활용하여 에러 API 응답
이전 게시글에서 작성한 프로젝트를 그대로 사용한다.
- 기본적으로 스프링이
BasicErrorController
를 통해, 에러 API 응답을 지원하므로, 따로 소스코드를 작성할 필요가 없다.
요청
- Postman 프로그램으로 테스트해보자.
- 반드시
Accept
헤더의 값이application/json
이어야 한다.
응답
BasicErrorController
의 한계점
에러 HTML 페이지 제공시
- 해당 상황에서는 별다른 문제없이, 편리하게 사용할 수 있다.
에러 API(JSON) 제공시
- API 마다, 각각의 컨트롤러나 예외마다 서로 다른 응답 결과를 출력해야 할 수도 있다.
- 즉 어떤 종류의 예외, 어떤 컨트롤러 등의 상관없이 모두 일정한 형식의 JSON 데이터로 응답한다.
- 따라서
BasicErrorController
는 HTML 응답시에만 사용하는 것을 권장한다.
정리
BasicErrorController
는 HTML 응답시에만 사용하자!BasicErrorController
으로 API(JSON) 응답을 하기에는, 기능이 너무 단순하다.
다음 게시글에 이어서 API 응답에 대해 설명하도록 하겠다.
- 본 게시글은 김영한님의 강의를 토대로 정리한 글입니다.
- 더 자세한 내용을 알고 싶으신 분들이 계신다면, 해당 강의를 수강하시는 것을 추천드립니다.