Skip to content

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

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();
    }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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