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로 전달되는 것은 어떻게 처리하게 될지 궁금하다.
추가) 주로 예외 응답 객체를 같은 필드로 구성해서 통일시키거나, 다른 클래스로 분리해서 사용하는 것 같다. 내 생각에는 필드를 통일해주는 게 좋은 것 같다.