• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Spring MVC 마스터하기 예외처리 9
        2022년 06월 19일
        • starryeye
        • 작성자
        • 2022.06.19.:01
        반응형

        스프링 부트가 기본으로 제공하는(등록하는) ExceptionResolver에 대해 계속 알아보자..

        1. ExceptionHandlerExceptionResolver : @ExceptionHandler 처리

        2. ResponseStatusExceptionResolver : Http 상태코드 지정할 수 있는 @ResponseStatus 처리

        3. DefaultHandlerExceptionResolver : 스프링 내부 기본 예외 처리

        위 순서대로 우선순위가 있다.

        (1번 return null이면 다음 ExceptionResolver인 2번이 호출되는 식)

         

        이번엔..

        DefaultHandlerExceptionResolver에 대해 알아보자.

        스프링 내부에서 발생되는 예외를 해결해준다.

         

        BindingResult를 생각해보자.. (Validation 10번 포스팅 참고)

        BindingResult는 Http Form POST 방식, Http 쿼리파라미터 GET 방식에서 유용하다..

        (@ModelAttribute 사용)

        @RequestBody를 사용할 경우에는 HttpMessageConverter가 동작되며

        전체 객체 단위로 바인딩 되기 때문에 타입에러가 생길 경우 Validator가 적용되지 않고 바로 예외 리턴 처리가 된다.

        (타입에러 : TypeMismatchException)

         

        이를 위한 처리 방법이 DefaultHandlerExceptionResolver 이다.

        -> 타입 에러의 경우 ...

        -> 컨트롤러 호출전에 예외가 발생되어버리기 때문에 ResponseStatusExceptionResolver를 사용하지 못하며..

        -> 이를 위한 예외처리가 필요함..

        -> 마찬가지로 서버내부 예외이므로 500을 보내는걸로 처리되지만 사실 클라이언트가 잘못 보낸거기 때문에

        -> 400으로 바꾸고 싶은 상황임.

         

        DefaultHandlerExceptionResolver의 코드를 보며 내부 동작에 대해 알아보자.

        ResponseStatusExceptionResolver 때와 마찬가지로

        HandlerExceptionResolver를 구현하였으며, resolveException 메서드가 호출되면 doResolveException이 호출된다.

         

        발생된 예외가 스프링 내부 예외 중, 타입 에러로 인한 예외가 리턴되면..

        ExceptionResolver들이 호출되는데..

        DefaultHandlerExceptionResolver가 호출되며..

        TypeMisMatcheException 예외 이므로..

        handleTypeMismatch 메서드가 호출된다.

         

        위는 handleTypeMismatch 메서드이다.

        WAS(서블릿 컨테이너)가 알아볼 수 있도록 sendError를 통해 400 에러를 넣어주며

        빈 ModelAndView를 생성하여 리턴한다.(null 리턴이 아니므로 예외가 처리 되었다는 것을 뜻한다.)

        (예외가 WAS까지 갔으면 500으로 처리 될 상황이였지만.. sendError 400으로 넣어주고.. 정상 리턴 시킨다.)

         

        결국 컨트롤러에서 만들어진 예외가 DefaultHandlerExceptionResolver를 통해 예외가 먹히고

        response.sendError로 처리 되는 것을 알 수 있다.

         

        주의 : sendError로 처리 하였기 때문에 WAS에서 다시 BasicErrorController가 호출될 것이다...

        (BasicErrorController에서 accept에 따라 분기 되어 처리 됨)

         

         

         

         

         

        반응형

        'Spring > MVC' 카테고리의 다른 글

        Spring MVC 마스터하기 예외처리 10  (0) 2022.06.19
        Spring MVC 마스터하기 예외처리 8  (0) 2022.06.19
        Spring MVC 마스터하기 예외처리 7  (0) 2022.06.18
        Spring MVC 마스터하기 예외처리 6  (0) 2022.06.18
        Spring MVC 마스터하기 예외처리 5  (0) 2022.06.11
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바