22.12.21 Section3 spring MVC 예외처리
그니까 controller에 @ExceptionHandler를 이용해서 예외 종류마다 각각 예외처리를 할 수 있는데
에러 응답 메세지를 필요한 정보만 정리해서 전달 할 수 있도록 ErrorResponse 클래스에 선언해놓은 필드와 그 getter로 객체 생성해서
handle메소드 내부에서 stream, map,collect을 이용하여 ErrorResponse 객체 리스트로 반환.
이러면 controller마다 해줘야하고 예외 종류마다 코드 만들어줘야 해서
@RestControllerAdvice 애너테이션 이용해서 예외처리를 공통화.
전체 controller 아우를 수 있는 GlobalExceptionAdvice 클래스를 만들고
그 안에 @ExceptionHandler 애너테이션을 붙인 각 에러 핸들링 메소드를 만들어준다.
위 handle 메소드와 다르게 Error Response 정보를 만드는 역할을 ErrorResponse 클래스가 하도록
여기서 ErrorResponse를 반환 타입으로 만들어서 ErrorResponse of 호출 매개변수로 각 에러 묶음 타입 객체 전달
//각 에러 묶음 타입 객체에 대한 ErrorResponse 객체 생성하기 위해 ErrorResponse 의 of 메서드.
주로 객체 생성시 어떤 값들의 객체를 생성한다는 의미에서 of() 메서드를 사용.
-MethodArgumentNotValidException 에서 에러 정보를 얻기 위해 필요한 것이 바로 BindingResult 객체이므로 이 of() 메서드를 호출하는 쪽에서 BindingResult 객체를 파라미터로 넘겨주면 됨. - 에러.getBindingResult() 넘겨주더라
-ConstraintViolationException 에서 에러 정보를 얻기 위해 필요한 것이 바로 Set<ConstraintViolation<?>> 객체이므로 이 of() 메서드를 호출하는 쪽에서 Set<ConstraintViolation<?>> 객체를 파라미터로 넘겨주면 됨. - 에러.getConstraintViolation()넘겨주더라
ErrorResponse 의 of 메소드는 매개변수로 각 에러 묶음 타입 객체 받아와서 반환값으로 ErrorResponse 생성자를 반환.
그 ErrorResponse 생성자의 매개변수로 각 에러에 맞는 에러 클래스의 of 메소드 넣어줌.
// 각 에러 클래스의 of 메소드는 각 에러 가공하기 위함.
그 of 메소드 매개변수로 각 에러 묶음 타입 객체 전달.
그 각 에러의 에러 클래스는 에러 묶음 타입 에러 받아서 그 정보중 에러타입 클래스의 필드변수로 선언한 정보만 저장한 각 에러타입 객체 리스트 만들어서 반환.
-이 반환된게 ErrorResponse 생성자 매개변수로 들어가서 ErrorResponse 객체의 각 필드 변수에 해당값 저장.
-이 객체가 ErrorResponse 의 of 메서드 호출된 곳, GlobalExceptionAdvice의 handle메소드 반환값으로 이 객체가 반환됨.
+@RestControllerAdvice = @ControllerAdvice + @ResponseBody
@RestControllerAdvice 애너테이션은 @ControllerAdvice 의 기능, @ResponseBody 의 기능을 둘 다 포함하고 있기 때문에
JSON 형식의 데이터를 Response Body로 전송하기 위해서 ResponseEntity로 데이터를 래핑할 필요가 없음.
+@ResponseStatus 애너테이션으로 HTTP Status를 대신 표현할 수 있다.