희디비
[Spring] @ExceptionHandler API 에러 핸들링 본문
🎉@ExceptionHandler
예외 상황이 발생 했을 때 예외를 처리 하고 Json 오류 안내를 해주거나 오류페이지로 이동 할수 있게 해주는
ExceptionResolver의 한 종류 입니다.
📝 간단한 API
컨트롤러는 Json 타입으로 상품 이름과 가격을 입력 받습니다.
@RequestBody는 받은 Json을 한번에 orderDto에 매핑을 시도 합니다.
이때 int 값인 price에 String 값을 받게 되면 어떻게 될까요?
정상 값
정상적인 경우 받은 이름과 가격을 그대로 Json으로 반환 합니다.
실패 값
실패한 경우 Json으로 결과 값을 받게 됩니다.
오류 처리 흐름
1. 컨트롤러에서 예외가 발생 합니다.
2. ExceptionResolver 우선순위에 따라 처리 할수 있는 resolver를 찾습니다.
3. DefaultExceptionResolver가 선택 됩니다.
4. DefaultExceptionResolver가 예외에 맞는 Http 상태 코드로 바꾸게 됩니다.
5. response.senderror를 호출 하고 WAS는 오류가 생긴 것으로 판단 합니다.
6. 스프링 기본 에러 처리 경로인 "/error" 를 호출 하고 BasicErrorController가 값을 처리 합니다.
7. accept header가 "application/json" 인것을 보고 오류 값을 json으로 처리 해주었습니다.
🤔 Json 반환 값이 마음에 들지 않아요
API는 예외에 따라서 혹은 같은 예외라도 발생한 컨트롤러에 따라서 다른 값을 반환 하고 싶을 수 있습니다.
이럴때 필요한 예외 처리 방법이 @ExceptionHandler를 사용 하는 것 입니다.
@ControllerAdvice는 예외 처리 할 것을 컨트롤러에 모아둔 것 이라고 보시면 됩니다.
설정 값에 따라서 전체, basePackages를 두어 해당 하위 패키지에서만 사용 하거나 클래스를 지정 할 수 있습니다.
@RestControllerAdvice = @ControllerAdvice + @ResponseBody
즉 예외 처리 결과로 Json으로 반환 하겠다는 뜻입니다.
@ResponseStatus
: @ExceptionHandler와 같이 쓰이면 반환 값에 Http 상태 코드를 변경 할수 있습니다.
@ExeptionHandler
: 처리 할 예외를 지정 할 수 있고 적지 않으면 파라미터 예외 값으로 됩니다.
😎 Exception 핸들링
빈 검증의 경우 예외 처리 실패시 MethodArgumentNotValidException이 발생 합니다.
이 예외는 exception 안에 bindingResult 값을 꺼낼 수 있습니다.
bindingResult 값을 사용 하여 예외 처리 반환 값을 다르게 처리 해보겠습니다.
100보다 큰 값을 넣었으므로 예외가 발생하고 @ExceptionHandler가 처리 하여 반환을 해주었습니다.
이제 예외의 BindingResult의 FieldError를 하나씩 꺼내고 메시지 기능을 사용 하여
기존 defalut 메시지가 아닌 다른 값을 반환 해보겠습니다.
참고)
빈 검증은 메시지 기능을 기본적으로 사용 할 수 있습니다.
ex)
@NotEmpty( message = {name.notEmpty})
String name
위 오류 처리 흐름은 영한님의 mvc2편 그림 입니다.
강의를 통해 오류 처리를 배우고 배운 내용을 사용 하며 정리 해본 글입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
'Spring' 카테고리의 다른 글
[Spring] 필터, 인터셉터 (Interceptor) (0) | 2024.09.05 |
---|---|
[Spring] 쿠키, 세션 (Cookie, Session) (0) | 2024.09.04 |
[Spring] 빈 검증 ( Bean Validation ) (0) | 2024.09.03 |
[Spring] 메시지, 검증 (Validation) (4) | 2024.09.02 |
[Spring] 싱글톤 컨테이너 (0) | 2024.05.01 |