Cute Running Puppy
본문 바로가기
개발일기/Java

커스텀 한 예외를 글로벌로 예외 처리하기

by 징구짱 2023. 3. 17.
728x90

글로벌 예외 처리를 해보니

  • 오류별로 묶어서가 아닌 내 마음 대로 status를 다르게 하고 싶음
  • 넘겨줄 컬럼을 내가 지정하고 싶음

 

이를 해결하기 위해 예외를 내가 커스텀하여 글로벌로 예외처리를 해보았다.

 

 

RestApiExceptionHandler

  • 글로벌 예외 처리에서 커스텀 한 예외 처리를 어떻게 하는지
    • IllegalArgumentException으로 통째로 처리하면 HttpStatus를 한 상태만 보내주게 됨
    • 이것을 Enum으로 상태, 메세지를 정의하고 가져오고 싶어서 Exception을 커스텀 하게 됨
@ExceptionHandler(value = { CustomException.class })
public ResponseEntity<Object>  CustomhandleApiRequestException(CustomException ex) {
    // ExceptionDto는 화면에 보여줄 내용을 정의
    return ResponseEntity.status(ex.getCustomErrorEnum().getStatus()).body(new CustomExceptionDto(ex));
}

 

CustomErrorEnum

  • 예외 처리의 Enum을 정의 (HttpStatus와 메세지를 사용할 수 있게 정의하였다.)
@Getter
@AllArgsConstructor
public enum CustomErrorEnum {
    NOROLE(HttpStatus.UNAUTHORIZED, "권한 없숩"),
    NOPOST(HttpStatus.BAD_REQUEST, "게시글 없숨");
    private HttpStatus status;
    private String message;
}

 

CustomException

  • CustomErrorEnum으로 예외 처리를 하도록 Exception class를 커스텀 함
@Getter
public class CustomException extends RuntimeException {
    private CustomErrorEnum customErrorEnum;

    public CustomException(CustomErrorEnum customErrorEnum) {
        this.customErrorEnum = customErrorEnum;
    }
}

 

Service

  • 커스텀 예외 처리 예시
throw new CustomException(CustomErrorEnum.NOROLE)

 

CustomExceptionDto

  • 예외 처리의 정보를 클라이언트로 보내줄 형태 (errorCode, httpStatus, 메세지를 날릴 예정)
@Getter
@Setter
public class CustomExceptionDto {
    private int errorCode;
    private HttpStatus httpStatus;
    private String msg;

    public CustomExceptionDto(CustomException ex) {
        this.errorCode = ex.getCustomErrorEnum().getStatus().value();
        this.httpStatus = ex.getCustomErrorEnum().getStatus();
        this.msg = ex.getCustomErrorEnum().getMessage();
    }
}
728x90