공부기록/TIL

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

또리머 2022. 12. 20. 19:25
반응형

💭 오늘의 학습 전략

# 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로 전달되는 것은 어떻게 처리하게 될지 궁금하다.

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

반응형