본문 바로가기

개발/Spring Framework

@ControllerAdvice 를 통한 Exception처리

반응형

spring에서 exception을 처리할 수 있는 방법(4개) 출처

  1. the Controller-Level @ExceptionHandler
  2. the HandlerExceptionResolver
  3. @ControllerAdvice
  4. ResponseStatusException (Spring 5 and Above)

    결국 3번 @ControllerAdvice로 현재 진행중인 시스템에 적용하여 해결하였다.
    @ControllerAdvice는 Spring 3.2에서 지원합니다.

  1. @ControllerAdvice 구현 부분

    @ControllerAdvice
    public class GlobalExceptionController {
    
     @ExceptionHandler(CustomGenericException.class)
     public ModelAndView handleCustomException(CustomGenericException ex) {
         ModelAndView model = new ModelAndView("/common/error/error");
         model.addObject("errCode", ex.getErrCode());
         model.addObject("errMsg", ex.getErrMsg());
         return model;
     }
    
     @ExceptionHandler(Exception.class)
     public ModelAndView handleAllException(Exception ex) {
         ModelAndView model = new ModelAndView("/common/error/error");
         return model;
     }
    }

    controller 전역에서 CustomGenericException이 발생하면 handlerCustomException 메서드로 들어온다.

  2. CustomGenericException 구현 부분 Model 역할을 한다

    public class CustomGenericException extends RuntimeException {
    
       private static final long serialVersionUID = 1L;
    
       private int errCode;
       private String errMsg;
    
       public int getErrCode() {
           return errCode;
       }
    
       public void setErrCode(int errCode) {
           this.errCode = errCode;
       }
    
       public String getErrMsg() {
           return errMsg;
       }
    
       public void setErrMsg(String errMsg) {
           this.errMsg = errMsg;
       }
    
       public CustomGenericException(int errCode, String errMsg) {
           this.errCode = errCode;
           this.errMsg = errMsg;
       }
    
       public CustomGenericException(CustomError e) {
           this.errCode = e.getCode();
           this.errMsg  = e.getMessage();
       }
    
    }
  3. 에러 정의

    public enum CustomError {
    
       ERR_USER_LIST_NO_AUTHORITY ( 0x1, "회원 리스트 접근 권한이 없음!" ),
       ERR_USER_REGIST_NO_AUTHORITY ( 0x2, "회원 등록 접근 권한이 없음!" );
    
       private Integer code;
    
       private String message;
    
       CustomError( Integer code, String message ) {
           this.code = code;
           this.message = message;
       }
    
       public Integer getCode() {
           return code;
       }
    
       public String getMessage() {
           return message;
       }
    }

    자신이 커스텀으로 만들고 싶은 error는 CustomError에 추가로 선언 한다.

  4. 에러 발생시키는 부분 > 비즈니스 로직 Controller

    @Controller
    public class UserController {
     @RequestMapping( value = "/userRegistForm" )
     public String userRegistForm( HttpSession session, Model model )
       throws Exception {
       UserVo userVo = ( UserVo ) session.getAttribute( CommonUtil.LOGIN_SESSION_NAME );
       if ( "generalUser".equals( userVo.getUsrRt() ) ) { // 권한 확인
         // 해당 권한의 경우 회원 등록 권한이 없음! CustomException 발생
         throw new CustomGenericException(CustomError.ERR_USER_REGIST_NO_AUTHORITY);
       }
       return "/user/userRegistForm";
     }
    
    }

    throw new CustomGenericException(CustomError.ERR_USER_REGIST_NO_AUTHORITY); 을 통해 커스텀 Exception error를 발생시킨다.

  • 파일 구조
반응형
LIST