TIL

다양한 Exception 커스텀하는 방법.

Big Iron 2023. 3. 16. 03:15

나의 경우는 각각의 상황에따라 발생할 수 있는 Exception을 전부 나눠줬다.

@RestControllerAdvice // 요청을 기다리다 exception이 나오면 클라이언트로 보낸다
public class RestApiExceptionHandler {

    @ExceptionHandler(value = {DuplicatedException.class})
    public ResponseEntity<Object> handleApiRequestException(DuplicatedException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST.value()).body(new ExceptionDto(HttpStatus.BAD_REQUEST.value(), ex.getMessage()));
    }
    @ExceptionHandler(value = {IllegalArgumentException.class})
    public ResponseEntity<Object> handleApiRequestException(IllegalArgumentException ex) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED.value()).body(new ExceptionDto(HttpStatus.UNAUTHORIZED.value(),                        ex.getMessage()));
    }
    @ExceptionHandler(value = {InvalidTokenException.class})
    public ResponseEntity<Object> handleApiRequestException(InvalidTokenException ex) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED.value()).body(new ExceptionDto(HttpStatus.UNAUTHORIZED.value(),                       ex.getMessage()));
    }
} 등등...

위의 코드에서 먼저 봐야할 것은 @RestControllerAdvice 어노테이션이다.
해당 어노테이션이 필요한 이유는 Controller에 다양한 오류들이 있을텐데 각각의 오류가 발생하면 @RestControllerAdvice 어노테이션이 달려있는 RestApiExceptionHandler 클래스에서 모든 오류를 처리해 준다고 생각하면 편할 것이다.

그리고 ExceptionDto를 만들어 오류 코드를 어떤 방식으로 내보내줄지 형식을 지정해주면 클라이언트에서 확인하기 편하다.

@Getter
@NoArgsConstructor
public class ExceptionDto {

    private int statusCode;
    private String msg;


    public ExceptionDto(int statusCode, String msg) {
        this.statusCode = statusCode;
        this.msg = msg;
    }


}

나의 경우
오류 코드번호와 오류 메세지를 보내주도록 설정하였다.


내가 했던 방법과 같이 웹에서 일어날 수 있는 오류를 각각 커스텀해주어 사용할 수 있겠지만 enum 타입으로 오류와 오류메세지를 설정해 불러오는 방법도 있다고 한다. 만약 이러한 방법을 사용한다면 코드의 수는 상당히 줄어들 것이고 가독성 좋은 코드가 만들어질 수 있으므로 시간이 된다면 지금 작성해둔 각각의 오류상황을 enum으로 바꿔보는 시간을 갖도록 하겠다