|
| 1 | +## 유스케이스 명세 |
| 2 | + |
| 3 | +--- |
| 4 | +### 상품 목록 조회 |
| 5 | + |
| 6 | +**Main Flow** |
| 7 | + |
| 8 | +1. 사용자가 상품 목록을 요청한다. |
| 9 | +2. 시스템은 기본 정렬 기준인 최신순(latest)으로 상품 목록을 조회한다. |
| 10 | +3. 시스템은 각 상품의 기본 정보(이름, 가격, 브랜드명, 좋아요 수, 유저의 좋아요 여부)를 반환한다. |
| 11 | +4. 상품이 20개를 초과하면 다음 페이지 요청 URL을 함께 반환한다. |
| 12 | +5. 사용자는 결과를 확인한다. |
| 13 | + |
| 14 | +**Alternate Flow** |
| 15 | + |
| 16 | +1. 사용자가 정렬 옵션을 “좋아요순”으로 선택한다. |
| 17 | + → 시스템은 좋아요 수 기준으로 상품을 내림차순 정렬(likes_desc)해 반환한다. |
| 18 | +2. 사용자가 정렬 옵션을 “가격순”으로 선택한다. |
| 19 | + → 시스템은 가격 기준으로 오름차순 정렬(likes_desc)해 반환한다. |
| 20 | + |
| 21 | +**Exception Flow** |
| 22 | + |
| 23 | +1. 상품 데이터가 없는 경우 |
| 24 | + |
| 25 | +→ “상품이 없습니다.” 문구를 반환한다. |
| 26 | + |
| 27 | +--- |
| 28 | + |
| 29 | +### 상품 상세 조회 |
| 30 | + |
| 31 | +**Main Flow** |
| 32 | + |
| 33 | +1. 사용자가 특정 상품을 선택한다. |
| 34 | +2. 시스템은 해당 상품의 상세 정보(이름, 가격, 브랜드명, 설명, 총 좋아요 수, 유저의 좋아요 여부)를 조회한다. |
| 35 | +3. 시스템은 결과를 반환한다. |
| 36 | + |
| 37 | +**Exception Flow** |
| 38 | + |
| 39 | +1. 존재하지 않는 상품 ID 요청 |
| 40 | + |
| 41 | + → 404 에러 반환 (상품을 찾을 수 없습니다). |
| 42 | + |
| 43 | +2. 상품 재고가 0인 경우 |
| 44 | + |
| 45 | + → “품절” 상태로 표시한다.(구매 버튼이 막힌다.) |
| 46 | + |
| 47 | + |
| 48 | +--- |
| 49 | + |
| 50 | +### 브랜드 조회 |
| 51 | + |
| 52 | +**Main Flow** |
| 53 | + |
| 54 | +1. 사용자가 상품 목록 또는 상품 상세 페이지에서 브랜드를 클릭한다. |
| 55 | +2. 시스템은 해당 브랜드의 기본 정보(이름, 설명)를 조회한다. |
| 56 | +3. 시스템은 해당 브랜드에 속한 상품 목록을 함께 조회한다. |
| 57 | +4. 시스템은 브랜드 정보와 상품 목록을 함께 반환한다. |
| 58 | + |
| 59 | +--- |
| 60 | + |
| 61 | +**Exception Flow** |
| 62 | + |
| 63 | +1. 존재하지 않는 브랜드 ID 요청 |
| 64 | + |
| 65 | + → 404 에러 반환 (“브랜드를 찾을 수 없습니다.”) |
| 66 | + |
| 67 | +2. 해당 브랜드에 등록된 상품이 없는 경우 |
| 68 | + |
| 69 | + → “상품이 없습니다.” 문구를 반환한다. |
| 70 | + |
| 71 | + |
| 72 | +--- |
| 73 | + |
| 74 | +### 상품 좋아요 |
| 75 | + |
| 76 | +**Main Flow** |
| 77 | + |
| 78 | +1. 로그인 사용자가 특정 상품에 좋아요 요청을 보낸다. |
| 79 | +2. 시스템은 해당 유저가 이미 좋아요를 했는지 확인한다. |
| 80 | +3. 좋아요 이력이 없을 경우, 좋아요 정보를 저장한다. |
| 81 | +4. 변경된 총 좋아요 수를 계산해 반환한다. |
| 82 | + |
| 83 | +**Alternate Flow** |
| 84 | + |
| 85 | +1. 이미 좋아요한 상품에 다시 좋아요 요청을 보낸 경우 |
| 86 | + |
| 87 | +→ 시스템은 중복 저장하지 않고 현재의 좋아요 상태와 총 좋아요 수를 반환한다. |
| 88 | + |
| 89 | +**Exception Flow** |
| 90 | + |
| 91 | +1. 존재하지 않는 상품에 좋아요 요청 |
| 92 | + |
| 93 | +→ 404 에러 반환 (상품을 찾을 수 없습니다) |
| 94 | + |
| 95 | +1. 로그인하지 않은 사용자가 요청 |
| 96 | + |
| 97 | +→401 Unauthorized(로그인이 필요합니다) |
| 98 | + |
| 99 | +--- |
| 100 | + |
| 101 | +### 상품 좋아요 취소 |
| 102 | + |
| 103 | +**Main Flow** |
| 104 | + |
| 105 | +1. 로그인 사용자가 특정 상품의 좋아요 취소 요청을 보낸다. |
| 106 | +2. 시스템은 해당 유저의 좋아요 존재 여부를 확인한다. |
| 107 | +3. 좋아요 이력이 있을 경우, 좋아요 정보를 삭제한다. |
| 108 | +4. 변경된 총 좋아요 수를 계산해 반환한다. |
| 109 | + |
| 110 | +**Alternate Flow** |
| 111 | + |
| 112 | +1. 좋아요하지 않은 상품에 취소 요청을 보낸 경우 |
| 113 | + |
| 114 | +→ 시스템은 아무 동작도 수행하지 않고 현재 상태와 총 좋아요 수를 반환한다. |
| 115 | + |
| 116 | +**Exception Flow** |
| 117 | + |
| 118 | +1. 존재하지 않는 상품 ID 요청 |
| 119 | + |
| 120 | +→ `404 Not Found` (상품을 찾을 수 없습니다). |
| 121 | + |
| 122 | +2. 로그인하지 않은 사용자가 요청 |
| 123 | + |
| 124 | +→ `401 Unauthorized` (로그인이 필요합니다). |
| 125 | + |
| 126 | +--- |
| 127 | + |
| 128 | +### 내가 좋아요 한 상품 목록 조회 |
| 129 | + |
| 130 | +**Main Flow** |
| 131 | + |
| 132 | +1. 로그인 사용자가 자신이 좋아요한 상품 목록을 요청한다. |
| 133 | +2. 시스템은 해당 유저의 좋아요 테이블을 조회한다. |
| 134 | +3. 좋아요한 상품들의 기본 정보(상품명, 가격, 브랜드명, 좋아요 수 등)를 함께 반환한다. |
| 135 | +4. 결과는 페이지네이션 형태로 제공된다. |
| 136 | + |
| 137 | +**Exception Flow** |
| 138 | + |
| 139 | +1. 로그인하지 않은 사용자가 요청 |
| 140 | + |
| 141 | +→ `401 Unauthorized` (로그인이 필요합니다). |
| 142 | + |
| 143 | +1. 사용자가 좋아요한 상품이 없는 경우 |
| 144 | + |
| 145 | +→ 시스템은 빈 리스트를 반환한다. |
| 146 | + |
| 147 | +--- |
| 148 | + |
| 149 | +### **주문 생성 및 결제 요청** |
| 150 | + |
| 151 | +**Main Flow** |
| 152 | + |
| 153 | +1. 사용자가 주문 요청을 보낸다. |
| 154 | +2. 시스템은 각 상품의 재고를 확인한다. |
| 155 | +3. 시스템은 사용자의 포인트 잔액을 조회한다. |
| 156 | +4. 조건이 모두 충족되면 다음 처리를 수행한다. |
| 157 | + 1. 상품의 재고가 차감된다. |
| 158 | + 2. 사용자의 포인트가 차감된다. |
| 159 | + 3. 시스템이 주문 정보를 저장한다. |
| 160 | + 4. 주문 정보를 외부 시스템에 전송한다. (Mock 처리) |
| 161 | +5. 결제가 성공하면 주문 완료 응답을 반환한다. |
| 162 | + |
| 163 | +**Alternate Flow** |
| 164 | + |
| 165 | +1. 사용자가 여러 상품을 동시에 주문한 경우 |
| 166 | + |
| 167 | +→ 시스템은 각 상품의 재고를 모두 확인하고, 총 주문 금액이 사용자의 포인트 잔액보다 적은 경우에만 주문을 진행한다. |
| 168 | + |
| 169 | +모든 조건이 충족되면 여러 상품을 한 번에 결제 처리한다. |
| 170 | + |
| 171 | +**Exception Flow** |
| 172 | + |
| 173 | +1. 포인트 부족 → “잔액이 부족합니다.” 메시지 반환 |
| 174 | + |
| 175 | +2. 재고 부족 → “품절된 상품입니다.” 메시지 반환 |
| 176 | + |
| 177 | +3. 외부 시스템 오류 (Mock 실패 등) → 주문 데이터 롤백 후 “결제 실패” 메시지 반환 |
| 178 | + |
| 179 | +4. 네트워크 오류 → “네트워크 오류가 발생했습니다. 다시 시도해주세요.” 메시지 반환 |
| 180 | + |
| 181 | +--- |
| 182 | + |
| 183 | +### 유저의 주문 목록 조회 |
| 184 | + |
| 185 | +**Main Flow** |
| 186 | + |
| 187 | +1. 사용자가 주문 내역을 요청한다. |
| 188 | +2. 시스템은 해당 사용자의 주문 목록을 조회한다. |
| 189 | +3. 각 주문에 대해 요약 정보(주문 ID, 주문일시, 총액, 결제 상태 등)를 반환한다. |
| 190 | +4. 사용자는 결과를 확인한다. |
| 191 | + |
| 192 | +**Exception Flow** |
| 193 | + |
| 194 | +1. 주문 내역이 없는 경우 → 빈 리스트와 “주문 내역이 없습니다.” 메시지 반환 |
| 195 | +2. 로그인하지 않은 사용자가 요청 |
| 196 | + |
| 197 | +→ `401 Unauthorized` (로그인이 필요합니다). |
| 198 | + |
| 199 | +--- |
| 200 | + |
| 201 | +### 단일 주문 상세 조회 |
| 202 | + |
| 203 | +**Main Flow** |
| 204 | + |
| 205 | +1. 사용자가 주문 ID를 지정하여 상세 조회 요청을 보낸다. |
| 206 | +2. 시스템은 해당 주문을 조회한다. |
| 207 | +3. 주문 정보(상품명, 수량, 금액, 결제 수단, 배송 상태 등)를 반환한다. |
| 208 | + |
| 209 | +**Exception Flow** |
| 210 | + |
| 211 | +1. 로그인하지 않은 사용자가 요청→ `401 Unauthorized` (로그인이 필요합니다). |
| 212 | +2. 존재하지 않는 주문 ID 요청 → 404 에러 반환 (“주문을 찾을 수 없습니다.”) |
| 213 | +3. 요청한 유저가 주문자와 불일치할 경우 → 403 Forbidden (“접근 권한이 없습니다.”) |
0 commit comments