@RestControllerAdvice vs @ControllerAdvice 정리

Jeongkuk Seo
sjk5766
Published in
4 min readFeb 9, 2023

작년에 스프링 예외 처리를 처음 접했을 때 리뷰어 분이 ControllerAdvice 를 언급한 게 기억난다. 또 막상 찾아서 적용한 코드는 RestControllerAdvice 었고, 차이점이 뭔지 궁금했는데 그때나 지금이나 공부할게 너무 많아 정리를 못하고 있다가 이제야 정리한다.

RestControllerAdvice vs ControllerAdvice

공식 문서에 따르면 RestControllerAdvice = ControllerAdvice + ResponseBody이다.

RestControllerAdvice 로 선언하면 컨트롤러에서 리턴하는 값이 응답 값의 body로 세팅되어 클라이언트에게 전달된다.

아래에 IllegalArgumentException 예외를 잡는 RestControllerAdvice 를 선언했다.

@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(IllegalArgumentException.class)
public ResponseMessage<String> handleIllegalArgumentException(IllegalArgumentException e) {
/** ResponseMessage는 statusCode, message, data로 구성된 custom 객체 */
return ResponseMessage.badRequest(e.getMessage());
}
}

postman을 통해 요청했을 때 응답 값을 보면 아래와 같이 정상적으로 응답을 받는다.

{
"statusCode": 400,
"message": "custom exception",
"data": ""
}

만약 위 코드에서 RestControllerAdviceControllerAdvice로 바꾸고 실행한다면 아래 에러를 만날 수 있다.

RestControllerAdvice 가 리턴값을 바로 클라이언트에게 전달하는 것과 달리 ControllerAdvice 는 리턴값을 기준으로 동일한 이름의 view를 찾는다. 여기서는 그 뷰가 없기 때문에 에러가 난다.

ControllerAdvice 에서 ResponseBody 어노테이션을 붙이면 RestControllerAdvice 와 동일하게 작동하지만 굳이 그럴 필요가 있나 싶다. 그럴거면 처음부터 RestControllerAdvice 를 쓰는게..

/** ControllerAdvice + ResponseBody */
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {

@ExceptionHandler(IllegalArgumentException.class)
@ResponseBody
public ResponseMessage<String> handleIllegalArgumentException(IllegalArgumentException e) {
return ResponseMessage.badRequest(e.getMessage());
}
}

이걸 정리하니 자연스럽게 RestControllerController의 차이도 알게 되었다.

--

--