SWM-99-degree / jariBean

SWM 14th JariBean Project
0 stars 1 forks source link

[BUG] Pagination의 `last` paramter의 값이 항상 `false`로 오는 오류 #152

Closed LineNo2 closed 1 year ago

LineNo2 commented 1 year ago

✏️ 설명

카페의 Best 항목을 가져올 때, 다음 페이지가 남아있음에도 불구하고 last : false로 출력되는 오류

🌌 발생 Controller

🧾 상황 재현

page=0&size=1로 쿼리를 날린다. 그 후 page=1&size=1로 다시 한번 날린다.

💻 결과

page=0&size=1


{
    "code": 1,
    "msg": "정보를 성공적으로 가져왔습니다.",
    "data": {
        "content": [
            {
                "id": "64faa27214a91177081f7f28",
                "name": null,
                "address": null,
                "imageUrl": null
            }
        ],
        "pageable": {
            "sort": {
                "empty": true,
                "sorted": false,
                "unsorted": true
            },
            "offset": 0,
            "pageNumber": 0,
            "pageSize": 1,
            "paged": true,
            "unpaged": false
        },
        "totalPages": 1,
        "totalElements": 1,
        "last": true,
        "size": 1,
        "number": 0,
        "sort": {
            "empty": true,
            "sorted": false,
            "unsorted": true
        },
        "numberOfElements": 1,
        "first": true,
        "empty": false
    }
}

page=1&size=1

{
    "code": 1,
    "msg": "정보를 성공적으로 가져왔습니다.",
    "data": {
        "content": [
            {
                "id": "64c45ac3935eb61c140793e7",
                "name": "testCafeName",
                "address": "testCafeAddress",
                "imageUrl": "https://picsum.photos/50/50"
            }
        ],
        "pageable": {
            "sort": {
                "empty": true,
                "sorted": false,
                "unsorted": true
            },
            "offset": 1,
            "pageNumber": 1,
            "pageSize": 1,
            "paged": true,
            "unpaged": false
        },
        "totalPages": 2,
        "totalElements": 2,
        "last": true,
        "size": 1,
        "number": 1,
        "sort": {
            "empty": true,
            "sorted": false,
            "unsorted": true
        },
        "numberOfElements": 1,
        "first": false,
        "empty": false
    }
}
psy-choi commented 1 year ago

해결

@Override
    public Page<Cafe> findByIds(List<String> cafes, Pageable pageable) {
        Criteria criteria = Criteria.where("cafeId").in(cafes);
        MatchOperation matchOperation = Aggregation.match(criteria);

        // 전체 size를 알기 위한 쿼리
        Aggregation countAggregation = Aggregation.newAggregation(matchOperation);
        AggregationResults<Cafe> countResults = mongoTemplate.aggregate(countAggregation, Cafe.class, Cafe.class);
        int totalCount = countResults.getMappedResults().size();

        // pagination size를 알기 위한 쿼리
        Aggregation aggregation = Aggregation.newAggregation(
                matchOperation,
                Aggregation.skip(pageable.getOffset()),
                Aggregation.limit(pageable.getPageSize())
        );
        List<Cafe> cafesResult = mongoTemplate.aggregate(aggregation, Cafe.class, Cafe.class).getMappedResults();

        return new PageImpl<>(cafesResult, pageable, totalCount);
    }

totalCount 값을 넣어줌으로 실제 검색 결과에 모든 행의 개수를 알게 하였고, Pagelmpl에 해당 데이터를 함께 넣으니 잘 false가 나타남!