<aside> 📖 <목차>

</aside>


api니까 postman 사용

Untitled

Untitled

acceptapplication/json 으로 되어 있어야한다.

서버입장에서는 당연하게 html을 읽어주는데, 이제 클라이언트 입장에서는 지금 json 통신, api로 json통신 해야 하는데 갑자기 오류 났다고 해서 이렇게 html이 오게 되면 그냥 뭐 로그인 뭐 이런걸 뿌릴 수 있겠지만, 할 수 있는 것이 없게된다. → 즉, 클라이언트가 원하는 바가 아니다. 또한 클라이언트는 정상 요청이든, 오류 요청이든 JSON이 반환되기를 기대한다.

서블릿의 ErrorPageController에 해당 기능을 추가해주면 되는 것이다.

다시 말해, API를 요청했는데, 정상의 경우 API로 JSON 형식으로 데이터가 정상 반환된다. 그런데 오류가 발생하면 우리가 미리 만들어둔 오류 페이지 HTML이 반환된다. 이것은 기대하는 바가 아니다. 클라이언트는 정상 요청이든, 오류 요청이든 JSON이 반환되기를 기대한다. 웹 브라우저가 아닌 이상 HTML을 직접 받아서 할 수 있는 것은 별로 없다. 문제를 해결하려면 오류 페이지 컨트롤러도 JSON 응답을 할 수 있도록 수정해야 한다.

//api 에러처리 기능 추가
    @RequestMapping(value = "/error-page/500", produces = MediaType.APPLICATION_JSON_VALUE)
    // MVC1 에서 배운 클라이언트가 여기 보내는 accept 타입(postman)에 따라서 이게 뭐가 호출 될 거야 라는 것.
    public ResponseEntity<Map<String, Object>> errorPage500Api(
            HttpServletRequest request, HttpServletResponse response) {

        log.info("API errorPage 500");

        Map<String, Object> result = new HashMap<>();
        Exception ex = (Exception) request.getAttribute(ERROR_EXCEPTION);
        result.put("status", request.getAttribute(ERROR_STATUS_CODE));
        result.put("message", ex.getMessage());

        Integer statusCode = (Integer) request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
        return new ResponseEntity<>(result, HttpStatus.valueOf(statusCode));//JSON 이니까 http 응답 바디에 바로 데이터를 쏟는 것이다. response entity 라고 한다면. -> mvc1 편 api 참고
    }

produces = MediaType.APPLICATION_JSON_VALUE 의 뜻은 클라이언트가 요청하는 HTTP Header의 Accept 의 값이 application/json 일 때 해당 메서드가 호출된다는 것이다. 결국 클라어인트가 받고 싶은 미디어타입이 json이면 이 컨트롤러의 메서드가 호출된다. 응답 데이터를 위해서 Map 을 만들고 status , message 키에 값을 할당했다. Jackson 라이브러리는 Map 을 JSON 구조로 변환할 수 있다.

ResponseEntity 를 사용해서 응답하기 때문에 메시지 컨버터가 동작하면서 클라이언트에 JSON이 반환된다.

포스트맨을 통해서 다시 테스트 해보자. HTTP Header에 Acceptapplication/json 인 것을 꼭 확인하자.

  {			
			"message":"잘못된 사용자",
      "status": 500
  }

HTTP Header에 Acceptapplication/json 이 아니면, 기존 오류 응답인 HTML 응답이 출력되는 것을 확인할 수 있다.


API 예외 처리 - 스프링 부트 기본 오류 처리API

예외 처리도 스프링 부트가 제공하는 기본 오류 방식을 사용할 수 있다. 스프링 부트가 제공하는 BasicErrorController 코드를 보자