2022년 12월 11일
오늘은 제너릭 타입을 사용한 responseService를 구현했던 방식을 기록하려고한다. 하면서 직접적으로 제너릭으로 구현해본 경험이 별로 없었기때문에 생소한 부분도 있고, 작성했던 부분에서 헷갈렸던 부분도 있기때문에 작성하였다.
ResponseService
import kakaopay.kakaopay.entitiy.exception.CommonResult;
import kakaopay.kakaopay.entitiy.exception.ListResult;
import kakaopay.kakaopay.entitiy.exception.SingleResult;
import kakaopay.kakaopay.service.exception.CommonResponse;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ResponseService {
// 단일건 결과 처리 메소드
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);
setFailResult(result, code, msg);
return result;
}
// API 요청 성공 시 응답 모델을 성공 데이터로 세팅
private void setSuccessResult(CommonResult result) {
result.setSuccess(true);
result.setCode(CommonResponse.SUCCESS.getCode());
result.setMsg(CommonResponse.SUCCESS.getMsg());
}
// API 요청 실패 시 응답 모델을 실패 데이터로 세팅
private void setFailResult(CommonResult result, int code, String msg) {
result.setSuccess(false);
result.setCode(code);
result.setMsg(msg);
}
}
Java
복사
•
<T> SingleResult<T> getSingleResult(T data) : 앞에 제너릭은 리턴 값 함수 뒤에 값은 사용할 데이터 타입, 매개변셔 T는 전달할 데이터 타입을 명시
•
setSuccessResult 은 전달 받은 매개변수 값안에 데이터를 공통으로 셋팅해주는 역할을 한다.
•
setFailResult은 전달 받은 매개변수 값안에 데이터를 공통으로 셋팅해주는 역할을 한다.
CommonResult
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
@Getter
@Setter
public class CommonResult {
@ApiModelProperty(value = "응답 성공 여부: T/F")
private boolean success;
@ApiModelProperty(value = "응답 코드: >= 0 정상, < 0 비정상")
private int code;
@ApiModelProperty(value = "응답 메시지")
private String msg;
}
Java
복사
•
CommonResult는 응답성공여부, 응답코드, 응답메세지를 선언
SingleResult
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class SingleResult<T> extends CommonResult {
private T data;
}
Java
복사
•
CommResult를 상속받아서 응답 코드, 응답 메세지, 응답 성공여부를 체크한다.
•
singleResult는 데이터 한개를 주고 받았을때 응답값을 전달.
ListResult
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
public class ListResult<T> extends CommonResult {
private List<T> list;
}
Java
복사
•
CommResult를 상속받아서 응답 코드, 응답 메세지, 응답 성공여부를 체크한다.
•
ListResult는 데이터 여러개를 주고 받았을때 응답값을 전달.
Controller
@ApiOperation(value = "계좌 생성", notes = "계좌를 생성합니다.")
@PostMapping("/api/join/account")
public SingleResult<AccountDto> saveAccount(@RequestBody @Valid CreateAccountRequest request ) {
Account saveAccount = accountService.createMemberAccount(request.getMemberId());
AccountDto accountDto = new AccountDto(saveAccount.getAccountNo(), saveAccount.getMember().getMemberId(), saveAccount.getMember().getUserName());
responseService.getSingleResult(accountDto);
return responseService.getSingleResult(accountDto);
}
Java
복사
•
컨트롤러에서 응답값으로 responseService.getSingleReulst를 사용해서 데이터를 전달.
오늘은 ResponsService를 설계해서 응답값을 좀 더 수월하게 전송하는 방법에대해 이야기하였다. 제너릭 타입을 잘 사용해서, 좀 더 유연하고, 안전한 설계를 할 필요가 있다.