Skip to content

3BodyProgrammers/delivery-project

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

22 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ› ๏ธ Sparta Delivery API Documentation

๐Ÿ ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

"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์ผ

๐Ÿ“„ API ๋ช…์„ธ์„œ

๐Ÿ”‘ ๋กœ๊ทธ์ธ

๋‹ด๋‹น์ž ์ƒํƒœ 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 }

๐Ÿ”ƒ ERD (Entity-Relationship Diagram)

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: "๋ฐ›์Œ"
Loading

Sparta Delivery API Documentation

๐Ÿš€ ์ฃผ์š” ๊ธฐ๋Šฅ ๋ฐ ๊ตฌํ˜„

๐Ÿ”‘ 1. ๋กœ๊ทธ์ธ

โž• ํšŒ์›๊ฐ€์ž…

์ƒˆ๋กœ์šด ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰

  • ์ด๋ฉ”์ผ ์ค‘๋ณต ๊ฒ€์‚ฌ: ์ด๋ฏธ ๋“ฑ๋ก๋œ ์ด๋ฉ”์ผ์ด๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”: ์•ˆ์ „ํ•˜๊ฒŒ ์•”ํ˜ธํ™” ํ›„ ์ €์žฅ.
  • ์œ ์ € ์—ญํ•  ์„ค์ •: ์ž…๋ ฅ๋œ ์—ญํ• ์— ๋งž๋Š” ๊ถŒํ•œ ๋ถ€์—ฌ.

๐Ÿ”‘ ๋กœ๊ทธ์ธ

์ธ์ฆ ํ›„ JWT ํ† ํฐ์„ ๋ฐœ๊ธ‰

  • ์ด๋ฉ”์ผ ํ™•์ธ: ๋“ฑ๋ก๋œ ์œ ์ €์ธ์ง€ ํ™•์ธ.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ: ๋น„๋ฐ€๋ฒˆํ˜ธ ์ผ์น˜ ์—ฌ๋ถ€ ํ™•์ธ.

๐Ÿ”„ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ํ›„ ์ƒˆ๋กœ์šด ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋ณ€๊ฒฝ

  • ๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ: ์ž…๋ ฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ.
  • ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ: ๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋‹ค๋ฅธ์ง€ ํ™•์ธ ํ›„ ๋ณ€๊ฒฝ.

โŒ ํšŒ์› ํƒˆํ‡ด

ํšŒ์› ํƒˆํ‡ด API๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ ํ›„ ๊ณ„์ •์„ ์‚ญ์ œ ์ฒ˜๋ฆฌ (Soft Delete)

  • ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ: ์ €์žฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ.
  • ํƒˆํ‡ด ์ฒ˜๋ฆฌ: ํƒˆํ‡ด ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ ํ›„ ์ €์žฅ.

๐Ÿช 2. ๊ฐ€๊ฒŒ ๊ด€๋ฆฌ

โž• ๊ฐ€๊ฒŒ ๋“ฑ๋ก

์‚ฌ์žฅ๋‹˜ ๊ถŒํ•œ์œผ๋กœ ๊ฐ€๊ฒŒ๋ฅผ ์ƒ์„ฑ

  • ์‚ฌ์žฅ๋‹˜ ๊ถŒํ•œ ํ™•์ธ: ๊ถŒํ•œ์ด ์—†์œผ๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ.
  • ๊ฐ€๊ฒŒ ์ด๋ฆ„ ์ค‘๋ณต ํ™•์ธ: ์ด๋ฆ„ ์ค‘๋ณต์ด๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ.
  • ๊ฐ€๊ฒŒ ์ตœ๋Œ€ ์ƒ์„ฑ ์ œํ•œ: ์ตœ๋Œ€ 3๊ฐœ๊นŒ์ง€ ๊ฐ€๊ฒŒ ์ƒ์„ฑ ๊ฐ€๋Šฅ.

โœ๏ธ ๊ฐ€๊ฒŒ ์ˆ˜์ •

์‚ฌ์žฅ๋‹˜์€ ๊ฐ€๊ฒŒ ์ •๋ณด๋ฅผ ์ˆ˜์ • ๊ฐ€๋Šฅ

  • ๊ฐ€๊ฒŒ ์ด๋ฆ„ ์ค‘๋ณต ํ™•์ธ: ๋‹ค๋ฅธ ๊ฐ€๊ฒŒ์™€ ์ด๋ฆ„ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ํ™•์ธ.
  • ๊ถŒํ•œ ํ™•์ธ: ๊ฐ€๊ฒŒ ์†Œ์œ ์ž๋งŒ ์ˆ˜์ • ๊ฐ€๋Šฅ.

