본문 바로가기
스프링 부트/A-ger

[A-ger] Rest Api 응답 데이터 구조화하기

by illlilillil 2022. 3. 2.

아래와 같은 방식으로 구조화를 진행했습니다.

// 표준화한 ACCOUNT
{
  "success": true
  "code": 0,
  "message": "성공하였습니다.",
  "data": {
    "accountId": 1,
    "accountName": "frank"
  },
}

 

[CommonResponse 설계]

/**
 * @Class : CommonResponse
 * @Description : enum으로 api 요청 결과에 대한 code, message를 정의
 **/
@Getter
@AllArgsConstructor
public enum CommonResponse {
    SUCCESS(0, "성공하였습니다."),
    FAIL(-1, "실패하였습니다.");
    
    private final int code;
    private final String msg;
}

 

[단건, 리스트, 슬라이스,실패별 응답처리]

/**
 * @Class : ResponseService
 * @Description : 메인 도메인에 대한 서비스
 **/
@Service
public class ResponseService {

    /**
     * @Method : getSingleResult
     * @Description : 단일건 결과 처리
     * @Parameter : [data]
     * @Return : SingleResult<T>
     **/
    public <T> SingleResult<T> getSingleResult(T data) {
        SingleResult<T> result = new SingleResult<>();
        result.setData(data);
        setSuccessResult(result);
        return result;
    }

    /**
     * @Method : getListResult
     * @Description : 복수건 결과 처리
     * @Parameter : [list]
     * @Return : ListResult<T>
     **/
    public <T> ListResult<T> getListResult(List<T> list) {
        ListResult<T> result = new ListResult<>();
        result.setData(list);
        setSuccessResult(result);
        return result;
    }

    /**
     * @Method : getSliceResult
     * @Description : 페이징 결과 처리
     * @Parameter : [list]
     * @Return : SliceResult<T>
     **/
    public <T> SliceResult<T> getSliceResult(Slice<T> list) {
        SliceResult<T> result = new SliceResult<>();
        result.setData(list);
        setSuccessResult(result);
        return result;
    }

    /**
     * @Method : getSuccessResult
     * @Description : 성공 결과만 처리
     * @Parameter : []
     * @Return : CommonResult
     **/
    public CommonResult getSuccessResult() {
        CommonResult result = new CommonResult();
        setSuccessResult(result);
        return result;
    }

    /**
     * @Method : getFailResult
     * @Description : 실패 처리
     * @Parameter : [commonResponse]
     * @Return : CommonResult
     **/
    public CommonResult getFailResult(CommonResponse commonResponse) {
        CommonResult result = new CommonResult();
        setFailResult(commonResponse, result);
        return result;
    }

    /**
     * @Method : setFailResult
     * @Description : 실패 결과 바인딩
     * @Parameter : [commonResponse, result]
     * @Return : null
     **/
    private void setFailResult(CommonResponse commonResponse, CommonResult result) {
        result.setSuccess(false);
        result.setMsg(commonResponse.getMsg());
        result.setCode(commonResponse.getCode());
    }

    /**
     * @Method : setSuccessResult
     * @Description : 결과에 api 요청 성공 데이터 세팅
     * @Parameter : [result]
     * @Return : null
     **/
    private void setSuccessResult(CommonResult result) {
        result.setSuccess(true);
        result.setCode(CommonResponse.SUCCESS.getCode());
        result.setMsg(CommonResponse.SUCCESS.getMsg());
    }
}

 

[CommonResult]

/**
 * @Class : CommonResult
 * @Description : 메인 도메인에 대한 결과 매핑
 **/
@Data
public class CommonResult {

    private boolean success;

    private int code;

    private String msg;
}

 

[ListResult]

/**
 * @Class : ListResult
 * @Description : 메인 도메인에 대한 리스트 결과값 매핑
 **/
@Data
public class ListResult<T> extends CommonResult {
    private List<T> data;
}

 

[SingleResult]

/**
 * @Class : SingleResult
 * @Description : 메인 도메인에 대한 단일 결과값 매핑
 **/
@Data
public class SingleResult<T> extends CommonResult {
    private T data;
}

[SliceResult]

/**
 * @Class : SliceResult
 * @Description : 메인 도메인에 대한 다중 결과값 매핑
 **/
@Data
public class SliceResult<T> extends CommonResult {
    private Slice<T> data;
}

댓글