[Spring] 공통 response DTO 만들기

jomminii·2022년 9월 1일
2

side-blog-v1

목록 보기
2/4

모든 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;

}


생성자는 @RequiredArgsConstructorstaticName 옵션을 줘서 생성했는데요, 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 메소드 생성 - 와!개발!와!재밌어!

profile
고민은 격렬하게, 행동은 단순하게

0개의 댓글