Skip to content

공통 Response 관련 질문입니다. #325

@Boin-Kau

Description

@Boin-Kau

질문 최하단의 3가지 Response 들에 대한 질문입니다! 질문 폭탄 미리 죄송합니다...ㅎㅎ

1. Response 클래스를 3개로 나눠 놓은 이유가 궁금합니다.

  • 3개 클래스 모두 필드가 유사하여 1개의 Response 클래스로도 원하는 작업이 가능하지 않았을까 하여, 나눠놓은 이유가 궁금했습니다.
  • 아래 예시로 만들어봤습니다. (ApiResponse) 이해를 돕기 위함이기 때문에 오류가 있을 수 있습니다.
    • result가 null 일 땐 응답 JSON 객체에 필드를 제외하도록 @JsonInclude 사용했습니다.
    • ErrorCode만 Enum으로 처리하는 것이 아닌, 정상 코드도 Enum에 포함하면 원하는 작업이 가능하지 않을까 생각해봤습니다. (아래 코드에는 반영 안되어있습니다. )
@Getter
@JsonPropertyOrder({"isSuccess", "code", "message", "result"})
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResponse<T> {

    private final boolean isSuccess;
    private final String message;
    private final int code;
    private final T result;

    private ApiResponse(boolean isSuccess, String message, int code, T result) {
        this.isSuccess = isSuccess;
        this.message = message;
        this.code = code;
        this.result = result;
    }

    public static <T> ApiResponse<T> success(T result) {
        return new ApiResponse<>(true, "요청성공.", 1000, result);
    }

    public static ApiResponse<Void> success() {
        return new ApiResponse<>(true, "요청성공.", 1000, null);
    }

    public static ApiResponse<Void> error(int code, String message) {
        return new ApiResponse<>(false, message, code, null);
    }
} 

2. SuccessDataResponse에서 빌더 패턴을 사용한 이유가 궁금합니다.

  • 아래처럼 SuccessResponse와 동일하게 create() 함수를 작성해도 되지 않나요? 빌더 패턴을 사용해야 되는 이유가 궁금합니다.
public static <T> SuccessDataResponse<T> create(T result) {
    return new SuccessDataResponse<>(result);
}

3. 기타 질문

  • isSuccess 필드가 Boolean 일 필요가 있을까요? null이 들어갈 상황이 없을 것 같아서, 명확성을 위해 boolean이 낫지 않을까 생각했습니다.
  • @NoArgsConstructor 를 붙인 이유가 있을까요? 해당 어노테이션이 수행하는 역할이 없는 것 같아서요.
  • result 필드만 final이 아닌 이유가 있을까요?
@Getter
@NoArgsConstructor
@JsonPropertyOrder({"isSuccess", "code", "message"})
public class SuccessResponse {
    private final Boolean isSuccess = true;

    @Schema(defaultValue = "요청성공.")
    private final String message = "요청성공.";

    @Schema(defaultValue = "1000")
    private final int code = 1000;

    public static SuccessResponse create() {
        return new SuccessResponse();
    }
}
@Getter
@NoArgsConstructor
@JsonPropertyOrder({"isSuccess", "code", "message", "result"})
public class SuccessDataResponse<T> extends SuccessResponse {
    private T result;

    @Builder(access = AccessLevel.PRIVATE)
    public SuccessDataResponse(T result) {
        this.result = result;
    }

    public static <T> SuccessDataResponse<T> create(T result) {
        return SuccessDataResponse.<T>builder()
                .result(result)
                .build();
    }
}
@Getter
@NoArgsConstructor
@JsonPropertyOrder({"isSuccess", "code", "message"})
public class ErrorResponse {

    private Boolean isSuccess;
    private int code;
    private String message;

    @Builder
    public ErrorResponse(int code, String message) {
        this.isSuccess = false;
        this.code = code;
        this.message = message;
    }

    @Builder(builderClassName = "customBuilder", builderMethodName = "customBuilder")
    public ErrorResponse(ErrorCode errorCode) {
        this.isSuccess = false;
        this.code = errorCode.getCode();
        this.message = errorCode.getMessage();
    }
}

Metadata

Metadata

Assignees

Labels

questionFurther information is requested

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions