@ExceptionHandler를 이용한 Controller 레벨에서의 예외 처리
Response Body의 내용만으로는 요청 데이터 중에서 어떤 항목이 유효성 검증에 실패했는지 알 수가 없음
-> 클라이언트가 전달받는 Response Body는 애플리케이션에서 예외(Exception)가 발생 시 내부적으로 Spring에서 전송함
직접 처리하도록
@ExceptionHandler 애너테이션 이용 : 발생하는 에러정보를 받음
ErrorResponse 클래스 생성 : Request Body에 대한 유효성 검증 실패 시 필요한 에러 정보만 담아서 클라이언트에게 응답으로 전송
Response Body를 보면 JSON 응답 객체가 배열
-> 한 개 이상의 유효성 검증에 실패한 필드의 에러 정보를 담기 위해서 List 객체를 이용
But
1. 각 Controller 클래스마다 코드 중복이 발생
2. 에러 종류가 많아질수록, 하나의 Controller 클래스 내에서도 @ExceptionHandler를 추가한 에러 처리 핸들러 메서드가 늘어남
-> @RestControllerAdvice 애너테이션을 추가한 클래스를 이용하면 예외 처리를 공통화할 수 있음
exceptionadvice클래스를 만들고 @RestControllerAdvice 애너테이션을 추가해 예외처리 중복 방지를 위해 에러처리를 공통화 해줌
@RestControllerAdvice : Controller 클래스에서 발생하는 예외 처리
체크 예외
언체크 예외
예외를 잡아서 어떤 처리를 할 필요 없는 예외
ex) NullPointerException, ArrayIndexOutOfBoundsException
흔히 개발자가 코드를 잘못 작성해서 발생하는 이런 오류들은 모두 RuntimeException을 상속한 예외들
RuntimeException 이용해서 개발자가 직접 예외를 만들어야 할 경우도 있음
의도적인 예외 던지기
-> 이미 controller에서 발생하는 예외를 Exception Advice에서 처리하도록 공통화 해두었으므로, 서비스 계층에서 던진 예외도 Exception Advice에서 처리하면 됨
BUT
사용자 정의 예외(Custom Exception) 사용