API 예외 처리 기본 체크
API 예외 처리에 대해 공부했는데 API 경우 일반적인 오류 페이지 말고도 생각할 게 많다.
API는 오류 상황에 맞는 응답 스펙과 JSON으로 데이터를 내보내야 한다.
먼저 WAS에 예외가 전달되거나 response.sendError()가 호출되면 등록된 예외 페이지 경로를 호출하는 WebSErverCustomizer에 Component 주석을 풀어줬다.
private String memberId;
private String name;
간단하게 DTO를 만들고
@GetMapping("/api/members/{id}")
public MemberDto getMember(@PathVariable("id") String id) {
if (id.equals("ex")) {
throw new RuntimeException("잘못된 사용자");
}
return new MemberDto(id, "hello " + id);
RestController를 만들어 줬다.
GetMapping id에 ex가 오면 RuntimeException을 발생시키고 그게 아니면 아래 return이 실행된다.
이제 PostMan으로 테스트를 진행하면 HTTP Header에 Accept가 application/json 형식일 때 ex 외 값이 들어오면 위에 출력이 정상적으로 되고, ex가 들어오면 예외 발생을 호출한다.
여기서 문제는 API로 요청해서 오류가 발생하면 JSON 형식 데이터가 아닌 오류 페이지 HTML이 반환이 되는데 클라이언트는 항상 JSON 데이터를 원하기 때문에 오류 페이지 또한 JSON으로 응답이 가능하게 코딩해 주어야 한다.
@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");
// HashMap은 순서를 보장하지 않아 아래 코딩한 순서대로 나오지 않을 수도 있다.
HashMap<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와 값 설정을 통해 요청이 Accept 값이 application/json 일 때 해당 메서드가 호출되게 한다. 응답 데이터를 위해 Map를 만들고 status와 message키에 값을 할당했다. Jackson 라이브러리는 Map을 JSON 구조로 변환할 수 있다.
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.
'Framework & Library > Spring Boot' 카테고리의 다른 글
[Spring Boot] : HandlerExceptionResolver 시작하기 (0) | 2022.03.04 |
---|---|
[Spring Boot] : API 예외 처리 스프링 부트 기본 오류 처리 (0) | 2022.03.03 |
[Spring Boot] : BasicErrorController가 model에 담는 정보 (0) | 2022.03.01 |
[Spring Boot] : BasicErrorController 오류 페이지 (0) | 2022.02.28 |
[Spring Boot] : 인터셉터 예외 처리 (0) | 2022.02.25 |
댓글