스프링 공부/게시판 프로젝트 만들기

[스프링] 6. SecurityUtil 예외처리를 커스텀 해보자(부제: 2단계, 리스폰스를 이용해 예외처리하기)

장아장 2023. 1. 2. 16:58

이렇게 예외를 따로 만들었으며, 이를 통해 예외처리를 조금 더 직관적이게 만들 수 있었다. 

 

일단, 이전에 만들었던 것을 어떻게 이용할 것인가?

Exception이라는 것은 결국, Response에서 요청에 대해 실패했음을 알려주어야 한다. 결국, Response.failure를 반환하게 되는 것이다. 

 

이를 어떻게 활용하는 것일까?

@RestControllerAdvice
public class ExceptionAdvice {

    @ExceptionHandler(NeedToLoginException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public Response needToLoginException(){
        return Response.failure(403, "인증이 되어있지 않습니다. 로그인하세요.");
    }

    @ExceptionHandler(NotRightAuthenticationException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public Response notRightAuthenticationException(){
        return Response.failure(403, "인증 정보가 존재하지 않습니다. 다시 로그인해주세요");
    }
}

이런식으로 RestController, Exception, ResponseStatus의 어노테이션을 두고, 내부에 코드들이 있다. 

일단, 각 에러 코드에 대해서는 구글링을 통해, 어떤 에러는 어떤 코드로 나오는게 규약인지 찾아보면서 쓰고있다. 

 

하지만, 결국 각 상황에 따라 반환에 달라지는 것은 에러코드, 출력 문구, 그리고 Exception클래스명이다. 

코드와 문구는 Response생성자에서 추가로 만들어질 수 있다. 

 

하지만, 클래스는 다 다르게 만들어주어야 한다. 

이를 위해, 기존의 Exception을 extends하는 내 Exception을 추가로 만들었다. 

 

public class NeedToLoginException extends RuntimeException{}

이런식으로 예외를 만들어, 이걸 던지게 했다. 

 

만들어진 예외들을 가지고, 각 상황에 맞는 다양한 예외처리를 수행할 수 있게 된다. 

또한, 나중에 컨트롤러에서 예외를 던저야 할 수 있는데, 이 부분에서 코드를 더 깔끔하게 만들 수 있다는 장점이 있다. 

(깔끔한게 유지보수도 더 좋다.)