2022. 4. 11. 16:34ㆍBackEnd(Java)/예외처리
API 개발 중 예외처리의 중복성 코드에 눈이 찌푸려졌다
좀 더 효율적이고 깔끔하게 짜고 싶은데..🤔🤔
void func1()
{
try{
로직
.....
}
catch(Exception e){
...
}
}
void func2()
{
try{
로직
.....
}
catch(Exception e){
...
}
}
구글링 통해 효율적으로 예외를 처리할 수 있는 방법을 찾고 있었다.(ㄹㅇ 구글링만 3시간 넘게 함, 이거보다 좀 더 좋은 방법은 없을까??라는 고집 때문에.. )
결국 내 기준 BestPractice를 찾게 되었다!!
(Optional을 사용했을 때의 예외 처리 예제와 Spring의 예외 처리 개념 및 흐름을 알 수 있게 됨)
자세한 내용은 아래 참고자료를 보면 된다.
삽질 기록
내가 적용하면서 느낀 경험(삽질)들을 공유하겠다
아래의 개념을 이해하지 못하고 개발을 진행하면 삽질을 하게 될 것임
그러니 아래 개념을 필히 숙지하고 개발을 진행하자.(나처럼 삽질하지 말고 꼭 이해하고 넘어가자)
[ Spring의 예외 처리 흐름 ]
앞서 설명하였듯 다음과 같은 예외 처리기들은 스프링의 빈으로 등록되어 있고, 예외가 발생하면 순차적으로 다음의 Resolver들이 처리가능한지 판별한 후에 예외가 처리된다.
- ExceptionHandlerExceptionResolver: Controller나 ControllerAdvice에 있는 ExceptionHandler를 처리함
- ResponseStatusExceptionResolver: @ResponseStatus 또는 ResponseStatusException를 처리함
- DefaultHandlerExceptionResolver: 스프링의 예외들들을 처리함
ex) HttpMediaTypeNotSupportedException, NoHandlerFoundException 등
- 예외가 던져지면 먼저 예외가 발생한 컨트롤러 안에 적합한 @ExceptionHandler가 있는지 검사함
- 컨트롤러의 @ExceptionHandler에서 처리가능하다면 처리하고, 그렇지 않으면 넘어감
- 컨트롤러의 @ExceptionHandler에서 처리가 불가능하다면 ControllerAdvice를 찾고 적합한 @ExceptionHandler가 있는지 검사함
- ControllerAdivce에서 처리가 가능하다면 처리하고, 그렇지않으면 넘어감
- ControllerAdvice에서 처리가 불가능하면 @ResponseStatus가 있는지 또는 ResponseStatusException인지 검사함
- 맞다면 ResponseStatusExceptionResolver가 처리하고, 그렇지 않다면 DefaultHandlerExceptionResolver가 처리함
처음 Spring의 기본적인 예외 처리 방식에서 살펴보았듯 Spring은 BasicErrorController를 구현해두었다. ExceptionHandler나 ControllerAdvice처럼 직접 에러를 반환하는 경우에는 BasicErrorController를 거치지 않지만 @ResponseStatus, ResponseStatusException 등과 같이 에러 응답을 직접 반환하지 않는 경우에는 최종적으로 BasicErrorController를 거쳐 에러가 처리된다.
Spring은 매우 다양한 예외 처리 방법을 제공하고 있어 어떻게 에러를 처리하는 것이 최선(Best Practice)인지 파악이 어려울 수 있다. 위의 포스팅을 통해서 이제 ControllerAdvice를 이용하는 것이 일반적으로 최선임을 이해할 수 있었는데, 다음 포스팅에서는 어떻게 ControllerAdvice를 사용할 수 있는지 코드를 통해 살펴보도록 하자.
출처: https://mangkyu.tistory.com/204 [MangKyu's Diary]
참고자료
'BackEnd(Java) > 예외처리' 카테고리의 다른 글
예외 종류 정리 (0) | 2022.04.12 |
---|---|
예외란 무엇인가 (1) | 2022.04.12 |