[Exception] status code 변경하기

DEINGVELOP·2022년 9월 14일
0
post-custom-banner

해결해야 했던 trouble

image
👉🏻 제대로 API 메소드가 수행되지 않아 ERROR CODE를 보내주었음에도 status code는 200으로 응답되었다.


status 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());
    }
}



해결 완료된 결과

image

post-custom-banner

0개의 댓글