2022/12/20 TIL | 예외 처리_Spring MVC에서의 예외 처리

    반응형

    💭 오늘의 학습 전략

    # Spring MVC에서의 예외 처리

     @ExceptionHandler

    ◽ @RestControllerAdvice

    🌼 학습한 것들

    ◾ @ExceptionHandler 실습

     - 먼저, Controller에 예외처리 메서드 작성할 때

       ▪️ 유효성 검사 예외 핸들러를 만든다고 가정하면 MethodArgumentNotValidException 타입을 인자로 받는 메서드 생성

       ▪️ 메서드에 @ExceptionHandler를 달아준다

       ▪️ e.getBindingResult().getFieldError() --> List<FieldError> 타입의 response return 가능

     - 여기서, 에러 정보를 기반으로 한 ErrorResponse 객체로 필요한 정보만 return해보기

    @Getter
    @AllArgsConstructor
    public class ErrorResponse {
    
        private List<FieldError> fieldErrors;
    
        @Getter
        @AllArgsConstructor
        public static class FieldError {
            private String field;
            private Object rejectedValue;
            private String message;
        }
        
    }

       ▪️ 여기서 FieldError는 이너클래스라기 보다 static member 클래스 개념으로 이해하기

     - 단점

       ▪️ 필요한 에러 정보만 내보내줄 수 있지만

       ▪️ 1) 컨트롤러마다 처리 메서드 작성 -> 코드 중복 발생

       ▪️ 2) MethodArgumentNotValidException만 처리해야하는 것이 아님 -> 에러 핸들러 메서드 늘어남(유연하지 않은 방식)

     

    @RestControllerAdvice 실습

     - 예외 처리 공통화

     - ErrorResponse 생성자를 private로 한 이유: 객체 생성과 동시에 역활을 명확히

       => ErrorResponse 클래스 내부 of()를 통해 객체 생성

       => of()에서 또 필드(FieldError 등).of()로 위임: 객체 에러 정보 담는 역할 명확히 분리

     - GlobalExceptionHandler에서 에러 핸들링

       ▪️ @RestControllerAdvice 달아주기

       ▪️ 내부 에러 핸들러 메서드에는 @ExcptionHandler, @ResponseStatus(HttpStatus) 달아주기

     - @RestControllerAdvice = @Controller + @ResponseBody

       => ResponseEntity로 래핑할 필요 업슴

    🔥 보충이 필요한 것들

    ◾ 여러가지 에러 다뤄보기

     

     

    💨 하루를 마치며

    1. 정말정말 잼난 실습이었다~

    2. 그 전에는 에러를 전역적으로(?) 처리하는 법을 잘 몰랐다. 그래서 더 재미있고 유익한 챕터였다.

    3. 예외를 다루다보니 벌써부터 프로젝트 생각을 하게 된다...

    4. 이전 회고에서 궁금했던 점은 여기서 해결되었다!! 시스템 자체적으로 코드를 다루고 싶으면 필드를 따로 두고 처리해주면 좋을 것 같다.

    5. 앞으로 에러가 동시에 날 때, 하나만 날 때 다른 필드가 null로 전달되는 것은 어떻게 처리하게 될지 궁금하다.

    추가) 주로 예외 응답 객체를 같은 필드로 구성해서 통일시키거나, 다른 클래스로 분리해서 사용하는 것 같다. 내 생각에는 필드를 통일해주는 게 좋은 것 같다.

    반응형

    댓글