개발 무지렁이

[Spring] 예외처리 @ExceptionHandler와 국한되지 않는 예외처리 SimpleMappingExceptionResolver 본문

Backend/스프링

[Spring] 예외처리 @ExceptionHandler와 국한되지 않는 예외처리 SimpleMappingExceptionResolver

Gaejirang-e 2023. 5. 5. 18:34

예외처리 annotation, @ExceptionHandler


@ExceptionHandler 메서드를 만든 controller 영역에서만 유효함.
(특정 컨트롤러에만 국한된다.)

  @Controller
  public class ExceptionController {
      private static final Logger logger = LoggerFactory.getLogger(ExceptionController.class);

      @RequestMapping("/exception.do")
      public ModelAndView ex(String no) {
          logger.info("no: " + no);
          int converNo = Integer.parseInt(no);

          int result = 100 / convertNo; // ArithmeticException

          logger.info("exception.do 요청됨.. converNo: " + converNo);
          return new ModelAndView("exResult", "message", "예외실습결과입니다.");
      }

      /**
      * 현재 컨트롤러를 실행했을 때, 발생하는 예외처리
      * */
      @ExceptionHandler(value = {ArithmeticException.class})
      public ModelAndView error(Exceptioin e) {
          logger.info("예외가 발생했어요");
          ModelAndView mv = new ModelAndView();
          mv.setViewName("error/errorMessage");
          mv.addObject("errMsg", "예외가 발생했습니다."); // ${errMsg}
          mv.addObject("errClass", e.getMessage());
          return mv;
      }
  }
📌. log4j
: file이나 console창흐름을 로그로 기록
  <!-- Application Loggers -->
  <logger name="web.mvc.controller">
      <level value="info" />
  </logger>  

특정 컨트롤러에만 국한되지 않도록, SimpleMappingExceptionResolver


⚠️. 단, 직접 예외처리한 것이 우선순위다.

[servlet-context.xml]

  <annotation-driven />
  <context:component-scan base-package="web.mvc.controller" />

  <beans:bean
      class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <beans:property name="exceptionMappings">
        <beans:props>
            <beans:prop key="java.lang.ArithmeticException">
              error/number
              </beans:prop>  
        </beans:props>  
    </beans:property>
  </beans:bean>  

예외처리 설정을 JavaBase기반으로 생성, @annotation


springframework 내부에 있는 클래스이기 때문여서 클래스 위에 @Component를 붙일 수 없다.
(실체를 가지고 있지 않기 때문에)

[AppConfig.java]

  // @Component
  // class SimpleMappingExceptionResolver {
      // 실체를 가지고 있지 않다.
  // }

  @Configuration
  class AppConfig {
      @Bean // method 위에 선언
      public SimpleMappingExceptionResolver aa() {
          return new SimpleMappingExceptionResolver();
      }
  }
📌. @Configuration // 환경설정을 돕는 클래스
: 이 어노테이션 안에서 @Bean을 찾아 메모리에 올려준다.
Comments