인프런 커뮤니티 질문&답변

ckdgus1713님의 프로필 이미지
ckdgus1713

작성한 질문수

[개정판 2023-11-27] Spring Boot 3.x 를 이용한 RESTful Web Services 개발

Spring AOP를 이용한 Exception Handling

Spring AOP를 이용한 Exception Handling

작성

·

510

·

수정됨

0

@ExceptionHandler(UserNotFoundException.class)
public final ResponseEntity<Object> handleUserNotFoundException(Exception ex, WebRequest request) {
    ExceptionResponse exceptionResponse =
       new ExceptionResponse(new Date(), ex.getMessage(), request.getDescription(false));

    return new ResponseEntity<>(exceptionResponse, HttpStatus.NOT_FOUND);
}

 강의에서 WebRequest를 이용하여 exception handling을 하고 있는데,
아래처럼 BindingResult를 사용하는 방법과 어떤 부분이 다른가요? 개발 스타일에 따라 사용하면 될까요?

 

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
    List<String> errorMessages = e.getBindingResult().getFieldErrors()
       .stream()
       .map(FieldError::getDefaultMessage)
       .collect(Collectors.toList());

    String combinedErrorMessage = String.join(", ", errorMessages);
    return ResponseEntity.badRequest().body(new ErrorResponse(combinedErrorMessage));
} 

 

답변 1

0

Dowon Lee님의 프로필 이미지
Dowon Lee
지식공유자

안녕하세요, 이도원입니다.

WebRequest 에러를 다루는 객체라기 보다는 웹 요청에 대한 일반적인 인터페이스입니다. 주로 웹 요청 시인터셉터용을 사용되어 요청에 대한 메타데이터 등을 제공합니다. 반면에, BindingResult는 검증 오류가 발생할 경우 해당 오류의 내용을 저장하고 있는 객체입니다. 따라서, WebRequest와 BindingResult는 2개가 동일한 작업을 하는 용도가 아니기 때문에, 비교 대상으로 보기에는 무리가 있지 않을까 싶습니다. 다만, 요청 된 정보에 Validation 오류가 발생 되었을 경우, 에러 자체를 핸들링하는 부분에서 WebRequest를 활용해 어떤 요청 정보였는지 확인해 보는 것과, 에러 자체를 저장하는 객체를 활용하여 내용을 확인해 본 다는 측면에서는 유사한 에러 제어가 될 수도 있을 것 같습니다. 두 객체의 특성과 개발 상황을 고려하여 적용해 보시면 좋을 것 같습니다.

추가로, MethodArgumentNotValidException 에서 Validation 예외를 Intercept 하여 처리할 때, ResponseEntityExceptionHandler 클래스에서 임지 구현한 내용과 충돌되어 Ambiguous @ExceptionHalder 오류가 발생 할 수 있을 것 같습니다. (실제로 제가 테스트한 3.1.5 버전에서 발생했습니다) 아래와 같이 handleMethodArgumentNotValid 메소드에서 재정하여 테스트해 보시면 될 것 같습니다.

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                              HttpHeaders headers,
                                                              HttpStatusCode status,
                                                              WebRequest request) {
    List<String> errorMessages = ex.getBindingResult().getFieldErrors()
            .stream()
            .map(FieldError::getDefaultMessage)
            .collect(Collectors.toList());

    String combinedErrorMessage = String.join(", ", errorMessages);
    return ResponseEntity.badRequest().body(new ErrorResponse(combinedErrorMessage));
}

감사합니다.

ckdgus1713님의 프로필 이미지
ckdgus1713

작성한 질문수

질문하기