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
'스프링 MVC 2편(백엔드 웹 개발 활용 기술)' 카테고리의 다른 글
| Ch09. API 예외 처리 - HandlerExceptionResolver (0) | 2022.03.21 |
|---|---|
| Ch09. API 예외 처리 - 스프링 부트 기본 오류 처리 (0) | 2022.03.21 |
| Ch08. 예외 처리와 오류 페이지 - 스프링 부트(오류 페이지) (0) | 2022.03.20 |
| Ch08. 예외 처리와 오류 페이지 - 서블릿 예외 처리 (0) | 2022.03.20 |
| Ch07. 로그인 처리(필터, 인터셉터) - ArgumentResolver 활용 (0) | 2022.03.18 |