<CodeStates> Spring 예외처리

한주영·2023년 4월 21일
0

코드스테이츠 학습

목록 보기
17/24

@ExceptionHandler를 이용한 예외처리

spring에서으 예외는 애플리케이션에 문제가 발생한 경우,
이문제를 알려서 처리하는것 뿐만아니라 유효성 검증에 실패했을때와 같이
이 실패를 하나의 예외로 간주하며 예외를 던저셔 처리를 유도

컨트롤러에 핸들러 예외를 처리한 코드

   @ExceptionHandler
   public ResponseEntity handleException(MethodArgumentNotValidException e) {
 // (1)
   final List<FieldError> fieldErrors =e.getBindingResult().getFieldErrors();
        return new ResponseEntity<>(fieldErrors,HttpStatus.BAD_REQUEST);
    }

예를 들어 회원등록과정에서 Request Body의 유효성 검증에 실패 했을때
예외 처리 과정을 볼때
postMember()핸들러 메서드에 요청을 전송후
유효하지않은 요청데이터가 포함되어있을 경우 유효성 검증에 실패해서
MethodArgumentNotValidException예외가 발생후
해당 컨트롤러에서 @ExceptionHandler이 추가된 예외처리 메서드인
handleException()이 있기때문에 유효성 검증과정에서 내부적으로 던져진
MethodArgumentNotValidException을 handleException() 메서드가 전달받는다

ErrorResponse클래스 적용

postman에서 requestbody를 확인해보면 클라이언트 입장에서는 의미를 알수없는정보를 전부포함한 Response Body전체 정보를
전달받을 필요가 없으므로
요청시에 Request Body과 JSON의 프로퍼티 중 문제가된
프로퍼티는 무엇인지 에러메세지 정도만 전달받아도 충분하므로

에러정보를 기반으로 한 Error Response클래스를 생성해서 필요한정보만 전달

import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.List;
@Getter
@AllArgsConstructor
public class ErrorResponse {
  // (1)
  private List<FieldError> fieldErrors;
  @Getter
  @AllArgsConstructor
  public static class FieldError {
      private String field;
      private Object rejectedValue;
      private String reason;
  }
}

@ExceptionHandler 단점

•Controller에 해당 애너테이션을 사용하여 각각의 요청 body유 효성 검증 실패에 대한 에러처리를 하므로 각Controller마다
중복코드가 발생

•Controller에서 처리하는 예외가 유효성 검증 실패에대한 예외만 있는것이 아니기때문에 여러 예외를 처리하기 위한 핸들러 메서드가 늘어남

profile
백엔드개발자가 되고싶은 코린이:)

0개의 댓글