3. Api/Result 및 enum 활용한 에러 상황들
필터를 통해서 로그를 보자
@Slf4j
@Component
public class LoggerFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
var req = new ContentCachingRequestWrapper((HttpServletRequest) servletRequest);
var res = new ContentCachingResponseWrapper((HttpServletResponse) servletResponse);
filterChain.doFilter(req,res); //이거를 기준으로 위에는 실행전 아래는 실행후
//request 정보
var headerNames = req.getHeaderNames();
var headerValues = new StringBuilder();
headerNames.asIterator().forEachRemaining(headerKey->{
var headerValue = req.getHeader(headerKey);
headerValues.append("[")
.append(headerKey)
.append(" : ")
.append(headerValue)
.append("]");
});
var requestBody = new String(req.getContentAsByteArray());
var uri = req.getRequestURI();
var method = req.getMethod();
log.info(">>>> uri : {} , method : {} ,header: {} , body : {}" ,uri,method,headerValues,requestBody);
//response 정보
var responseHeaderValues = new StringBuilder();
res.getHeaderNames().forEach(headerKey ->{
var headerValue = res.getHeader(headerKey);
responseHeaderValues
.append("[")
.append(headerKey)
.append(" : ")
.append(headerValue)
.append("]");
});
var responseBody = new String(res.getContentAsByteArray());
log.info("<<<<< uri : {} , method : {}, header : {} , body : {}",uri,method,responseHeaderValues,responseBody);
res.copyBodyToResponse();
}
}
필터를 적용했으면 Api<T> 에대해서 구현해보자. 실제로 우리는 ResponseEntity.status(200).body(response).build() 이런식으로 작성을 했다면
구현부분에서 제한적일 수도 있다. 매우 많은 경우의 수가 있기 때문이다. 즉 우리는 우리가 직접 만들기로 결정했따.
{
"result": {
"result_code": 200,
"result_message": "OK",
"result_description": "성공"
},
"body": {
"name": "이동호",
"email": "kkd06144@naver.com",
"registered_at": "2024-06-28T18:33:21.8394382"
}
}
이런 형태로 구현할거다.
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Api<T> {
private Result result;
private T body;
public static <T>Api<T> OK(T data){
var api = new Api<T>();
api.result=Result.OK();
api.body=data;
return api;
}
public static Api<Object> ERROR(Result result){
var api = new Api<Object>();
api.result = result;
return api;
}
public static Api<Object> ERROR(ErrorCodeIfs errorCodeIfs){
var api = new Api<Object>();
api.result = Result.ERROR(errorCodeIfs);
System.out.println("hello");
return api;
}
public static Api<Object> ERROR(ErrorCodeIfs errorCodeIfs, Throwable tx){
var api = new Api<Object>();
api.result = Result.ERROR(errorCodeIfs,tx);
return api;
}
public static Api<Object> ERROR(ErrorCodeIfs errorCodeIfs, String description){
var api = new Api<Object>();
api.result = Result.ERROR(errorCodeIfs,description);
return api;
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Result {
private Integer resultCode;
private String resultMessage;
private String resultDescription;
public static Result OK(){
return Result.builder()
.resultCode(ErrorCode.OK.getErrorCode())
.resultMessage(ErrorCode.OK.getDescription())
.resultDescription("성공!")
.build();
}
public static Result ERROR(ErrorCodeIfs errorCodeIfs){
return Result.builder()
.resultCode(errorCodeIfs.getErrorCode())
.resultMessage(errorCodeIfs.getDescription())
.resultDescription("에러")
.build();
}
public static Result ERROR(ErrorCodeIfs errorCodeIfs, Throwable tx){
return Result.builder()
.resultCode(errorCodeIfs.getErrorCode())
.resultMessage(errorCodeIfs.getDescription())
.resultDescription(tx.getLocalizedMessage())
.build();
}
public static Result ERROR(ErrorCodeIfs errorCodeIfs, String description){
return Result.builder()
.resultCode(errorCodeIfs.getErrorCode())
.resultMessage(errorCodeIfs.getDescription())
.resultDescription(description)
.build();
}
}
@AllArgsConstructor
@Getter
public enum ErrorCode implements ErrorCodeIfs{
OK(200,200,"성공"),
BAD_REQUEST(HttpStatus.BAD_REQUEST.value(), 400,"잘못된 요청"),
SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR.value(), 500,"서버에러"),
NULL_POINT(HttpStatus.INTERNAL_SERVER_ERROR.value(), 512, "Null pointer"),
;
private final Integer httpStatusCode;
private final Integer errorCode;
private final String description;
}
public interface ErrorCodeIfs {
Integer getHttpStatusCode();
Integer getErrorCode();
String getDescription();
}