개발 공부

Advice (ResponseBody, Exception 처리) 본문

웹개발 (자바, 스프링, React)/웹개발

Advice (ResponseBody, Exception 처리)

아이셩짱셩 2021. 6. 18. 15:42

[구성]

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);
    }
}
Comments