api 를 배포하면 구조를 쉽게 변경할 수 없기 때문에 효율적이고 확장 가능한 형태로 작성해야한다.
http method 구분해서 사용
post:쓰기
get:읽기
put:수정
delete:삭제
매핑된 주소 체계를 정형화
Post /auth/login
Post /auth/signup
...
// 기존 USER 정보
{
"msrl": 1,
"uid": "test@test.com",
"name": "test"
}
// 표준화한 USER 정보
{
"data": {
"msrl": 1,
"uid": "test@test.com",
"name": "test"
},
"success": true
"code": 0,
"message": "성공하였습니다."
}
@Getter
@Setter
public class CommonResult {
@ApiModelProperty(value = "응답 성공여부 = true/false")
private boolean success;
@ApiModelProperty(value="응답 코드 번호")
private int code;
@ApiModelProperty(value="응답메시지")
private String msg;
}
@Getter
@Setter
public class SingleResult<T> extends CommonResult {
private T data;
}
@Getter
@Setter
public class ListResult<T> extends CommonResult {
private List<T> list;
}
@Service
public class ResponseService {
public enum CommonResponse {
SUCCESS(0, "성공"),
FAIL(-1, "실패");
int code;
String msg;
CommonResponse(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
// 단일건 결과 처리
public <T> SingleResult<T> getSingleResult(T data){
SingleResult<T> result=new SingleResult<>();
result.setData(data);
setSuccessResult(result);
return result;
}
// 다중건 결과 처리
public <T> ListResult<T> getListResult(List<T> list){
ListResult<T> result=new ListResult<>();
result.setList(list);
setSuccessResult(result);
return result;
}
// 성공 결과만 처리
public CommonResult getSuccessResult(){
CommonResult result=new CommonResult();
setSuccessResult(result);
return result;
}
// 실패 결과만 처리
public CommonResult getFailResult(int code,String msg){
CommonResult result=new CommonResult();
result.setSuccess(false);
result.setCode(code);
result.setMsg(msg);
return result;
}
// 성공하면 api 성공 데이터 세팅
private void setSuccessResult(CommonResult result){
result.setSuccess(true);
result.setCode(CommonResponse.SUCCESS.getCode());
result.setMsg(CommonResponse.SUCCESS.getMsg());
}
}
Controller에는 기존기능에 위 서비스를 타고 넘어오도록 수정한다.
@ApiOperation(value="로그인", notes = "이메일을 통해 로그인한다.")
@PostMapping(value="/login")
public SingleResult<String> login(@RequestBody @ApiParam(value="이메일 비밀번호",required = true) RequestLogin requestLogin){
UserDto userDto = userService.login(requestLogin);
return responseService.getSingleResult(jwtTokenProvider.createToken(String.valueOf(userDto.getEmail()), userDto.getRoles()));
}
참고
https://github.com/no-4-gift/boot-RESTAPI/blob/master/doc/4.%20REST%20API%20구조%20설계하기.md