TR1LL1ON / TR1LL1ON_BE

🌟 숙박 예약 서비스 [트릴리언] 🌟
https://www.tr1ll1on.site/
1 stars 3 forks source link

Feat: 리뷰 조회 페이지네이션 기능 개발 #112

Closed yurim0628 closed 11 months ago

yurim0628 commented 11 months ago

구현 내용은 Spring Data JPA를 이용한 Pagination 구현하기 - 리뷰 조회 를 참고하시길 바랍니다.

자세한 API 문서는 리뷰 기능 관련 API 설계 모음 를 참고하시길 바랍니다.

1. 사용자 리뷰 조회 API

  1. 요청 메서드 : GET
  2. 엔드 포인트 : /reviews
  3. 파라미터 ( 옵션 )
    • page ( 요청할 페이지 번호 ), size ( 페이지당 요소 수 ), period ( 리뷰 조회 기간 )
      /reviews?page={page}&size={size}&period={period}
  4. 응답 데이터 : 기간 별로 페이징 처리된 UserReviewResponse 객체

⚡ Example

요청

GET /reviews ( /reviews?page=0&size=10&inputPeriod=THREE_MONTH )

응답

{
    "content": [
        {
            "reviewId": 2,
            "reviewDate": "2023-12-08",
            "score": 5.0,
            "content": "굿굿",
            "orderItemId": 21,
            "accommodationDetails": {
                "accommodationId": 11,
                "accommodationName": "브라운도트호텔 정관점"
            },
            "productDetails": {
                "productId": 34,
                "productImage": "http://tong.visitkorea.or.kr/cms/resource/50/2705650_image2_1.jpg",
                "productName": "캐릭터 룸"
            }
        },
        {
            "reviewId": 12,
            "reviewDate": "2023-12-08",
            "score": 5.0,
            "content": "굿굿",
            "orderItemId": 21,
            "accommodationDetails": {
                "accommodationId": 6,
                "accommodationName": "세심천온천호텔"
            },
            "productDetails": {
                "productId": 15,
                "productImage": "http://tong.visitkorea.or.kr/cms/resource/61/3039161_image2_1.JPG",
                "productName": "일반실(한실)"
            }
        },
        {
            "reviewId": 13,
            "reviewDate": "2023-12-08",
            "score": 5.0,
            "content": "굿굿",
            "orderItemId": 21,
            "accommodationDetails": {
                "accommodationId": 6,
                "accommodationName": "세심천온천호텔"
            },
            "productDetails": {
                "productId": 15,
                "productImage": "http://tong.visitkorea.or.kr/cms/resource/61/3039161_image2_1.JPG",
                "productName": "일반실(한실)"
            }
        }
    ],
    "pageable": {
        "sort": {
            "empty": false,
            "sorted": true,
            "unsorted": false
        },
        "offset": 0,
        "pageNumber": 0,
        "pageSize": 10,
        "paged": true,
        "unpaged": false
    },
    "last": true,
    "totalElements": 3,
    "totalPages": 1,
    "first": true,
    "size": 10,
    "number": 0,
    "sort": {
        "empty": false,
        "sorted": true,
        "unsorted": false
    },
    "numberOfElements": 3,
    "empty": false
}

⚡ 페이지네이션과 관련된 주요 속성

  • offset : 전체 요소 중 현재 페이지의 첫 번째 요소가 전체 요소 목록에서 어디에 위치하는지를 나타낸다. ( (page - 1) * size )
  • pageNumber : 현재 페이지의 번호를 나타낸다. ( page )
  • pageSize : 한 페이지에 표시되는 요소의 수를 나타낸다. ( size )
  • totalElements: 전체 요소의 수를 나타낸다.
  • totalPages : 전체 페이지의 수를 나타낸다. ( ( totalElements / size ) + 1 )

2. 숙소 리뷰 조회 API

  1. 요청 메서드 : GET
  2. 엔드 포인트 : /reviews/{accommodationId}
  3. 요청 데이터 : accommodationId
  4. 파라미터 ( 옵션 ) page ( 요청할 페이지 번호 ), size ( 페이지당 요소 수 ), sort ( 정렬 기준과 방향 )
    /reviews?page={page}&size={size}&sort={sort},{direction}
  5. 응답 데이터 : 페이징 처리된 ProductReviewResponse 객체

⚡ sort ( 정렬 기준과 방향 ) 예시

  • 작성일 (reviewDate) : 리뷰가 작성된 날짜를 기준으로 정렬 ( ASC - 가장 최근 리뷰, DESC - 가장 오래된 리뷰 )
  • 평점 (score) : 리뷰의 평점을 기준으로 정렬 ( ASC - 가장 낮은 평점, DESC - 가장 높은 평점 )
  • 주문 번호 (orderItemId) : 주문 번호를 기준으로 정렬 ( ASC - 가장 최근 주문, DESC - 가장 오래된 주문 )
  • 숙소 이름 (accommodationName) : 숙소 이름을 기준으로 정렬
  • 상품 이름 (productName) : 상품 이름을 기준으로 정렬 ( ASC - 가장 앞선 문자열을 기준으로, DESC - 가장 마지막인 문자열을 기준으로 )

⚡ Example

요청

GET /reviews/11 ( /reviews/11?page=0&size=10&sort=reviewDate,DESC )

응답

{
    "content": [
        {
            "reviewId": 2,
            "reviewDate": "2023-12-08",
            "score": 5.0,
            "content": "굿굿",
            "userDetails": {
                "userId": 3,
                "userName": "test03"
            },
            "productDetails": {
                "productId": 34,
                "productImage": "http://tong.visitkorea.or.kr/cms/resource/50/2705650_image2_1.jpg",
                "productName": "캐릭터 룸"
            }
        },
        {
            "reviewId": 10,
            "reviewDate": "2023-12-07",
            "score": 1.0,
            "content": "너무좋아요(수정)",
            "userDetails": {
                "userId": 10,
                "userName": "호진"
            },
            "productDetails": {
                "productId": 34,
                "productImage": "http://tong.visitkorea.or.kr/cms/resource/50/2705650_image2_1.jpg",
                "productName": "캐릭터 룸"
            }
        }
    ],
    "pageable": {
        "sort": {
            "empty": false,
            "unsorted": false,
            "sorted": true
        },
        "offset": 0,
        "pageNumber": 0,
        "pageSize": 10,
        "paged": true,
        "unpaged": false
    },
    "last": true,
    "totalElements": 2,
    "totalPages": 1,
    "first": true,
    "size": 10,
    "number": 0,
    "sort": {
        "empty": false,
        "unsorted": false,
        "sorted": true
    },
    "numberOfElements": 2,
    "empty": false
}