package com.sinor.cache.common;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
@JsonPropertyOrder({"isSuccess", "code", "message", "data"})
public class BaseResponse<T> {
@JsonProperty("isSuccess")
private final Boolean isSuccess;
private final int code;
private final String message;
@JsonInclude(JsonInclude.Include.NON_NULL)
private T data;
// 요청에 성공한 경우
public BaseResponse(BaseResponseStatus status, T data) {
this.isSuccess = status.isSuccess();
this.message = status.getMessage();
this.code = status.getCode();
this.data = data;
}
// 요청에 실패한 경우
public BaseResponse(BaseResponseStatus status) {
this.isSuccess = status.isSuccess();
this.message = status.getMessage();
this.code = status.getCode();
}
}
해당 Response에
package com.sinor.cache.common;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class BaseException extends Exception {
private BaseResponseStatus status;
public BaseException(BaseResponseStatus status) {
super(status.getMessage());
fillInStackTrace();
this.status = status;
}
}
을 담아서 Status를 Body에 담아서 결과를 반환하는 형태였는데 이는 문제점이 많았다.
@RestControllerAdvice
와 @ExceptionHandler
를 사용하여 전역의 RestController에서 Excetion을 감지하는 클래스를 정의한다.package com.sinor.cache.common;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestControllerAdvice
public class GlobalBindingControllerAdvice {
@ExceptionHandler(BaseException.class)
public ResponseEntity<?> customException(BaseException e){
log.error("Base exception occurred" + e.getStatus().getCode(), e);
Map<String, Object> responseBody = new HashMap<>();
responseBody.put("isSuccess", e.getStatus().isSuccess());
responseBody.put("status", e.getStatus().getCode());
responseBody.put("message", e.getStatus().getMessage());
return ResponseEntity.status((e).getStatus().getCode()).body(responseBody);
}
}
기존 방식 결과
변경된 방식 결과