DTO의 Validation의 유효성검사 혹은 클라이언트 및 서버에서 원인이 되는 다양한 에러들을 처리하기 위해 스프링에서 지원하는 @ExceptionHandler를 이용할 수 있다.
또한 모든 클래스에 공통적으로 적용되는 예외처리를 위해 스프링은 @RestControllerAdvice를 지원하여 공통사항을 모아 예외처리할 수 있도록 해준다. 이때 에러 정보들을 기반으로 정보를 담아 클라이언트에 전달하는 ErrorResponse 클래스를 만들어 각각의 @ExceptionHandler가 잡은 예외사항들의 정보를 필요한 정보만 매핑하여 클라이언트에 전달한다.
- Checked Exception vs Unchecked Exception
Checked Exception : 발생한 예외를 잡아서(catch) 체크한 후에 해당 예외를 복구하든가 아니면 회피하든가 등의 어떤 구체적인 처리를 해야 하는 예외
Unchecked Exception : 예외를 잡아서(catch) 해당 예외에 대한 어떤 처리를 할 필요가 없는 예외
- 개발자가 의도적으로 예외를 던저서 처리할 수 도 있다. 그 예로
- 백엔드 서버와 외부 시스템과의 연동에서 발생하는 에러 처리
- 시스템 내부에 조회하는 리소스가 없는 경우
가 있다. 이때 서버에서 처리할 수 있는 예외사항이 아니므로 클라이언트 측에 이를 알려 처리할 수 있다.
- 서비스 계층에서 throw 키워드를 통해 예외 사항을 던지고 이를 Exception Advice에서 catch하여 처리한다.
Custom Exception 처리
개발자는 Enum 클래스를 만들어 예외 코드를 정의하고 이를 예외 사항 클래스를 만들어 이의 객체를 이용해 BusinessLogic을 처리할때 발생하는 다양한 에러를 원하는 방법대로 처리할 수 있다.
요약
- 체크 예외(Checked Exception)는 예외를 잡아서(catch) 체크한 후에 해당 예외를 복구하든가 아니면 회피를 하든가 등의 어떤 구체적인 처리를 해야 하는 예외
- 언체크 예외(Unchecked Exception)는 예외를 잡아서(catch) 해당 예외에 대한 어떤 처리를 할 필요가 없는 예외를 의미
- RuntimeException을 상속한 예외는 모두 언체크 예외(Unchked Exception)이다.
- RuntimeException을 상속해서 개발자가 직접 사용자 정의 예외(Custom Exception)를 만들 수 있다.
- 사용자 정의 예외(Custom Exception)를 정의해서 서비스 계층의 비즈니스 로직에서 발생하는 다양한 예외를 던질 수 있고, 던져진 예외는 Exception Advice에서 처리할 수 있다.
- @ResponseStatus 애너테이션은 고정된 예외를 처리할 경우에 사용할 수 있다.
HttpStatus가 동적으로 변경되는 경우에는 ResponseEntity를 사용한다.