Spring,SpringBoot

Spring 예외 처리

Lahezy 2023. 4. 8.
728x90

SPRING 예외 처리

( 이상하게 한 부분 있으면 조언 부탁드립니다. 🥲 )

 

기존코드

지금까지는 그냥 모든 컨트롤러 위에 이렇게 ExceptionHandler을 달아서 에러가 발생하면 처리할 수 있도록 했다.

근데 어차피 전역적으로 똑같은 예외처리를 하면 한 번에 묶어서 처리하는 것이 낫다고 생각해서 관련 방법 찾았다.

 

수정코드

@RestControllerAdvice는 Exception Handling을 위한 어노테이션으로  @ControllerAdvice와 @ResponseBody의 기능을 합쳐 놓은 것이다.

해당 어노테이션을 활용하면  컨트롤러에서 발생하는 예외를 전역적으로 처리할 수 있게 도와주고 @ResponseBody를 통해서 메서드 반환값을 HTTP 본문에 제공해 json과 같은 형태로 반환이 가능해서 REST API 설계 시 유용한다.

 

먼저 사용자 지정 예외를 하나 선언해서 해당 에러만 잡을 수 있도록 ExceptionHandler를 구성했다.

모두 따로 예외를 지정할 수도 있지만 나중에 필요하면 수정하는 걸로..

에러 코드 부분도 enum클래스로 선언해서 효율적으로 관리하기로 했다. 

근데 고민인 부분이 현재 Status 타입으로 선언해서 이후에 ErrorResult로 변환 시에. toString()으로 진행하였더니

"status": "500 INTERNAL_SERVER_ERROR" 이렇게 나와서 그냥 숫자로 수정해서 
HttpStatus status = HttpStatus.valueOf(statusCode), HTTP메서드를 활용해서 상태를 지정할까 고민중이다.

 

앞에서 나왔던 반환용 Fail 클래스를 ErrorResult로 변경해서 에러발생 시 반환메시지를 담아서 반환할 수 있도록 했다.

그리고 전역으로 예외를 처리하는 부분

 

그래서 현재 위에처럼 수정을 했다. 에러 발생시 결과를 보면? 

위와 같이 출력되는걸 확일할 수 있다. 

 

하지만 출력되지 않는 경우가 있다.

token과 관련하여 오류가 발생하면 401 반환만 오고 에러코드로 출력되지 않는다.

이는 token 관련 처리를 스프링 필터를 이용하여 처리하고 있기 때문이다. 

스프링 필터는 HTTP요청이 컨트롤러에 도달하기 전에 실행시키기 때문에 컨트롤러까지 오지 않고 예외를 발생시켜서 예외를 잡지 못한 것이다. 그래서 필터를 처리하기 위해서는 dofilter을 이용해서 등록해 주었다. (아직 확신이 안 든다)

 

필터 예외처리

Security 관련 사용자 지정 예외를 하나 더 선언했다.

그리고 필터 내에서 발생한 예외를 처리하는 부분. CustomSecurityException을 잡아서 ErrorResponse를 설정해 주었다.

추가적으로 ErrorCode클래스에 해당 예외를 찾기 위한 메서드를 추가해 주었다

2023.02.28 - [JAVA] - Enum 클래스 enum클래스는 여기에서 설명되어 있다. 

그리고 토큰의 유효성을 검사하면서 예외가 발생할 수 있도록 했다.

그리고 필터에 적용하기 (끝 ~)

 

그래서 현재는 다음처럼 에러가 출력됨을 확일 할 수 있다.

하지만 현재 고민이 더 있다. 

위에서 validate 하면서 사용자 지정 예외를 지정하고 위에 ExceptionHandleFilter에서 예외를 잡아서 처리하였는데 

현재 사용하고 있는 JWT필터에서 바로 처리할지 고민 중이다. 이게 맞는 방법인가..? 

근데 현재 스톰프에서도 jwt validation 부분을 사용하고 있어서 위에 방법이 나은 것 같기도 하고.. 근데 또 HTTP Status를 내가 직접 조정하면서 문제가 있을 것 같기도 하고.. 공부를 더 해봐야겠다.

 

참고 :

https://cheese10yun.github.io/spring-guide-exception/

https://velog.io/@kimdy0915/Spring-Security-Filter%EC%97%90%EC%84%9C-%EB%B0%9C%EC%83%9D%ED%95%98%EB%8A%94-%EC%98%88%EC%99%B8%EB%93%A4%EC%9D%84-%EB%AA%A8%EB%91%90-%EC%B2%98%EB%A6%AC%ED%95%B4%EB%B3%B4%EC%9E%90

https://samtao.tistory.com/48

728x90

댓글