개발 공부
Advice (ResponseBody, Exception 처리) 본문
[구성]
1. Controller - Service - ...
- @RestController로 설정하는 경우 자동으로 responseBody 설정이 된다.
2. @ControllerAdvice, @ExceptionHandler 를 설정한 advice + Error를 컨트롤할 ErrorResponse 객체
- @RestControllerAdvice로 설정하는 경우 자동으로 responseBody 설정이 된다.
3. ResponseBodyAdvice를 implement하는 result wrapper
- ResponseBodyAdvice 는 @ResponseBody가 설정된 controller가 return 할 때 실행된다.
- Exception advice 이후에 실행된다. (설정 순서 조정 가능)
- @Override 하는 beforeBodyWrite에서 최종적인 후처리를 진행한다.
[정상인 경우]
1. 비지니스 로직 return responseBody -> 3. ResponseBodyAdvice
[Exception발생 시]
1. 비지니스 로직 throws exception
2. @ControllerAdvice, @ExceptionHandler를 설정해 준 exception handler에서 Exception 처리 및 ErrorResponse(아래 참고)를 return
3. ResponseBodyAdvice
//apiResponse의 error에 담을 error정보
public class ErrorResponse {
private String message;
private String code;
...
...
}
//최종적으로 return하게 될 response body에 해당
public class ApiResponse<T> {
private boolean result; //error일 때 false
private ErrorResponse error; //error가 아닐 때 null
private T data; //error일 때 null
@Builder
public ApiResponse(ResultCode code, ErrorResponse error, T data) {
this.result = code.isResult();
this.error = error;
this.data = data;
}
}
//ResponseBodyAdvice
@RestControllerAdvice
public class ResponseWrapper implements ResponseBodyAdvice<Object>{
...
...
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
if(body instanceof ErrorResponse) {
ErrorResponse errorResponse = (ErrorResponse) body;
ApiResponse apiResponse = ApiResponse.builder().code(ResultCode.FAIL).error(errorResponse).build();
return new ResponseEntity<>(apiResponse, HttpStatus.OK);
}
ApiResponse apiResponse = ApiResponse.builder().code(ResultCode.SUCCESS).data(body).build();
return new ResponseEntity<>(apiResponse, HttpStatus.OK);
}
}
'웹개발 (자바, 스프링, React) > 웹개발' 카테고리의 다른 글
(이클립스) 시작 오류 : java.lang.NoClassDefFoundError: org/w3c/dom/stylesheets/StyleSheet (2) | 2021.07.20 |
---|---|
자바 소켓 통신 동기처리, blocking (0) | 2021.06.30 |
soft delete를 위한 auditing (0) | 2021.06.18 |
랜덤 알파벳 생성 (0) | 2021.06.18 |
Exception class의 ResponseStatus 사용 (0) | 2021.01.14 |
Comments