Spring에서 @ControllerAdvice를 활용한 Exception 처리

2018-07-17 22:06

오늘 강의 진행하면서 html과 json 요청에 대해 error 처리를 다르게 하고 싶다는 요구가 있었다. Header에서 Accept 값을 추출하고 별짓을 다했는데 다음과 같이 각 요청에 따라 분리처리하면 되겠다.

html 요청의 경우 Controller 애노테이션을 사용하고 json 요청 처리를 위해 RestController를 사용한다면 다음과 같이 @ControllerAdvice를 설정함으로써 가능하겠다.

@ControllerAdvice(annotations = Controller.class)
public class SecurityControllerAdvice {
    private static final Logger log = LoggerFactory.getLogger(SecurityControllerAdvice.class);

    @ExceptionHandler(UnAuthenticationException.class)
    @ResponseStatus(value = HttpStatus.UNAUTHORIZED)
    public String unAuthentication() {
        log.debug("UnAuthenticationException is happened!");
        return "/user/login";
    }
}

json 요청의 경우 경우 RestController로 제한

@RestControllerAdvice(annotations = RestController.class)
public class RestSecurityControllerAdvice {
    private static final Logger log = LoggerFactory.getLogger(RestSecurityControllerAdvice.class);

    @ExceptionHandler(UnAuthenticationException.class)
    @ResponseStatus(value = HttpStatus.UNAUTHORIZED)
    public ErrorMessage unAuthentication(UnAuthenticationException e) {
        log.debug("JSON API UnAuthenticationException is happened!");
        return new ErrorMessage(e.getMessage());
    }
}

위와 같이 처리하거나 다음과 같이 Accept Header를 활용한 처리도 가능하다.

@ControllerAdvice
@RequestMapping(produces = "application/vnd.error+json")
public class PersonControllerAdvice {
}

Global exception handling with @ControllerAdvice 문서를 참고하면 패키지로 제한하는 등의 더 다양한 설정을 볼 수 있다.

그나 저나 이 문서와 설정은 이전에도 봤던 것 같은데 오늘 아무리 찾아도 찾을 수 없었다. 아무래도 늙어가는 징조인 듯하다.

0개의 의견 from SLiPP

의견 추가하기