[SpringMVC]예외처리

이용준·2023년 1월 10일
0

Spring

목록 보기
6/6

SpringMVC 기반 애플리케이션에서 예외를 처리하는 방법이 무엇인지, 어떻게 클라이언트에 적절한 메세지를 보내는지 등에 대해 알아본다.

구현시 발생하는 예외

  1. 클라이언트 요청 데이터에 대해 유효성 검증에서 발생하는 예외
  2. 서비스 계층의 비즈니스 로직에서 던져지는 의도된 예외
  3. 웹 애플리케이션 실행 중 발생하는 예외(RuntimeException)
  • 예외 타입
    • Checked Exception
      • 예외 처리 필수
      • try - catch문 활용해 예외 처리 혹은 상위 메소드로 넘김
      • 컴파일 단계에서 체크
    • Unchecked Exception
      • RuntimeException
      • 런타임 단계에서 체크

1) 클라이언트 요청 데이터중 유효성 검증에서 발생하는 예외

@ExceptionHandler를 이용한 예외 처리

  • 특정 예외를 잡아 하나의 메소드에서 공통 처리
  • Controller 클래스 레벨에서 @ExceptionHandler사용시 Controller에서 발생하는 예외 처리 가능
  • 필요한 Error 정보만 담을 수 있는 Error 전용 Response 객체 사용시 클라이언트에게 정보 제공 가능
  • 해당 방식은 Controller마다 동일하게 발생하는 예외 처리에 대한 중복 코드 발생 가능
  • 다양한 유형의 예외 처리에 적절치 않음
@Controller
public class ExceptionHandlingController {

  // @RequestHandler methods
  ...
  
  // Exception handling methods
  
  // 사전에 정의된 예외를 HTTP 상태 코드로 변환
  @ResponseStatus(value=HttpStatus.CONFLICT,
                  reason="Data integrity violation")  // 409
  @ExceptionHandler(DataIntegrityViolationException.class)
  public void conflict() {
    // Nothing to do
  }
  
  // 오류 표시에 사용할 이름 지정
  @ExceptionHandler({SQLException.class,DataAccessException.class})
  public String databaseError() {
    // Nothing to do.  
    // view resolver에 전달되는 오류 페이지의 logical name 반환.
    // Note that the exception is NOT available to this view (it is not added
    // to the model) but see "Extending ExceptionHandlerExceptionResolver"
    // below.
    return "databaseError";
  }

  // Total control - setup a model and return the view name yourself. Or
  // consider subclassing ExceptionHandlerExceptionResolver (see below).
  @ExceptionHandler(Exception.class)
  public ModelAndView handleError(HttpServletRequest req, Exception ex) {
    logger.error("Request: " + req.getRequestURL() + " raised " + ex);

    ModelAndView mav = new ModelAndView();
    mav.addObject("exception", ex);
    mav.addObject("url", req.getRequestURL());
    mav.setViewName("error");
    return mav;
  }
}

@RestControllerAdvice를 이용한 예외 처리

  • 프로젝트 전역에서 발생하는 예외 관리
  • @ControllerAdvice와 달리 응답을 Json으로 내려준다.
  • controller 클래스에서 발생하는 예외 처리하는 클래스 정의
    @RestControllerAdvice
    public class GlobalExceptionAdvice{
    }
  • Exception 핸들러 메서드 로직 추가
    @RestControllerAdvice
    public class GlobalExceptionAdvice{
     @ExceptionHandler
     public ResponseEntity hadleMethodNotValid(MethodArgumentNotValidException e){
       final List<FieldError>fieldErros = e.getBibndingResult().getFieldErrors();
       ...
     }
     
     @ExceptionHandler
     public ResponseEntity handleConstraintViolationException(ConstraintViolationException e){
       return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
     }
    }

2) 비즈니스 로직에서 던져지는 의도된 예외

  • 개발자가 의도적으로 예외를 던질 수 있는 상황
    • 시스템 내부 조회하려는 리소스 없는 경우
    • 의도적 예외 던지기/받기(throw/catch)
  • 사용자 정의 예외 사용

참고

profile
뚝딱뚝딱

0개의 댓글