본문으로 건너뛰기

🌟 상품 즐겨찾기 기능 명세서

📝 개요

상품 즐겨찾기는 사용자가 관심 있는 빵(bread) 카테고리 상품을 쉽게 찾고 관리할 수 있도록 한다.
많은 사용자가 즐겨찾기한 인기 상품을 조회할 수 있어 새로운 상품을 발견하는 데 도움을 준다.


⚙️ 기능 요구사항

1. 상품 즐겨찾기 등록

사용자는 bread 카테고리에 해당하는 상품만 즐겨찾기에 등록할 수 있다.

  • 기능

    • 즐겨찾기할 상품의 아이디, 사용자 아이디
  • 유효성 검사

    • 상품 존재 여부 확인

      • 상품이 존재하지 않는 경우: PRODUCT_NOT_FOUND ("상품을 찾을 수 없습니다")

      • BREAD 카테고리인지 확인: ONLY_BREAD_CAN_BE_FAVORITED ("빵 상품만 즐겨찾기할 수 있습니다")

    • 이미 즐겨찾기된 상품인지 확인

      • 즐겨찾기된 상품인 경우: ALREADY_FAVORITED ("이미 즐겨찾기된 상품입니다")
    • 상품이 bread 카테고리인지 확인

  • 처리 내용

    • 사용자와 상품 간의 관계 저장: 사용자 ID, 상품 ID, 생성 시점 기록

    • 상품의 즐겨찾기 개수 증가

1.1 API 명세

POST customer-api/api/v1/product/{productId}/favorite

1.2 요청

{
"headers": {
"Authorization": "Bearer {accessToken}"
},
"path": {
"productId": "Long"
}
}

1.3 응답

{
"status": "SUCCESS",
"data": {}
}

1.4 예외 코드

코드메시지HTTP 상태
PRODUCT_NOT_FOUND"상품을 찾을 수 없습니다"404
CUSTOMER_NOT_FOUND"사용자를 찾을 수 없습니다"404
ONLY_BREAD_CAN_BE_FAVORITED"빵 상품만 즐겨찾기할 수 있습니다"400
ALREADY_FAVORITED"이미 즐겨찾기한 상품입니다"409

2. 즐겨찾기 해제

  • 기능

    • 즐겨찾기 해제할 상품의 아이디, 사용자 아이디
  • 유효성 검사

    • 상품 존재 여부 확인

      • 상품이 존재하지 않는 경우: PRODUCT_NOT_FOUND ("상품을 찾을 수 없습니다")
    • 즐겨찾기된 상품인지 확인

      • 즐겨찾기되지 않은 경우: NOT_FAVORITED ("즐겨찾기되지 않은 상품입니다")
  • 처리 내용

    • 소프트 삭제 처리: 즐겨찾기 정보의 삭제 여부 플래그 설정

2.1 API 명세

DELETE customer-api/api/v1/product/{productId}/favorite

2.2 요청

{
"headers": {
"Authorization": "Bearer {accessToken}"
},
"path": {
"productId": "Long"
}
}

2.3 응답

{
"status": "SUCCESS",
"data": {}
}

2.4 예외 코드

코드메시지HTTP 상태
PRODUCT_NOT_FOUND"상품을 찾을 수 없습니다"404
NOT_FAVORITED"즐겨찾기되지 않은 상품입니다"404

3. 즐겨찾기한 상품 조회

  • 입력 데이터

    • 페이지 정보: 페이지 번호, 크기

    • 정렬 옵션: 거리순, 최신순, 인기순

    • 필터 옵션: 상품 ID

    • 사용자의 위치 정보: 위도, 경도

  • 처리 내용

    • 사용자의 즐겨찾기 목록 조회

    • 페이지네이션 처리

    • 정렬 및 필터링 적용

  • 응답 데이터

    • 즐겨찾기 목록

    • 페이지 정보

3.1 API 명세

GET customer-api/api/v1/product/favorite?page=0&size=10&sort=latest&productId=456

3.2 요청

{
"headers": {
"Authorization": "Bearer {accessToken}"
},
"params": {
"page": "int, default: 0",
"size": "int, default: 10",
"sort": "string, enum: [LATEST, POPULAR, DISTANCE], default: LATEST",
"latitude": "double",
"longitude": "double"
}
}

3.3 응답

{
"status": "SUCCESS",
"data": {
"favorites": [
{
"productId": 456,
"bakeryId": 123,
"productName": "식빵",
"productImage": "bread.png",
"price": 3000,
"favoriteCount": 100,
"releaseTime": ["08:30", "12:00", "16:00"],
"distance": 1.5,
"isBakeryActive": false,
"isProductActive": true
}
],
"pageInfo": {
"totalElements": 100,
"totalPages": 10,
"isLast": false,
"currPage": 0
}
}
}

4. 핫한 상품 조회

  • 입력 데이터

    • 페이지 정보: 페이지 번호, 크기

    • 정렬 옵션: 예약 많은 순, 즐겨찾기 많은 순

    • 필터 옵션: 상품 ID, 기간(일간, 주간, 월간)

    • 사용자의 위치 정보: 위도, 경도

  • 처리 내용

    • 즐겨찾기 수 기준 상위 상품 조회
  • 응답 데이터

    • 기간 정보

    • 순위별 상품 목록

    • 페이지 정보

4.1 API 명세

GET /api/v1/product/hot?period=weekly&bakeryId=456&category=bread

4.2 요청

{
"params": {
"page": "int, default: 0",
"size": "int, default: 10",
"period": "string, enum: [DAILY, WEEKLY, MONTHLY], required",
"sortType": "string, enum: [RESERVATION, FAVORITE], required",
"latitude": "double",
"longitude": "double"
}
}

4.3 응답

{
"status": "SUCCESS",
"data": {
"period": "MONTHLY",
"startDate": "2024-03-13",
"endDate": "2024-04-13",
"hotProducts": [
{
"productId": 456,
"bakeryId": 123,
"bakeryName": "달콤한 아침",
"productName": "식빵",
"productImage": "bread.png",
"favoriteCount": 89,
"price": 3000,
"stock": 10,
"isFavorite": false,
"distance": 1.2
},
{
"productId": 457,
"bakeryId": 124,
"bakeryName": "빵의 신",
"productName": "크루아상",
"reservationCount": 130,
"favoriteCount": 53,
"image": "croissant.png",
"price": 5000,
"stock": 0,
"isFavorite": false,
"distance": 1.2
}
],
"pageInfo": {
"totalElements": 50,
"totalPages": 5,
"isLast": false,
"currPage": 1
}
}
}

4.4 예외 코드

코드메시지HTTP 상태
PRODUCT_NOT_FOUND"상품을 찾을 수 없습니다"404
INVALID_HOT_SORT_TYPE"핫 상품은 RESERVATION, FAVORITE 중에서 선택해야 합니다"400
INVALID_PERIOD_VALUE"기간은 DAILY, WEEKLY, MONTHLY 중에서 선택해야 합니다"400
PERIOD_REQUIRED_FOR_RESERVATION_SORT"예약순 정렬 시 기간 설정은 필수입니다"400

📦 공통 오류 응답

코드메시지HTTP 상태
UNAUTHORIZED"인증이 필요합니다"401
FORBIDDEN"접근 권한이 없습니다"403
INTERNAL_SERVER_ERROR"서버 내부 오류가 발생했습니다"

문서 버전: 1.0.0
최종 수정일: 2025-06-12