โŒ ๊ฐ€๊ฒŒ ํ์—…

์‚ฌ์žฅ๋‹˜์€ ๊ฐ€๊ฒŒ๋ฅผ ํ์—… ๊ฐ€๋Šฅ (Soft Delete)

  • ๊ถŒํ•œ ํ™•์ธ: ๊ฐ€๊ฒŒ ์†Œ์œ ์ž๋งŒ ํ์—… ๊ฐ€๋Šฅ.
  • ๋ฉ”๋‰ด ์‚ญ์ œ: ํ•ด๋‹น ๊ฐ€๊ฒŒ์— ์กด์žฌํ•˜๋Š” ๋ฉ”๋‰ด๋“ค๋„ ๊ฐ™์ด ์‚ญ์ œ.

๐Ÿ” ๊ฐ€๊ฒŒ ๊ฒ€์ƒ‰ ๋ฐ ์กฐํšŒ

ํŠน์ • ๊ฐ€๊ฒŒ ์ด๋ฆ„์œผ๋กœ ๊ฐ€๊ฒŒ ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰ํ•˜๊ณ , ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒ

  • ๊ฐ€๊ฒŒ ์ด๋ฆ„ ๊ฒ€์ƒ‰: ์ด๋ฆ„์œผ๋กœ ๊ฐ€๊ฒŒ ๋ชฉ๋ก์„ ์กฐํšŒ.
  • ๊ฐ€๊ฒŒ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ: ๊ฐ€๊ฒŒ ID๋กœ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ํ™•์ธ.

๐Ÿ“Š ๊ฐ€๊ฒŒ ํ†ต๊ณ„ ์กฐํšŒ

์‚ฌ์žฅ๋‹˜์ด ์šด์˜ํ•˜๋Š” ๊ฐ€๊ฒŒ์˜ ๋งค์ถœ ๋ฐ ์ฃผ๋ฌธ ํ†ต๊ณ„๋ฅผ ์กฐํšŒ

  • ๊ถŒํ•œ ํ™•์ธ: ์‚ฌ์žฅ๋‹˜๋งŒ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ ์งœ ํ˜•์‹ ํ™•์ธ: ์ผ๋ณ„ ๋ฐ ๊ธฐ๊ฐ„๋ณ„๋กœ ํ†ต๊ณ„ ์กฐํšŒ ๊ฐ€๋Šฅ.

๐Ÿฝ๏ธ 3. ๋ฉ”๋‰ด ๊ด€๋ฆฌ

โž• ๋ฉ”๋‰ด ์ƒ์„ฑ

์‚ฌ์žฅ๋‹˜ ๊ถŒํ•œ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฉ”๋‰ด๋ฅผ ๋“ฑ๋ก

  • ๋ฉ”๋‰ด ์ค‘๋ณต ํ™•์ธ: ๊ฐ™์€ ๊ฐ€๊ฒŒ์— ์ด๋ฏธ ๋“ฑ๋ก๋œ ๋ฉ”๋‰ด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ.
  • ๊ถŒํ•œ ํ™•์ธ: ๊ฐ€๊ฒŒ ์†Œ์œ ์ž๋งŒ ๋ฉ”๋‰ด ๋“ฑ๋ก ๊ฐ€๋Šฅ.

โœ๏ธ ๋ฉ”๋‰ด ์ˆ˜์ •

์‚ฌ์žฅ๋‹˜์€ ๋ฉ”๋‰ด ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ

  • ๋ฉ”๋‰ด ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ: ๋ฉ”๋‰ด๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ ํ›„ ์ˆ˜์ •.
  • ๊ถŒํ•œ ํ™•์ธ: ๊ฐ€๊ฒŒ ์†Œ์œ ์ž๋งŒ ๋ฉ”๋‰ด ๋“ฑ๋ก ๊ฐ€๋Šฅ.

โŒ ๋ฉ”๋‰ด ์‚ญ์ œ

์‚ฌ์žฅ๋‹˜์€ ๋ฉ”๋‰ด๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Œ (Soft Delete)

  • ๊ถŒํ•œ ๊ฒ€์ฆ: ์‚ฌ์žฅ๋‹˜ ๊ถŒํ•œ ํ™•์ธ ํ›„ ์‚ญ์ œ ์ฒ˜๋ฆฌ.

๐Ÿ“ฆ 4. ์ฃผ๋ฌธ ๊ด€๋ฆฌ

๐Ÿ›’ ์ฃผ๋ฌธ ์ƒ์„ฑ

