[Spring] Exception Handler

nGyu·2022년 3월 26일
0
post-thumbnail

JWT를 구현하며 한 가지 궁금한점이 생겼었다.
바로 Exception을 ResponseBody에 담아서 보낼 방법이 없을까? 하다가 인텔리제이의 자동완성 중 ExceptionHandle이라는 어노테이션이 보여서 한번 공부를 해 보았다.


Exception

기존에는 try catch를 이용해서 예외처리를 했었다.

public boolean testMethod throws Exception{
	try {
    	Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
        return true;
    }catch (Exception e){
      throw new Exception("Expired Token");
	}
 }

이런식으로 했었는데 그냥 콘솔에 빨간색으로 Exception만 떳다.
이 때 알게된 어노테이션이 바로 ExceptionHandler였다.

ExceptionHandler

초기에는 이게 뭐지? 하다가 찾아보니 이것이 바로 Exception을 받았을 때 ResponseBody에 담아서 보낼 수 있다고 했다.

여기서 Controller 전역 혹은 내부에서 핸들링을 하는 방법이 있었다.

ControllerAdvice

전역으로 Exception 처리를 하려면 ControllAdvice 혹은 RestCorollerAdvice를 사용해야한다.

@ControllerAdvice()
class CustomException{

	@ExceptionHandler(RuntimeException.class)
    public String customExceptionHandle(){
    ...
    }

}

위에서부터 차근차근 해석을 해본다면,
@ControllerAdvice 이것은 모든 Controller에서 Exception이 발생했을 때 이곳으로 와서 처리를 해줄 수 있도록 해준다.
그런데 여기 @ControllerAdvice 어노테이션 옆의 괄호 안에 특정 컨트롤러를 적어준다면, 해당 컨트롤러에서 발생한 Exception만 처리해준다.

@ExceptionHandler() 이는 어떤 형태의 Exception을 처리를 해 줄것이냐 라는것인데, 위 코드를 보면 괄호 안에 RuntimeException이 들어있다. 이는 RuntimeException이 발생하면 아래 메서드를 작동시킨다는 것이다.

위에 말한대로 ControllerAdvice가 있다면 전역에서 발생하는 Exception을 처리해준다.

하지만, 지역단위로만 처리를 하고싶다면 어떻게 해야할까?

ExceptionHandler

아니, ExceptionHandler는 위에서 말했듯이 그냥 에러를 핸들링하는 어노테이션이 아닌가?
왜 갑자기 이렇게 따로 분리를 하는지 의아할 수 있는데 일반적인 RestController, Controller 안에 ExceptionHandler를 넣을 수 있다.

@RestController
public class ExampleController{
	
	@PostMapping("/exception")
	public void exception() throw Execption {
		throw new Execption("Execption 발생");
	}

	@ExceptionHandler(Exception.class)
	public String exceptionHandle(Exception e){
		return e.getMessage();
	}
}

이런 형태로 ControllerAdvice 가 아닌 일반적인 Controller 안에 ExceptionHandler 어노테이션을 이용해 메서드를 작성해주면 된다.

우리가 흔히 전역변수와 지역변수를 나타내는 형태처럼 위 형태는 지역ExceptionHandler(?) 라고 할 수 있을것같다!

profile
지금보다 내일을, 모레를 준비하자

0개의 댓글