24.9.13 ~
앞서, AOP를 이용하여 동아리내 권한을 검증하는 로직을 분리하였다.
하지만, 해당 로직은 API가 호출시 RestController에 도달하기전 실행되는, @Before advice이기 때문에, Aspect에서 발생한 예외를 Controller에서 잡아 ResponseEntity에 HTTP에러 코드를 담아 보내주는 커스텀 로직에 도달하지 못했다.
catch (Exception e) {
return ResponseEntity.status(HttpStatus.CONFLICT).body(e.getMessage());
}
그래서, GlobalExceptionHandling으로 AOP에서 발생하는 예외도 잡아, 클라이언트에게 적절한 에러코드를 잡아주도록 구현하였다.
해당 문제 상황이 아니어도, Try Catch구문이 비즈니스 로직 속에 너무 많이 담기게 되었고, 이로 인해, 코드의 가독성이 떨어지고 한번에 관리하기 어려워지며, 비즈니스 로직에 예외를 처리하는 책임이 분리가 되지 않는다는 문제가 있었다.
이런 문제 때문에 스프링 MVC에서 제공하는 전역예외처리 기능을 사용하였고, 기본적으로 스프링 MVC의 예외처리 방식에 대한 깊은 이해가 필요할 것 같아 공부하였다.
ResponseEntity<Object>
에 담아 전달한다.ResponseEntity
에 담길 메시지의 공통된 양식을 지정하여, 응답메시지들이 공통된 양식으로 반환되어, 클라이언트와의 소통을 원활하게 하였다.일단 기본적으로, Spring MVC 프레임워크에서 예외를 처리하는 과정에 대한 이해를 해보자
예외는 크게 2가지가 발생한다.
BasicErrorController
가 있다고, 스프링 부트는 예외가 발생하면 기본적으로 /error 로 예외요청을 다시 전달하도록 WAS설정을 하였다.BasicErrorController
를 실행하기 위해 컨트롤러를 2번 거치게 된다.컨트롤러 수신 : WAS -> 필터 -> 디스패처 서블릿 -> 인터셉터 -> 컨트롤러
컨트롤러 송신 : 컨트롤러(예외발생) -> 인터셉터 -> 디스패처 서블릿 -> 필터 -> WAS -> 필터
-> 디스패처 서블릿 -> 인터셉터 -> 컨트롤러(BasicErrorController)
-> 인터셉터 -> 디스패처 서블릿 -> 필터 -> WAS