eco-dessert-platform / backend

Apache License 2.0
0 stars 0 forks source link

CursorResponse data를 가공해서 반환할 수 있는 클래스 개발 #297

Open yunyechan9893 opened 1 week ago

yunyechan9893 commented 1 week ago

History

@Getter
@RequiredArgsConstructor
public class CursorPageResponse<T> {

    private final List<T> data;
    private final Long nextCursor;
    private final Boolean hasNext;

    // 데이터를 인자값으로 넣는 순간 다른 데이터로 가공할 수 없음
    public static <T> CursorPageResponse<T> of(List<T> data, int pageSize, ToLongFunction<T> idExtractor) {
        boolean hasNext = data.size() > pageSize;
        Long nextCursor = -1L;

        if (hasNext) {
            T lastReponse = data.get(pageSize - 1);
            nextCursor = idExtractor.applyAsLong(lastReponse);
            data = data.subList(0, pageSize);
        }

        return new CursorPageResponse<>(data, nextCursor, hasNext);
    }
}

🚀 Major Changes & Explanations

sunwon12 commented 1 week ago

예찬님 data = data.subList(0, pageSize); 이 부분이 데이터 사이즈를 pageSize에 맞게 -1 해주는 부분입니다

따라서 ProcessedDataCursorResponse<T, U>는 필요 없을 것 같습니다

yunyechan9893 commented 1 week ago

순원님 data를 -1 해준 후 별도로 data를 가공하고 샆을때땐 어떻게 하나요??

===============tmi return으로 해당 클래스를 반환해줌으로써 data를 -1 해준 후 별도의 데이터 가공을 해줄 수 없는 문제가 있습니다!

그래서 U와 Function을 도입함으로써 이 문제를 해결했습니다

sunwon12 commented 1 week ago

순원님 data를 -1 해준 후 별도로 data를 가공하고 샆을때땐 어떻게 하나요??

===============tmi return으로 해당 클래스를 반환해줌으로써 data를 -1 해준 후 별도의 데이터 가공을 해줄 수 없는 문제가 있습니다!

그래서 U와 Function을 도입함으로써 이 문제를 해결했습니다

쿼리 반환 데이터가 사이즈가 11이라고 한다면 이 11사이즈의 데이터를 가공해주고 마지막 CursorReponse가 될 때 데이터를 -1해줘야 한다고 생각합니다.

저흰 10사이즈의 데이터만 쓸 건데 11사이즈의 데이터 가공은 불필요하지만, 1 사이즈의 데이터 처리로 인한 성능은 아주 미세할 것 같습니다

yunyechan9893 commented 1 week ago

데이터가 List 인 경우도 있지만,

class Animal {
    List<~> list;
    int count;
}

인 경우도 생각해야해요

@Getter
@RequiredArgsConstructor
public class CursorPageResponse<T> {

    private final List<T> data; // 이 데이터가 꼭 List가 될 것이라는 보장이 없음
    private final Long nextCursor;
    private final Boolean hasNext;

    public static <T> CursorPageResponse<T> of(List<T> data, int pageSize, ToLongFunction<T> idExtractor) {
        boolean hasNext = data.size() > pageSize;
        Long nextCursor = -1L;

        if (hasNext) {
            T lastReponse = data.get(pageSize - 1);
            nextCursor = idExtractor.applyAsLong(lastReponse);
            data = data.subList(0, pageSize);
        }

        return new CursorPageResponse<>(data, nextCursor, hasNext);
    }
}

인 경우 Animal을 data 인자값으로 넣을 수 없습니다

shoeone96 commented 7 hours ago

카톡으로 질문주신 내용 여기에 남깁니다

주말에 나눴던 얘기 중 1번 방식은 현재 진행되고 있는 방식입니다.

1. 공통 조상 CustomPage를 상속받아서 필요한 멤버 변수가 추가로 있을 경우 추가로 자식의 멤버 변수에 추가

@Getter
@RequiredArgsConstructor
@AllArgsConstructor
public class CustomPage<T> {

    private T content;
    private Long nextCursor;
    private Boolean hasNext;

}
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class BoardCustomPage<T> extends CustomPage<T> {

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long boardCount;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long storeCount;

    public BoardCustomPage(
        T content,
        Long requestCursor,
        Boolean hasNext,
        Long boardCount,
        Long storeCount
    ) {
        super(content, requestCursor, hasNext);
        this.boardCount = boardCount;
        this.storeCount = storeCount;
    }
}

현재 CustomPage가 모든 페이지에 들어가는 공통 요소이고 BoardCustomPage는 이를 상속 받아 Board를 내려줄 때 필요한 요소를 추가한 형태입니다.

2. 공통 요소를 조상이 아닌 하나의 클래스로 선언 후 실제로 내려줘야 하는 클래스에 추가하는 형태입니다

@Getter
@RequiredArgsConstructor
@AllArgsConstructor
public class CustomPage<T> {

    private T content;
    private Long nextCursor;
    private Boolean hasNext;

}
@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class BoardCustomPage<T> extends CustomPage<T> {

    private CustomPage<T> customPage;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long boardCount;
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Long storeCount;

}

위와 같은 방식으로 상속으로 속성을 그대로 받아오는 것이 아닌 멤버 변수로서 넣는 조합의 방식으로 구현한 것입니다.

관련 링크 전달드립니다. https://tecoble.techcourse.co.kr/post/2020-05-18-inheritance-vs-composition/