관리 메뉴

개발하는 동그리

[Spring] Spring MVC - 예외 처리 본문

IT 정보/Spring

[Spring] Spring MVC - 예외 처리

개발하는 동그리 2022. 7. 4. 13:55
반응형

예외 종류

  • 유효성 검증에서 발생하는 예외
  • 서비스 계층의 비지니스 로직에서 던져지는 의도된 예외
  • 애플리케이션 실행 중 발생하는 예외

Exceptional Handler ( Controller 레벨에서 예외처리 )

  • @ExceptionalHandler 애너테이션을 사용
@ExceptionHandler
    public ResponseEntity handleException(MethodArgumentNotValidException e) {
				// (1)
        final List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();

				// (2)
        return new ResponseEntity<>(fieldErrors, HttpStatus.BAD_REQUEST);
  • 유효성 검증 과정에서 내부로 던져진 MethodArgumentNotValidException을 handlExcption 메서드가 전달 받음
  • 리턴값으로 e.getBindingResult().getFieldErrors() 를 통해 에러 정보를 확인 할 수 있다. 

 

ErrorResponse 클래스

  • 에러 정보만 클라이언트에 전달하기 위한 클래스
@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;
    }
}

 

handleException 수정

 @ExceptionHandler
    public ResponseEntity handleException(MethodArgumentNotValidException e) {
				// (1)
        final List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();

				// (2)
        List<ErrorResponse.FieldError> errors =
                fieldErrors.stream()
                            .map(error -> new ErrorResponse.FieldError(
                                error.getField(),
                                error.getRejectedValue(),
                                error.getDefaultMessage()))
                            .collect(Collectors.toList());

        return new ResponseEntity<>(new ErrorResponse(errors), HttpStatus.BAD_REQUEST);

 

@RestControllerAdvice 이용한 예외처리

  • 코드 중복 문제 개선
  • 기존 Controller 클래스 내 @exceptionHandler 메서드를 모두 제거
  • 공통 예외처리할 GlobalExceptionAdvice 클래스 생성 ( @RestControllerAdvice 추가 )
  • GlobalExceptionAdvice 클래스에 제거한 @ExceptionHandelr 메서드 추가

 


Pass

 

체크 예외 / 언체크 예외

  • 체크 예외
    • 대표적인 예) ClassNotFountException : 예외를 잡아서 체크하고 복구 or 회피 구체적인 처리 진행
  • 언체크 예외
    • 대표적인 예) NullPointException, ArrayIndexOutBoundsException
    • 코드를 잘못 입력해서 발생하는 오류는 대부분 runtimeException을 상속한 예외
    • 자바나 스프링에서 runtimeException을 지원하지만 개발자가 직접 예외를 만들경우도 존재한다. 

 

개발자의 의도적 예외

  • 백엔드 서버와 외부 시스템의 연동에서 발생하는 에러
  • 시스템 내부의 리소스가 부재한 경우

 

의도적 예외 방법

  • throw 키워드를 이용해서 예외를 메서드 밖으로 던지면, 메서드를 호출한 지점으로 던져진다. 따라서 우리는 GlobalException Advice를 공통화 해 두었으므로, 해당 클래스에서 처리할 수 있다. 
  • enum ExceptionCode 정의
public enum ExceptionCode {
    MEMBER_NOT_FOUND(404, "Member Not Found");

    @Getter
    private int status;

    @Getter
    private String message;

    ExceptionCode(int status, String message) {
        this.status = status;
        this.message = message;
    }
}

Pass

 

반응형