• 티스토리 홈
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 마스터하기 예외처리 8
        2022년 06월 19일
        • starryeye
        • 작성자
        • 2022.06.19.:09
        반응형

        이전 포스팅까지...

        HandlerExceptionResolver를 직접 상속받으며 활용하는 방법을 알아봤다..

        -> 개발량도 많고 개발하기에 불편한 점이 많았다..

         

        이러한 문제를 해결해주는..

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

        1. ExceptionHandlerExceptionResolver : @ExceptionHandler 처리

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

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

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

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

         

        ResponseStatusExceptionResolver

        아래 두가지 경우를 처리해준다.

        - 개발자가 만든 Exception에 @ResponseStatus가 달려있는 경우..

        - ResponseStatusException 예외 자체를 생성하여 던질 경우

         

         

        @ResponseStatus를 사용한 예외

        위와 같이 개발자가 예외를 정의할 때, @ResponseStatus 어노테이션을 사용해준다.

        (예제에선 RuntimeException을 상속받아 사용하도록 함.)

        이렇게 정의를 해놓고 컨트롤러에서 이 예외가 터지도록 해놓으면..

        원래 예외는 500으로 처리되지만 @ResponseStatus로 400 리턴되게 해놨기 때문에 400으로 적용된다.

        reason은 예외 메세지이다.

         

         

        ResponseStatusException 예외 자체를 생성하여 던질 경우

        위와 같이 응답 상태코드(예시 404)와 예외 메세지, 실제 예외를 파라미터로 하여 생성하면 된다.

        @ResponseStatus를 사용한 개발자 정의 예외 방법을 통해서는..

        시스템, 라이브러리에서 제공하는 예외는 코드를 못고치기 때문에 제약이 있다..

        그래서 ResponseStatusException 을 생성하는 방법으로 사용하면 된다.

        (예시에서 IllegalArgumentException을 처리하는 것을 볼 수 있다.)

         

         

        위 두가지 경우에 대해 ResponseStatusExceptionResolver가 동작되는 과정을 알아보자

        위 코드는 ResponseStatusExceptionResolver의 doResolveException 메서드이다.

        ResponseStatusExceptionResolver는 HandlerExceptionResolver를 구현하고 있다.

        HandlerExceptionResolver의 ResolveException메서드가 호출되면 doResolveException이 호출된다.

         

        ResponseStatusException 예외 자체를 생성하여 던질 경우에는

        resolveResponseStatusException 메서드가 호출되며

         

        @ResponseStatus를 사용한 예외가 처리될 때는

        resolveResponseStatus 메서드가 호출된다.

         

        <순서>

         예외가 터짐

        -> ResponseStatusExceptionResolver가 처리시도한다. (우선순위 2번째)

        -> doResolveException 메서드 호출

        -> ResponseStatusException 예외 인지.. @ResponseStatus 어노테이션이 있는 예외 인지..

        -> 첫번째 예외라면 resolveResponseStatusException메서드 호출

        -> 두번째 예외라면 resolveResponseStatus 메서드 호출

        -> 상태코드, 메세지 얻기

        -> applyStatusAndReason 메서드 호출

        -> sendError로 WAS가 알수있게 예외를 만들어주고, 빈 ModelAndView를 생성하여 정상 리턴

         

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

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

         

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

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

         

        <참고>

        2가지 경우에 따른 예외 등록 및 생성 시, reason 요소 및 예외 메세지 파라미터에

        error.bad 와 같이 입력 해두고 messages.properties와 같은 properties에서 메세지 관리 가능

        (applyStatusAndReason 메서드에서 messageSource를 활용하여 찾는 것을 볼 수 있다.)

         

        반응형

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

        Spring MVC 마스터하기 예외처리 10  (0) 2022.06.19
        Spring MVC 마스터하기 예외처리 9  (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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바