카테고리 없음

3. Api/Result 및 enum 활용한 에러 상황들

PlusUltraCode 2024. 6. 28. 19:50

필터를 통해서 로그를 보자

@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();
}