์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๋ฉ”๋‰ด๋ฅผ ์ฃผ๋ฌธํ•ฉ๋‹ˆ๋‹ค.

  • ๊ถŒํ•œ ๊ฒ€์ฆ: ์‚ฌ์šฉ์ž ๊ถŒํ•œ ํ™•์ธ
  • ๋ฉ”๋‰ด ๋ฐ ๊ฐ€๊ฒŒ ๊ฒ€์ฆ: ๋ฉ”๋‰ด์™€ ๊ฐ€๊ฒŒ์˜ ์œ ํšจ์„ฑ ํ™•์ธ.
  • ์ตœ์†Œ ์ฃผ๋ฌธ ๊ธˆ์•ก ํ™•์ธ: ์ตœ์†Œ ์ฃผ๋ฌธ ๊ธˆ์•ก ์ด์ƒ์ธ์ง€ ํ™•์ธ.

๐Ÿ“œ ์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ

๋ชจ๋“  ์ฃผ๋ฌธ ๋‚ด์—ญ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž ์ผ ๊ฒฝ์šฐ: ์‚ฌ์šฉ์ž์˜ ์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ
  • ์‚ฌ์žฅ๋‹˜ ์ผ ๊ฒฝ์šฐ: ๊ฐ€๊ฒŒ์˜ ์ฃผ๋ฌธ ๋‚ด์—ญ ์กฐํšŒ

๐Ÿ”„ ์ฃผ๋ฌธ ์ƒํƒœ ๋ณ€๊ฒฝ (์‚ฌ์žฅ๋‹˜๋งŒ)

์‚ฌ์žฅ๋‹˜์€ ์ฃผ๋ฌธ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Œ.

  • ์ฃผ๋ฌธ ์ƒํƒœ ๋ณ€๊ฒฝ: '์ฃผ๋ฌธ ์ˆ˜๋ฝ' -> '๋ฐฐ๋‹ฌ ์‹œ์ž‘' -> '์™„๋ฃŒ' ์ˆœ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

โŒ ์ฃผ๋ฌธ ์ทจ์†Œ

์ฃผ๋ฌธ์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Œ(Soft Delete)

  • ์‚ฌ์šฉ์ž ์ผ ๊ฒฝ์šฐ: ์ฃผ๋ฌธ ์ˆ˜๋ฝ ์ด์ „ ์ทจ์†Œ ๊ฐ€๋Šฅ
  • ์‚ฌ์žฅ๋‹˜ ์ผ ๊ฒฝ์šฐ: ๋ณธ์ธ ๊ฐ€๊ฒŒ์˜ ์ฃผ๋ฌธ ์ทจ์†Œ ๊ฐ€๋Šฅ

โญ 5. ๋ฆฌ๋ทฐ ๊ด€๋ฆฌ

๐Ÿ›’ ๋ฆฌ๋ทฐ ์ƒ์„ฑ

์‚ฌ์šฉ์ž๊ฐ€ ์ฃผ๋ฌธํ•œ ๋ฉ”๋‰ด์— ๋Œ€ํ•˜์—ฌ ๋ฆฌ๋ทฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • ๊ถŒํ•œ ๊ฒ€์ฆ: ์‚ฌ์šฉ์ž ๊ถŒํ•œ ํ™•์ธ
  • ๋ฉ”๋‰ด ๋ฐ ๊ฐ€๊ฒŒ ๊ฒ€์ฆ: ๋ฉ”๋‰ด์™€ ๊ฐ€๊ฒŒ์˜ ์œ ํšจ์„ฑ ํ™•์ธ.
  • ์ƒํƒœ ํ™•์ธ: ์™„๋ฃŒ๋œ ์ฃผ๋ฌธ ์ธ์ง€ ํ™•์ธ

๐Ÿ“œ ๋ฆฌ๋ทฐ ์กฐํšŒ

ํ•ด๋‹น ๊ฐ€๊ฒŒ์˜ ๋ชจ๋“  ๋ฆฌ๋ทฐ ๋‚ด์—ญ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ€๊ฒŒ ๊ฒ€์ฆ: ๊ฐ€๊ฒŒ์˜ ์œ ํšจ์„ฑ ํ™•์ธ
  • ๋ฐ˜ํ™˜ : ์ด ๋ฆฌ๋ทฐ ๊ฐœ์ˆ˜, ํ‰์ ์„ ๊ฐ™์ด ๋ฐ˜ํ™˜

๐Ÿ”„ ๋ฆฌ๋ทฐ ์ˆ˜์ •

