모든 API의 Response 에 대해 공통으로 감싸줄 수 있는 Response DTO를 만들어보려고 합니다.
response 에서 요청된 응답 값만 전달해주는게 아니라 결과에 대한 코드, 내용, 에러라면 에러메시지까지 같은 포맷으로 전달해줘 프론트에서 더 효율적으로 사용하게 하기 위한 목적 입니다.
먼저 DTO class 를 먼저 만들어보겠습니다.
DTO 에는 결과에 대한 코드를 보여줄 resultCode
와 에러 메시지 등을 담을 message
, 결과 데이터를 담을 data
를 담았습니다.
@Getter
@Setter
@RequiredArgsConstructor(staticName = "of")
public class ResultDTO<D> {
private final String resultCode;
private final String message;
private final D data;
}
생성자는 @RequiredArgsConstructor
에 staticName
옵션을 줘서 생성했는데요, staticName
을 주면 생성된 생성자가 private
으로 생성되고, 해당 name
을 가진 생성자를 반환하는 static 메서드가 생성됩니다.
본 class 외부에서 ResultDTO 를 임의로 가공하여 사용하는 일이 없도록 private
으로 생성되게 설정했습니다.
아래의 컨트롤러에 이 DTO 를 적용해보겠습니다.
@RestController
@RequestMapping("/api/v1/boards")
public class BoardRestController {
@PostMapping("")
public ResultDTO<Object> registerBoard() {
return ResultDTO.of("resultCode", "Message", ResultDTO.of("a","b","c"));
}
}
staticName
으로 설정했기에 of
라는 메서드가 생성되어있고 이를 이용해 return 값을 만들어줬습니다.
이 컨트롤러를 호출하면 아래와 같이 잘 응답되는걸 볼 수 있습니다.
{
"resultCode": "resultCode",
"message": "Message",
"data": {
"resultCode": "a",
"message": "b",
"data": "c"
}
}
이제 필요에 맞게 DTO에 정적 팩토리 메서드들을 더 만들어보겠습니다.
디폴트 성공 response
// success default response
public static <D> ResultDTO<D> ofSuccess() {
return new ResultDTO<>("SUCCESS", null, null);
}
return ResultDTO.ofSuccess();
{
"resultCode": "SUCCESS",
"message": null,
"data": null
}
디폴트 성공 response with message and data
// success response with message and data
public static <D> ResultDTO<D> ofSuccess(String message, D data) {
return new ResultDTO<>("SUCCESS", message, data)
}
return ResultDTO.ofSuccess("성공!!", ResultDTO.of("a", "b", "c"));
{
"resultCode": "SUCCESS",
"message": "성공!!",
"data": {
"resultCode": "a",
"message": "b",
"data": "c"
}
}
디폴트 실패 response
// fail default response
public static <D> ResultDTO<D> ofFail(String message) {
return new ResultDTO<>("FAIL", message, null);
}
return ResultDTO.ofFail("실패!!");
{
"resultCode": "FAIL",
"message": "실패!!",
"data": null
}
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor - project lombok
AllArgsConstructor, RequiredArgsConstructor에 staticName 옵션을 이용한 static factory 메소드 생성 - 와!개발!와!재밌어!