스프링 MVC 2편(백엔드 웹 개발 활용 기술)

Ch09. API 예외 처리 - API 예외 처리 시작

webmaster 2022. 3. 21. 11:55
728x90
  • API 예외 처리는 어떻게 해야 할까?
    • 오류 페이지는 단순히 고객에게 오류 화면을 보여주고 끝이지만, API는 각 오류 상황에 맞는 오류 응답 스펙을 정하고, JSON으로 데이터를 내려주어야 한다

ApiController

@Slf4j
@RestController
public class ApiExceptionController {

    @GetMapping("/api/members/{id}")
    public MemberDto getMember(@PathVariable("id") String id){
        if(id.equals("ex")){
            throw new RuntimeException("잘못된 사용자");
        }
        return new MemberDto(id, "hello " + id);
    }

    @Data
    @AllArgsConstructor
    static class MemberDto{
        private String memberId;
        private String name;
    }
}
  • 예외 테스트를 위해 URL에 전달된 id의 값이 ex 이면 예외가 발생하도록 코드를 심어두었다
  • 오류가 발생하면 우리가 미리 만들어둔 오류 페이지 HTML이 반환된다.
  • 클라이언트는 정상 요청이든, 오류 요청이든 JSON이 반환되기를 기대한다. 웹 브라우저가 아닌 이상 HTML을 직접 받아서 할 수 있는 것은 별로 없다

에러 페이지에서 JSON 요청을 받도록 ErrorController 수정

@RequestMapping(value = "/error-page/500", produces = MediaType.APPLICATION_JSON_VALUE)
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));
}
  • produces = MediaType.APPLICATION_JSON_VALUE
    • Http header의 값의 Accept가 Application.JSON 형태일 때 해당 메서드 호출
    • 클라이언트에서 허용할 수 있는값이 JSON 타입이어야지 해당 메서드가 호출
  • 응답 데이터에 Status와 Message를 넣어 반환한다.
  • ResponseEntity 를 사용해서 응답하기 때문에 메시지 컨버터가 동작하면서 클라이언트에 JSON이 반환된다.
728x90