์‚ฌ์šฉ์ž๋Š” ๋ฆฌ๋ทฐ ์ˆ˜์ • ๊ฐ€๋Šฅ.

  • ๋ฆฌ๋ทฐ ๊ฒ€์ฆ: ๋ฆฌ๋ทฐ ์œ ํšจ์„ฑ ํ™•์ธ.
  • ๊ถŒํ•œ ๊ฒ€์ฆ: ์ž‘์„ฑ์ž ์œ ํšจ์„ฑ ํ™•์ธ.

โŒ ๋ฆฌ๋ทฐ ์‚ญ์ œ

๋ฆฌ๋ทฐ๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Œ(Soft Delete)

  • ๋ฆฌ๋ทฐ ๊ฒ€์ฆ: ๋ฆฌ๋ทฐ ์œ ํšจ์„ฑ ํ™•์ธ.
  • ๊ถŒํ•œ ๊ฒ€์ฆ: ์ž‘์„ฑ์ž ์œ ํšจ์„ฑ ํ™•์ธ.

๐Ÿ”‘ 6. AOP ์‚ฌ์šฉ

๐Ÿช ์‚ฌ์žฅ๋‹˜ ๊ถŒํ•œ ๊ฒ€์ฆ

์‚ฌ์žฅ๋‹˜ ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธ

๐Ÿ‘ค ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๊ฒ€์ฆ

์‚ฌ์šฉ์ž ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธ

๐Ÿ“ ๋กœ๊น…์ฒ˜๋ฆฌ

์ฃผ๋ฌธ ์š”์ฒญ ๋ฐ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„


๐Ÿ› ๏ธ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

1. ๊ฐ€๊ฒŒ๋ณ„ ์ „์ฒด ๋ฆฌ๋ทฐ ์กฐํšŒ ๊ธฐ๋Šฅ ๋ฐ˜ํ™˜ ํƒ€์ž… ๋ฌธ์ œ

  • ๋ฌธ์ œ:
    ๊ฐ€๊ฒŒ๋ณ„ ์ „์ฒด ๋ฆฌ๋ทฐ์™€ ๋ฆฌ๋ทฐ ์ด ๊ฐœ์ˆ˜, ๋ณ„์  ํ‰๊ท ์„ Page ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜๋ ค๊ณ  ํ–ˆ๊ณ , ์ด ๊ฒฝ์šฐ ๊ฐœ์ˆ˜์™€ ํ‰๊ท ์ด ํ•จ๊ป˜ ํŽ˜์ด์ง•๋˜์–ด totalElements์— ํฌํ•จ๋จ

  • ํ•ด๊ฒฐ:
    ๋ฆฌ๋ทฐ๋งŒ Page ๊ฐ์ฒด๋กœ ์ €์žฅํ•œ ํ›„ ์ด ๊ฐœ์ˆ˜์™€ ๋ณ„์  ํ‰๊ท ์„ ํฌํ•จํ•œ ์ƒˆ๋กœ์šด ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํ•ด๊ฒฐ


2. Controller์—์„œ AuthUser๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ Service์˜ ๋ฉ”์„œ๋“œ๋กœ ์š”์ฒญํ•˜๋Š” ๋ฌธ์ œ

  • ๋ฌธ์ œ:
    ๋‹ค์ˆ˜์˜ Controller์—์„œ๋Š” AuthUser๋ฅผ Service์— ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ–ˆ์Œ. Order ๋ถ€๋ถ„์—์„œ๋Š” AuthUser๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๋”ฐ๋ผ์„œ ์ฝ”๋“œ์˜ ํ†ต์ผ์„ฑ ์ €ํ•˜ ๋ฐ Controller ๋ถ€๋ถ„์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋จ.

  • ํ•ด๊ฒฐ:
    ๋”ฐ๋ผ์„œ AuthUser๋ฅผ Service ๋ถ€๋ถ„์œผ๋กœ ๊ฐ€์ ธ์™€์„œ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ, ์ฝ”๋“œ ํ†ต์ผ์„ฑ ๋ฐ Service ๋ถ€๋ถ„์—์„œ ์˜จ์ „ํžˆ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„


3. ์ฃผ๋ฌธ์ƒ์„ฑ API ๊ณ„ํš์˜ ์˜ค๋ฅ˜

  • ๋ฌธ์ œ:
    ์ดˆ๊ธฐ๊ณ„ํš์˜ ์ฃผ๋ฌธ์ƒ์„ฑ 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๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌ


โœ… Test Coverage

image

๐Ÿ”— ์ฐธ์กฐ

ํŒ€ ๋…ธ์…˜ ํŽ˜์ด์ง€

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •  

Languages