👉🏻 제대로 API 메소드가 수행되지 않아 ERROR CODE를 보내주었음에도 status code는 200으로 응답되었다.
👉🏻 클라이언트 단에서 에러코드가 잡히지 않아 클라이언트단에서 한 번 더 처리해야 함
👉🏻 그리고, 에러가 발생하여 메소드가 실행되지 않았고 에러 코드를 보냈는데 status가 200인 것은 전혀 RESTful하지 않은 방법이다!
📌 잘못된 설계이니 수정이 필수이다. 웹의 설계를 그대로 사용하는 경우 많이 하는 실수이다.
참고 : API가 아닌 HTML 웹 프로젝트에서는 대부분 내가 작성한 코드와 같이 모든 응답을 200으로 처리하고 body내용으로 성공/실패를 판단하지만, API에서는 많이 이상한 구조이다.
👉🏻 다양한 방법이 있음
1. Exception을 통해 ResponseEntity의 httpStatus 속성을 이용하여 변경한다.
2. response.sendError(HTTP 상태코드, 오류메시지)를 이용하여 변경한다.
그 중 내가 해결한 방법은 1번 ResponseEntity를 이용해서이다.
Exception들의 Status 변경 기능을 한 번에 관리하기 위해 GlobalExceptionController를 만들었다.
GlobalExceptionController
@RestControllerAdvice
public class GlobalExceptionController {
@ExceptionHandler
public ResponseEntity<ResponseDto> EmptyValueExceptionHandler(EmptyValueException exception) {
return new ResponseEntity<>(ResponseDto.fail(ErrorCode.EMPTY_VALUE), HttpStatus.BAD_REQUEST);
}
@ExceptionHandler
public ResponseEntity<ResponseDto> ExpiredAccessTokenExceptionHandler(ExpiredAccessTokenException exception) {
return new ResponseEntity<>(ResponseDto.fail(ErrorCode.EXPIRED_ACCESS_TOKEN), HttpStatus.UNAUTHORIZED);
}
... (이하 생략)
EmptyValueException
public class EmptyValueException extends RuntimeException {
public EmptyValueException(ErrorCode errorCode) {
super(errorCode.getMessage());
}
}