"Sparta Delivery ์์์์ฑ ํ๋ก์ ํธ"
์ด ๋ฌธ์๋ Sparta Delivery ํ๋ก์ ํธ 16์กฐ 3BodyProgrammers์ API ๋ช ์ธ์, ์ฃผ์ ๊ธฐ๋ฅ ๋ฐ ํธ๋ฌ๋ธ์ํ ๋ด์ฉ์ ๋ค๋ฃน๋๋ค.
| ์ ํ | ๊น์ง์ | ๊น์ ๋ |
|---|---|---|
| ํ์ฅ | ํ์ | ํ์ |
| JeonTak | KIM JIYEONG | yrkim |
| INTJ | INTP | ISFP |
| https://velog.io/@tak980418/posts | https://velog.io/@flamma/posts | https://velog.io/@yyrkk/posts |
| ํญ๋ชฉ | ๋ด๋น์ | ์์ ๋ ์ง | ์ํ | ์๋ฃ ๋ ์ง |
|---|---|---|---|---|
| ๋ก๊ทธ์ธ | ๊น์ ๋ | 2025๋ 3์ 2์ผ | ์๋ฃ | 2025๋ 3์ 4์ผ |
| ์ ์ | ๊น์ ๋ | 2025๋ 3์ 3์ผ | ์๋ฃ | 2025๋ 3์ 4์ผ |
| ๊ฐ๊ฒ | ์ ํ | 2025๋ 3์ 1์ผ | ์๋ฃ | 2025๋ 3์ 4์ผ |
| ๋ฉ๋ด | ์ ํ | 2025๋ 3์ 3์ผ | ์๋ฃ | 2025๋ 3์ 4์ผ |
| ์ฃผ๋ฌธ | ๊น์ง์ | 2025๋ 3์ 2์ผ | ์๋ฃ | 2025๋ 3์ 6์ผ |
| ๋ฆฌ๋ทฐ | ๊น์ ๋, ๊น์ง์ | 2025๋ 3์ 2์ผ | ์๋ฃ | 2025๋ 3์ 5์ผ |
| ํตํฉ ๊ฒ์ | ์ ํ | 2025๋ 3์ 5์ผ | ์๋ฃ | 2025๋ 3์ 5์ผ |
| ๊ฐ๊ฒ ๋์๋ณด๋ | ์ ํ | 2025๋ 3์ 6์ผ | ์๋ฃ | 2025๋ 3์ 6์ผ |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ๊น์ ๋ | ์๋ฃ | POST | ํ์๊ฐ์ | /auths/signup |
NO | NONE | { "email": string, "password": string, "name": string, "userRole": string } |
200 OK, 400 Bad Request |
{ "token": string } |
| ๊น์ ๋ | ์๋ฃ | POST | ๋ก๊ทธ์ธ | /auths/signin |
NO | NONE | { "email": string, "password": string } |
200 OK, 400 Bad Request, 401 Unauthorized |
{ "token": string } |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ๊น์ ๋ | ์๋ฃ | POST | ํ์ํํด | /users |
YES | NONE | { "password": string } |
200 OK, 400 Bad Request |
{ "message": string } |
| ๊น์ ๋ | ์๋ฃ | GET | ๋ด ์ ๋ณด ์กฐํ | /users |
YES | NONE | NONE | 200 OK, 400 Bad Request |
{ "id": long, "email": string, "name": string, "userRole": string, "createdAt": string, "modifiedAt": string } |
| ๊น์ ๋ | ์๋ฃ | PUT | ๋ด ์ ๋ณด ์์ | /users |
YES | NONE | { "oldPassword": string, "newPassword": string, "name": string } |
200 OK, 400 Bad Request |
{ "id": long, "email": string, "name": string, "userRole": string, "createdAt": string, "modifiedAt": string } |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ์ ํ | ์๋ฃ | POST | ๊ฐ๊ฒ ์์ฑ | /stores |
YES | NONE | { "name": string, "openAt": time, "closeAt": time, "minimunPrice": int, "notice": string } |
200 OK, 400 Bad Request, 403 Forbidden |
{ "id": long, "name": string, "openAt": string, "closeAt": string, "minimunPrice": int, "notice": string, "createdAt": string, "modifiedAt": string } |
| ์ ํ | ์๋ฃ | GET | ์ ์ฒด ๊ฐ๊ฒ ์กฐํ | /stores |
YES | Query Parameters: | name (string), page (int, default: 1), size (int, default: 10) |
200 OK (Page ํ์) |
{ "id": long, "name": string, "openAt": string, "closeAt": string, "minimunPrice": int, "holidays": {โฆ}, "createdAt": string, "modifiedAt": string } |
| ์ ํ | ์๋ฃ | GET | ๊ฐ๊ฒ ๋จ๊ฑด ์กฐํ | /stores/{id} |
YES | Path Parameter: id (Long) |
NONE | 200 OK, 400 Bad Request |
{ "id": long, "name": string, "openAt": string, "closeAt": string, "minimunPrice": int, "holidays": {โฆ}, "notice": string, "menuList": { โฆ }, "createdAt": string, "modifiedAt": string } |
| ์ ํ | ์๋ฃ | PUT | ๊ฐ๊ฒ ์์ | /stores/{id} |
YES | Path Parameter: id (Long) |
{ "name": string, "openAt": time, "closeAt": time, "minimunPrice": int, "notice": string } |
200 OK, 400 Bad Request, 403 Forbidden |
{ "id": long, "name": string, "openAt": string, "closeAt": string, "minimunPrice": int, "holidays": {โฆ}, "notice": string, "createdAt": string, "modifiedAt": string } |
| ์ ํ | ์๋ฃ | POST | ๊ฐ๊ฒ ํ์ | /stores/delete/{id} |
YES | Path Parameter: id (Long) |
NONE | 200 OK, 400 Bad Request, 403 Forbidden |
{ "message": string } |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ์ ํ | ์๋ฃ | POST | ํด์ผ ์์ | /stores/{storeId}/holidays |
YES | Path: storeId (Long) |
{ "holidays": List<String> } |
200 OK, 400 Bad Request, 403 Forbidden |
{ "id": long, "name": string, "openAt": string, "closeAt": string, "minimunPrice": int, "holidays": {โฆ}, "createdAt": string, "modifiedAt": string } |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ์ ํ | ์๋ฃ | POST | ๋ฉ๋ด ์์ฑ | /stores/{storeId}/menus |
YES | Path: storeId (Long) |
{ "name": string, "price": int } |
200 OK, 400 Bad Request, 403 Forbidden |
{ "id": long, "name": string, "price": int, "createdAt": string, "modifiedAt": string } |
| ์ ํ | ์๋ฃ | PUT | ๋ฉ๋ด ์์ | /stores/{storeId}/menus/{id} |
YES | Path: storeId (Long), id (Long) |
{ "name": string, "price": int } |
200 OK, 400 Bad Request, 403 Forbidden |
{ "id": long, "name": string, "price": int, "createdAt": string, "modifiedAt": string } |
| ์ ํ | ์๋ฃ | POST | ๋ฉ๋ด ์ญ์ | /stores/{storeId}/menus/delete/{id} |
YES | Path: storeId (Long), id (Long) |
NONE | 200 OK, 400 Bad Request, 403 Forbidden |
{ "message": string } |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ๊น์ง์ | ์๋ฃ | POST | ์ฃผ๋ฌธ ์์ฑ | /orders |
YES | Path: storeId (Long) |
{ "menuName": string, "price": int } |
200 OK, 400 Bad Request, 403 Forbidden |
{ "id": long, "storeId": long, "menuName": string, "price": int, "status": string, "createdAt": string, "modifiedAt": string } |
| ๊น์ง์ | ์๋ฃ | PATCH | ์ฃผ๋ฌธ ์ํ ๋ณ๊ฒฝ | /orders/{id}/status |
YES | Path: id (Long) |
{ "status": string } |
200 OK, 400 Bad Request, 403 Forbidden, 404 Not Found |
{ "id": long, "userId": long, "storeId": long, "menuName": string, "price": int, "status": string, "createdAt": string, "modifiedAt": string } |
| ๊น์ง์ | ์๋ฃ | GET | ์ ์ฒด ์ฃผ๋ฌธ ์กฐํ | /orders |
YES | Query: page (int, default: 1), size (int, default: 10) |
NONE | 200 OK (Page ํ์) |
{ "id": long, "userId": long, "storeId": long, "menuName": string, "price": int, "status": string, "createdAt": string, "modifiedAt": string } |
| ๊น์ง์ | ์๋ฃ | GET | ์ฃผ๋ฌธ ๋จ๊ฑด ์กฐํ | /orders/{id} |
YES | Path: id (Long) |
NONE | 200 OK, 403 Forbidden, 404 Not Found |
{ "id": long, "userId": long, "storeId": long, "menuName": string, "price": int, "status": string, "createdAt": string, "modifiedAt": string } |
| ๊น์ง์ | ์๋ฃ | DELETE | ์ฃผ๋ฌธ ์ทจ์ | /orders/{id} |
YES | Path: id (Long) |
NONE | 200 OK, 400 Bad Request, 403 Forbidden, 404 Not Found |
{ "message": string } |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ๊น์ ๋ | ์๋ฃ | POST | ๋ฆฌ๋ทฐ ์์ฑ | /orders/{orderId}/reviews |
YES | Path: orderId (Long) |
{ "rating": byte, "comments": string } |
200 OK, 400 Bad Request, 403 Forbidden, 404 Not Found |
{ "id": long, "userId": long, "storeId": long, "orderId": long, "rating": byte, "comments": string, "createdAt": string, "modifiedAt": string } |
| ๊น์ ๋ | ์๋ฃ | GET | ๋ฆฌ๋ทฐ ์กฐํ | /stores/{storeId}/reviews |
YES | Path: storeId (Long), Query: page (int, default: 1), size (int, default: 10) |
NONE | 200 OK, 400 Bad Request |
{ "Page ํํ์ { "id": long, "userId": long, "storeId": long, "orderId": long, "rating": byte, "comments": string, "createdAt": string, "modifiedAt": string }, "totalReviewCount": long, "averageReviewScore": double } |
| ๊น์ ๋ | ์๋ฃ | PUT | ๋ฆฌ๋ทฐ ์์ | /reviews/{id} |
YES | Path: id (Long) |
{ "rating": byte, "comments": string } |
200 OK, 400 Bad Request, 403 Forbidden, 404 Not Found |
{ "id": long, "userId": long, "storeId": long, "orderId": long, "rating": byte, "comments": string, "createdAt": string, "modifiedAt": string } |
| ๊น์ ๋ | ์๋ฃ | POST | ๋ฆฌ๋ทฐ ์ญ์ | /reviews/delete/{id} |
YES | Path: id (Long) |
NONE | 200 OK, 400 Bad Request, 403 Forbidden, 404 Not Found |
{ "message": string } |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ์ ํ | ์๋ฃ | GET | ํตํฉ ๊ฒ์ | /searchs |
YES | Query: name (string), page (int, default: 1), size (int, default: 10) |
NONE | 200 OK (Page ํ์) |
{ "id": long, "name": string, "openAt": string, "closeAt": string, "minimunPrice": int, "holidays": {โฆ}, "createdAt": string, "modifiedAt": string } |
| ๋ด๋น์ | ์ํ | HTTP ๋ฉ์๋ | ๊ธฐ๋ฅ | URL | ์ธ์ฆ ํ์ | ํ๋ผ๋ฏธํฐ | ์์ฒญ ๋ฐ์ดํฐ | ์๋ต ์ฝ๋ ๋ฐ ์ค๋ช | ์๋ต ๋ฐ์ดํฐ |
|---|---|---|---|---|---|---|---|---|---|
| ์ ํ | ์งํ ์ค | GET | ์ผ๋ณ ํต๊ณ | /stores/{id}/dashboard/daily |
YES | Path: id (Long), Query: day (string) |
NONE | 200 OK, 400 Bad Request, 403 Forbidden |
{ "day": String, "dailyUser": Integer, "dailySales": Integer } |
| ์ ํ | ์งํ ์ค | GET | ๊ธฐ๊ฐ๋ณ ํต๊ณ | /stores/{id}/dashboard/period |
YES | Path: id (Long), Query: startDay (string), endDay (string) |
NONE | 200 OK, 400 Bad Request, 403 Forbidden |
{ List ํํ์ { "day": String, "dailyUser": Integer, "dailySales": Integer }, "totalUser": Integer, "totalSales": Integer } |
erDiagram
Users {
BIGINT id PK "์ ์ ๋ฒํธ"
VARCHAR(255) email "์ด๋ฉ์ผ"
VARCHAR(20) password "๋น๋ฐ๋ฒํธ"
VARCHAR(20) name "์ด๋ฆ"
VARCHAR(10) user_role "๊ถํ"
LOCALDATETIME created_at "์์ฑ์ผ"
LOCALDATETIME modified_at "์์ ์ผ"
LOCALDATETIME deleted_at "์ญ์ ์ผ"
}
Stores {
BIGINT id PK "๊ฐ๊ฒ ๋ฒํธ"
BIGINT user_id FK "์ ์ ๋ฒํธ"
VARCHAR(50) name "๊ฐ๊ฒ๋ช
"
TIME open_at "์คํ์๊ฐ"
TIME close_at "๋ง๊ฐ์๊ฐ"
INT minimum_price "์ต์์ฃผ๋ฌธ๊ธ์ก"
INT holiday "ํด์ผ"
TEXT notice "๊ณต์ง"
LOCALDATETIME created_at "์์ฑ์ผ"
LOCALDATETIME modified_at "์์ ์ผ"
LOCALDATETIME deleted_at "ํ์
์ผ"
}
Menus {
BIGINT id PK "๋ฉ๋ด ๋ฒํธ"
BIGINT store_id FK "๊ฐ๊ฒ ๋ฒํธ"
VARCHAR(50) name "์ด๋ฆ"
INT price "๊ฐ๊ฒฉ"
LOCALDATETIME created_at "์์ฑ์ผ"
LOCALDATETIME modified_at "์์ ์ผ"
LOCALDATETIME deleted_at "์ญ์ ์ผ"
}
Orders {
BIGINT id PK "์ฃผ๋ฌธ ๋ฒํธ"
BIGINT user_id FK "์ ์ ๋ฒํธ"
BIGINT store_id FK "๊ฐ๊ฒ ๋ฒํธ"
VARCHAR(50) menuName "๋ฉ๋ด ์ด๋ฆ"
INT price "๋ฉ๋ด ๊ฐ๊ฒฉ"
LOCALDATETIME created_at "์ฃผ๋ฌธ์๊ฐ"
LOCALDATETIME modified_at "์ฃผ๋ฌธ๋ณ๋์๊ฐ"
LOCALDATETIME completed_at "์๋ฃ์๊ฐ"
VARCHAR(20) status "์ฃผ๋ฌธ์ํ"
}
Reviews {
BIGINT id PK "๋ฆฌ๋ทฐ ๋ฒํธ"
BIGINT user_id FK "์ ์ ๋ฒํธ"
BIGINT store_id FK "๊ฐ๊ฒ ๋ฒํธ"
BIGINT order_id FK "์ฃผ๋ฌธ ๋ฒํธ"
TINYINT rating "๋ณ์ "
TEXT comments "ํ๊ฐ"
LOCALDATETIME created_at "์์ฑ์ผ"
LOCALDATETIME modified_at "์์ ์ผ"
LOCALDATETIME deleted_at "์ญ์ ์ผ"
}
Users ||--o{ Stores: "๊ด๋ฆฌ"
Stores ||--o{ Menus: "์ ๊ณต"
Users ||--o{ Orders: "์ฃผ๋ฌธ"
Stores ||--o{ Orders: "์ฃผ๋ฌธ"
Orders ||--o{ Reviews: "ํ๊ธฐ"
Users ||--o{ Reviews: "์์ฑ"
Stores ||--o{ Reviews: "๋ฐ์"
์๋ก์ด ๊ณ์ ์ ์์ฑํ๊ณ JWT ํ ํฐ์ ๋ฐ๊ธ
- ์ด๋ฉ์ผ ์ค๋ณต ๊ฒ์ฌ: ์ด๋ฏธ ๋ฑ๋ก๋ ์ด๋ฉ์ผ์ด๋ฉด ์์ธ ๋ฐ์.
- ๋น๋ฐ๋ฒํธ ์ํธํ: ์์ ํ๊ฒ ์ํธํ ํ ์ ์ฅ.
- ์ ์ ์ญํ ์ค์ : ์ ๋ ฅ๋ ์ญํ ์ ๋ง๋ ๊ถํ ๋ถ์ฌ.
์ธ์ฆ ํ JWT ํ ํฐ์ ๋ฐ๊ธ
- ์ด๋ฉ์ผ ํ์ธ: ๋ฑ๋ก๋ ์ ์ ์ธ์ง ํ์ธ.
- ๋น๋ฐ๋ฒํธ ํ์ธ: ๋น๋ฐ๋ฒํธ ์ผ์น ์ฌ๋ถ ํ์ธ.
๊ธฐ์กด ๋น๋ฐ๋ฒํธ ํ์ธ ํ ์๋ก์ด ๋น๋ฐ๋ฒํธ๋ก ๋ณ๊ฒฝ
- ๊ธฐ์กด ๋น๋ฐ๋ฒํธ ํ์ธ: ์ ๋ ฅ๋ ๋น๋ฐ๋ฒํธ๊ฐ ์ผ์นํ๋์ง ํ์ธ.
- ์ ๋น๋ฐ๋ฒํธ ํ์ธ: ๊ธฐ์กด ๋น๋ฐ๋ฒํธ์ ๋ค๋ฅธ์ง ํ์ธ ํ ๋ณ๊ฒฝ.
ํ์ ํํด API๋ ๋น๋ฐ๋ฒํธ ํ์ธ ํ ๊ณ์ ์ ์ญ์ ์ฒ๋ฆฌ (Soft Delete)
- ๋น๋ฐ๋ฒํธ ํ์ธ: ์ ์ฅ๋ ๋น๋ฐ๋ฒํธ์ ์ผ์นํ๋์ง ํ์ธ.
- ํํด ์ฒ๋ฆฌ: ํํด ์ํ๋ก ๋ณ๊ฒฝ ํ ์ ์ฅ.
์ฌ์ฅ๋ ๊ถํ์ผ๋ก ๊ฐ๊ฒ๋ฅผ ์์ฑ
- ์ฌ์ฅ๋ ๊ถํ ํ์ธ: ๊ถํ์ด ์์ผ๋ฉด ์์ธ ๋ฐ์.
- ๊ฐ๊ฒ ์ด๋ฆ ์ค๋ณต ํ์ธ: ์ด๋ฆ ์ค๋ณต์ด๋ฉด ์์ธ ๋ฐ์.
- ๊ฐ๊ฒ ์ต๋ ์์ฑ ์ ํ: ์ต๋ 3๊ฐ๊น์ง ๊ฐ๊ฒ ์์ฑ ๊ฐ๋ฅ.
์ฌ์ฅ๋์ ๊ฐ๊ฒ ์ ๋ณด๋ฅผ ์์ ๊ฐ๋ฅ
- ๊ฐ๊ฒ ์ด๋ฆ ์ค๋ณต ํ์ธ: ๋ค๋ฅธ ๊ฐ๊ฒ์ ์ด๋ฆ ์ค๋ณต๋์ง ์๋๋ก ํ์ธ.
- ๊ถํ ํ์ธ: ๊ฐ๊ฒ ์์ ์๋ง ์์ ๊ฐ๋ฅ.
์ฌ์ฅ๋์ ๊ฐ๊ฒ๋ฅผ ํ์ ๊ฐ๋ฅ (Soft Delete)
- ๊ถํ ํ์ธ: ๊ฐ๊ฒ ์์ ์๋ง ํ์ ๊ฐ๋ฅ.
- ๋ฉ๋ด ์ญ์ : ํด๋น ๊ฐ๊ฒ์ ์กด์ฌํ๋ ๋ฉ๋ด๋ค๋ ๊ฐ์ด ์ญ์ .
ํน์ ๊ฐ๊ฒ ์ด๋ฆ์ผ๋ก ๊ฐ๊ฒ ๋ชฉ๋ก์ ๊ฒ์ํ๊ณ , ์์ธ ์ ๋ณด๋ฅผ ์กฐํ
- ๊ฐ๊ฒ ์ด๋ฆ ๊ฒ์: ์ด๋ฆ์ผ๋ก ๊ฐ๊ฒ ๋ชฉ๋ก์ ์กฐํ.
- ๊ฐ๊ฒ ์์ธ ์ ๋ณด ์กฐํ: ๊ฐ๊ฒ ID๋ก ์ธ๋ถ ์ ๋ณด๋ฅผ ํ์ธ.
์ฌ์ฅ๋์ด ์ด์ํ๋ ๊ฐ๊ฒ์ ๋งค์ถ ๋ฐ ์ฃผ๋ฌธ ํต๊ณ๋ฅผ ์กฐํ
- ๊ถํ ํ์ธ: ์ฌ์ฅ๋๋ง ํต๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค.
- ๋ ์ง ํ์ ํ์ธ: ์ผ๋ณ ๋ฐ ๊ธฐ๊ฐ๋ณ๋ก ํต๊ณ ์กฐํ ๊ฐ๋ฅ.
์ฌ์ฅ๋ ๊ถํ์ผ๋ก ์๋ก์ด ๋ฉ๋ด๋ฅผ ๋ฑ๋ก
- ๋ฉ๋ด ์ค๋ณต ํ์ธ: ๊ฐ์ ๊ฐ๊ฒ์ ์ด๋ฏธ ๋ฑ๋ก๋ ๋ฉ๋ด๊ฐ ์๋์ง ํ์ธ.
- ๊ถํ ํ์ธ: ๊ฐ๊ฒ ์์ ์๋ง ๋ฉ๋ด ๋ฑ๋ก ๊ฐ๋ฅ.
์ฌ์ฅ๋์ ๋ฉ๋ด ์ ๋ณด๋ฅผ ์์ ํ ์ ์์
- ๋ฉ๋ด ์กด์ฌ ์ฌ๋ถ ํ์ธ: ๋ฉ๋ด๊ฐ ์กด์ฌํ๋์ง ํ์ธ ํ ์์ .
- ๊ถํ ํ์ธ: ๊ฐ๊ฒ ์์ ์๋ง ๋ฉ๋ด ๋ฑ๋ก ๊ฐ๋ฅ.
์ฌ์ฅ๋์ ๋ฉ๋ด๋ฅผ ์ญ์ ํ ์ ์์ (Soft Delete)
- ๊ถํ ๊ฒ์ฆ: ์ฌ์ฅ๋ ๊ถํ ํ์ธ ํ ์ญ์ ์ฒ๋ฆฌ.
์ฌ์ฉ์๊ฐ ์ ํํ ๋ฉ๋ด๋ฅผ ์ฃผ๋ฌธํฉ๋๋ค.
- ๊ถํ ๊ฒ์ฆ: ์ฌ์ฉ์ ๊ถํ ํ์ธ
- ๋ฉ๋ด ๋ฐ ๊ฐ๊ฒ ๊ฒ์ฆ: ๋ฉ๋ด์ ๊ฐ๊ฒ์ ์ ํจ์ฑ ํ์ธ.
- ์ต์ ์ฃผ๋ฌธ ๊ธ์ก ํ์ธ: ์ต์ ์ฃผ๋ฌธ ๊ธ์ก ์ด์์ธ์ง ํ์ธ.
๋ชจ๋ ์ฃผ๋ฌธ ๋ด์ญ์ ์กฐํํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ์ผ ๊ฒฝ์ฐ: ์ฌ์ฉ์์ ์ฃผ๋ฌธ ๋ด์ญ ์กฐํ
- ์ฌ์ฅ๋ ์ผ ๊ฒฝ์ฐ: ๊ฐ๊ฒ์ ์ฃผ๋ฌธ ๋ด์ญ ์กฐํ
์ฌ์ฅ๋์ ์ฃผ๋ฌธ์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์.
- ์ฃผ๋ฌธ ์ํ ๋ณ๊ฒฝ: '์ฃผ๋ฌธ ์๋ฝ' -> '๋ฐฐ๋ฌ ์์' -> '์๋ฃ' ์์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
์ฃผ๋ฌธ์ ์ทจ์ํ ์ ์์(Soft Delete)
- ์ฌ์ฉ์ ์ผ ๊ฒฝ์ฐ: ์ฃผ๋ฌธ ์๋ฝ ์ด์ ์ทจ์ ๊ฐ๋ฅ
- ์ฌ์ฅ๋ ์ผ ๊ฒฝ์ฐ: ๋ณธ์ธ ๊ฐ๊ฒ์ ์ฃผ๋ฌธ ์ทจ์ ๊ฐ๋ฅ
์ฌ์ฉ์๊ฐ ์ฃผ๋ฌธํ ๋ฉ๋ด์ ๋ํ์ฌ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ถํ ๊ฒ์ฆ: ์ฌ์ฉ์ ๊ถํ ํ์ธ
- ๋ฉ๋ด ๋ฐ ๊ฐ๊ฒ ๊ฒ์ฆ: ๋ฉ๋ด์ ๊ฐ๊ฒ์ ์ ํจ์ฑ ํ์ธ.
- ์ํ ํ์ธ: ์๋ฃ๋ ์ฃผ๋ฌธ ์ธ์ง ํ์ธ
ํด๋น ๊ฐ๊ฒ์ ๋ชจ๋ ๋ฆฌ๋ทฐ ๋ด์ญ์ ์กฐํํ ์ ์์ต๋๋ค.
- ๊ฐ๊ฒ ๊ฒ์ฆ: ๊ฐ๊ฒ์ ์ ํจ์ฑ ํ์ธ
- ๋ฐํ : ์ด ๋ฆฌ๋ทฐ ๊ฐ์, ํ์ ์ ๊ฐ์ด ๋ฐํ
์ฌ์ฉ์๋ ๋ฆฌ๋ทฐ ์์ ๊ฐ๋ฅ.
- ๋ฆฌ๋ทฐ ๊ฒ์ฆ: ๋ฆฌ๋ทฐ ์ ํจ์ฑ ํ์ธ.
- ๊ถํ ๊ฒ์ฆ: ์์ฑ์ ์ ํจ์ฑ ํ์ธ.
๋ฆฌ๋ทฐ๋ฅผ ์ญ์ ํ ์ ์์(Soft Delete)
- ๋ฆฌ๋ทฐ ๊ฒ์ฆ: ๋ฆฌ๋ทฐ ์ ํจ์ฑ ํ์ธ.
- ๊ถํ ๊ฒ์ฆ: ์์ฑ์ ์ ํจ์ฑ ํ์ธ.
์ฌ์ฅ๋ ๊ถํ์ด ์๋ ์ฌ์ฉ์์ธ์ง ํ์ธ
์ฌ์ฉ์ ๊ถํ์ด ์๋ ์ฌ์ฉ์์ธ์ง ํ์ธ
์ฃผ๋ฌธ ์์ฒญ ๋ฐ ์ํ ๋ณ๊ฒฝ ์ ๋ก๊ทธ๋ฅผ ์ ์ฅํ ์ ์๋๋ก ๊ตฌํ
-
๋ฌธ์ :
๊ฐ๊ฒ๋ณ ์ ์ฒด ๋ฆฌ๋ทฐ์ ๋ฆฌ๋ทฐ ์ด ๊ฐ์, ๋ณ์ ํ๊ท ์ Page ๊ฐ์ฒด๋ก ๋ฐํํ๋ ค๊ณ ํ๊ณ , ์ด ๊ฒฝ์ฐ ๊ฐ์์ ํ๊ท ์ด ํจ๊ป ํ์ด์ง๋์ด totalElements์ ํฌํจ๋จ -
ํด๊ฒฐ:
๋ฆฌ๋ทฐ๋ง Page ๊ฐ์ฒด๋ก ์ ์ฅํ ํ ์ด ๊ฐ์์ ๋ณ์ ํ๊ท ์ ํฌํจํ ์๋ก์ด ์๋ต ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ํด๊ฒฐ
-
๋ฌธ์ :
๋ค์์ Controller์์๋ AuthUser๋ฅผ Service์ ๊ทธ๋๋ก ๊ฐ์ ธ์ ์ฌ์ฉํ์. Order ๋ถ๋ถ์์๋ AuthUser๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํ๊ณ ์์๊ณ ๋ฐ๋ผ์ ์ฝ๋์ ํต์ผ์ฑ ์ ํ ๋ฐ Controller ๋ถ๋ถ์์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๊ฒ ๋จ. -
ํด๊ฒฐ:
๋ฐ๋ผ์ AuthUser๋ฅผ Service ๋ถ๋ถ์ผ๋ก ๊ฐ์ ธ์์ ์ฒ๋ฆฌํจ์ผ๋ก์จ, ์ฝ๋ ํต์ผ์ฑ ๋ฐ Service ๋ถ๋ถ์์ ์จ์ ํ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ ์ ์๋๋ก ๊ตฌํ
-
๋ฌธ์ :
์ด๊ธฐ๊ณํ์ ์ฃผ๋ฌธ์์ฑ API url : api/v1/stores/{storeId}/orders ์ดํ ๋ฉ๋ด ํธ์ถ ๋ฐฉ์์ ๊ณ ๋ฏผํ ํ ์์ ๋ url :api/v1/stores/{storeId}/menus/{menuId}/orders ํ์ง๋ง Order์ Menu๋ ์ฐ๊ด๊ด๊ณ๊ฐ ์์, ์์ ๊ฐ์ url๋ก ์ธํด @RequestMapping์ ํจ์จ์ ์ธ ์ฌ์ฉ๋ ๋ถ๊ฐ๋ฅ -
ํด๊ฒฐ:
url ์์ - api/v1/orders, ์ฐ๊ด๊ด๊ณ๊ฐ ์๋ store์ ๊ฒฝ์ฐ request body๋ก storeId๋ฅผ ๋ฐ์ ์ฒ๋ฆฌ