Spring - (21) : controller advice란?

­이승환·2021년 12월 14일
0

spring

목록 보기
19/26

Overview


현재 계좌개설 서버 토이 프로젝트를 진행중에 있다. request에서 헤더값으로 유저의 ID가 들어온다는 가정하에 확인작업을 먼저하고, 이후 프로세스를 진행하는 API 로 구성되어 있다. 모든 컨트롤러마다 헤더값에 값이 있는지 확인하려면 어떻게 해야할까?

물론 FILTER, INTERCEPTER 를 활용하는 방법이 있다. 추가로 런타임 에러를 공통으로 관리해주는 녀석도 존재한다. 그것이 바로 Controller Advice이다.

@ControllerAdvice는 클래스의 경로를 검색해서 오류를 캐치할 구현 클래스를 만들게 도와준다. 일반적으로 @Controller 또는 @RestController가 선언된 클래스들에서 발생한 예외를 감지하고 적절한 응답을 만들어 낼 때 사용한다.

예제

EXCEPTION CLASS

아래와 같이 예외 클래스를 추가해보자.

public class TestException extends RuntimeException {

	private static final long serialVersionUID = 1L;
	private String message;

	public TestException(String message) {
		this.message = message;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
}

Controller

컨트롤러도 만들어서 빈에 등록해주자. 참고로 @RestController 어노테이션을 통해 빈에 등록해줄 수 있다. 컨트롤러에서 위에서 추가한 TextException 예외 클래스를 신규 생성해준다.

@RestController
public class TestController {
	@RequestMapping(value="/")
	public void ExecuteException(){
		throw new TestException("TEST");
	}
}

Error Message Object

에러 메시지를 처리할 에러 메시지를 추가해보자.


public class ErrorMessage {
	private String status;
	private String message;

	public String getStatus() {
		return status;
	}
	public void setStatus(String status) {
		this.status = status;
	}
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
}

Controller Advice

이 클래스가 이번 포스트에서 가장 중요하다. @ControllerAdvice 어노테이션을 선언하는 클래스는 추후 생기는 예외Exception(예제에서는 throw new TestException)를 catch해서 처리한다. 따라서 지금 작성된 클래스는 아까전 만들어 뒀던 TestException 예외가 발생했을 경우 해당 예외를 처리하는 코드가 담겨 있다. 아마 예측하건데 템플릿 패턴을 활용하는 것이 아닐까? 아닐 수도 있다..

@ControllerAdvice
public class TestAdvice {

   @ExceptionHandler(value = { TestException.class })
   @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
   @ResponseBody
   protected ErrorMessage handleConflict(RuntimeException ex, WebRequest request) {
   	ErrorMessage em = new ErrorMessage();
   	em.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.toString());
   	em.setMessage(ex.getMessage());
       return em;
   }
}

예외처리를 클래스 한곳에서 관리하고 싶다면 @ControllerAdvice 어노테이션을 이용해보자.

profile
Mechanical & Computer Science

0개의 댓글