Spring MVC(예외 처리 실습)

Rina's·2023년 6월 15일

코드스테이츠

목록 보기
45/96

@RestControllerAdvice

@ExceptionHandler

@ResponseStatus(HttpStatus..)

1. Custom ExceptionHandler


RuntimeException 계승하는 BusinessLogicException는 서비스계층에서 throw되고 있다


handleBusinessLogicException 메서드는 thorwBusinessLogicException를 받아 처리하는 ExceptionHandler이다
ResponseEntityErrorResponse.of 메서드를 통해 처리된 ErrorResponsehttpStatus을 받아 JSON값을 리턴할 것이다


ExceptionCode은 열거형으로 statusmessage 값을 가지고 있으며
@getter를 통해 호출된다
추후 값 추가를 생각해 status에 따라 httpStatus값이 변경될 수 있도록 switch문을 사용해 보았다

2. RequestMethodNotSupported ExceptionHandler

지원되지 않는 HTTP 요청을 보낼시 발생되는

HttpRequestMethodNotSupportedExceptionhandleHttpRequestMethodNotSupportedException 메서드가 받아 처리할 것이다
단, httpStatus: 405 상태 값에 맞춰 body 내 출력되는 status, message를 변경해야 했다.
이를 위해 받은 httpRequestMethodNotSupportedException를 사용하지 않고 원하는 httpStatus 객체를 새로 만들어 보냈다

최종적으로 ResponseEntity가 아닌 ErrorResponse.of를 통해 처리된 ErrorResponse 자체를 리턴해야 했기에 @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) 애너테이션을 설정하였다

HttpStatus메서드 value(), getReasonPhrase()를 통해 status, message를 가져온다

3. NullPointer ExceptionHandler


서비스계층에서 의도적으로 null값을 발생시키고 있다


handleNullPointerExceptionNullPointerException를 처리한다
이번에는 HttpServletResponse을 같이 넘겨HttpStatus.INTERNAL_SERVER_ERROR.value()를 재 설정하고
message값을 String으로 직접 넣어주었다

👿👿👿

내가 엄청 해멘 부분이 있는데 
어떻게든 httpRequestMethodNotSupportedException 객체만으로 body에 출력되는 
상태 코드와 메세지를 호출하고 싶어서, 별짓을 다 했다.
오버라이딩까지 생각해 봤지만 깊게 내려갈 수록 미지의 영역을 만나게 되어 포기했다
httpRequestMethodNotSupportedException 발생시 HttpServletResponse을 함께 받아 
getstatus() 사용하면 될 거라 생각했다. 결과로 405가 아닌 그냥 200이 떴다;
Exception객체를 받을 때 HttpServletResponse(405)을 받는다고 해서 
해당 Exception관련 HttpServletResponse 값을 받는게 아니라 
그냥 기본 값 HttpServletResponse(200)을 받는 것이어서 추가적인 설정이 필요했다.

참고
`"METHOD_NOT_ALLOWED"는 HttpStatus` 코드 값이고
`"Request method 'PATCH' not supported"`는 상태 코드 설명값이다

profile
갭린이 리나

0개의 댓글