Ch.1 AI 활용 비즈니스 프로젝트
- 국비지원 (스파르타)
- 2025. 2. 12. 20:45
국비지원 첫 팀 프로젝트
팀원: 박용훈, 김대연, 김수현, 백승규
- API 명세서
https://www.notion.so/teamsparta/1982dc3ef514804ab7d9e1dfb3b9b7d0?v=1982dc3ef51481428b75000cf38890d1
API 명세서 | Notion
Made with Notion, the all-in-one connected workspace with publishing capabilities.
teamsparta.notion.site
기능 | 설명 | 컨트롤러 | 권한 | Http 메서드 | Path | header | Request | Response | 담당자 | 텍스트 |
1. 사용자(User) API | 1.1 회원가입 | auth-controller | ALL | POST | /api/users/register | { "username": "john_doe", "email": "mailto:john@example.com", "password": "securepassword", "name": "John Doe", "phone": "01012345678", "role": "CUSTOMER" } |
{ "id": 1, "username": "john_doe", "email": "mailto:john@example.com", "name": "John Doe", "phone": "01012345678", "role": "CUSTOMER", "created_at": "2025-02-12T12:00:00Z" } |
|||
1. 사용자(User) API | 1.2 로그인 | auth-controller | ALL | POST | /api/users/login | { "userId": "mailto:john@example.com", "password": "securepassword" } |
{ "token": "jwt-token" } |
|||
1. 사용자(User) API | 1.3 로그아웃 | user-controller | ALL | POST | /api/users/logout | Authorization: Bearer {token} | { "success”: true } |
|||
1. 사용자(User) API | 1.4 내정보 조회 | user-controller | CUSTOMER, OWNER | GET | /api/users/me | Authorization: Bearer {token} | { "id": 1, "username": "john_doe", "email": "mailto:john@example.com", "name": "John Doe", "phone": "01012345678", "role": "CUSTOMER", "created_at": "2025-02-12T12:00:00Z" } |
|||
1. 사용자(User) API | 1.5 내 정보 수정 | user-controller | CUSTOMER, OWNER | PUT | /api/users/me | Authorization: Bearer {token} | { "name": "John Updated", "phone": "01087654321" } |
{ "id": 1, "username": "john_doe", "email": "mailto:john@example.com", "name": "John Updated", "phone": "01087654321", "updated_at": "2025-02-12T14:00:00Z" } |
||
1. 사용자(User) API | 1.6 사용자 탈퇴 | user-controller | CUSTOMER, OWNER | DELETE | /api/users/me | Authorization: Bearer {token} |
{ "message": "계정이 삭제되었습니다." } |
|||
1. 사용자(User) API | 1.7 비밀번호 변경 API | user-controller | CUSTOMER, OWNER | POST | /api/users/me/password | Authorization: Bearer {token} | { "user_id": 1, "current_password": "oldpassword123", "new_password": "newpassword456" } |
{ "message": "비밀번호가 성공적으로 변경되었습니다." } |
||
1. 사용자(User) API | 1.8 사용자 목록 조회 | admin-controller | MASTER | GET | /api/admin/users | Authorization: Bearer {token} | { "total_count": 120, "page": 1, "size": 10, "users": [ { "id": 1, "username": "john_doe", "email": "john@example.com", "role": "CUSTOMER", "created_at": "2025-02-12T12:00:00Z" } ] } |
|||
1. 사용자(User) API | 1.8 특정 사용자 상세 조회 | admin-controller | MASTER | GET | /api/admin/users/{user_id} | Authorization: Bearer {token} |
{ "id": 1, "username": "admin", "email": "admin@example.com", "role": "MASTER" } | |||
1. 사용자(User) API | 1.9 특정 사용자 강제 탈퇴 | admin-controller | MASTER | DELETE | /api/admin/users/{user_id} | Authorization: Bearer {token} |
{ "message": "사용자가 삭제되었습니다." } | |||
1. 사용자(User) API | 2.0 사용자 권한 변경 | admin-controller | MASTER | PATCH | /api/users/{userId}/role | Authorization: Bearer {token} | { "role": "OWNER" } |
{ "message": "User role updated successfully", "userId": 12345, "newRole": "OWNER" } |
||
2. 배송지(Address) API | 2.1 배송지 추가 | delivery-controller | CUSTOMER | POST | /api/users/addresses | Authorization: Bearer {token} | { "address_name": "집", "recipient_name": "John Doe", "address": "서울특별시 강남구 역삼동", "zip_code": "06123", "is_default": true } |
{ "id": "uuid", "user_id": 1, "address_name": "집", "recipient_name": "John Doe", "address": "서울특별시 강남구 역삼동", "zip_code": "06123", "is_default": true, "created_at": "2025-02-12T12:34:56Z" } |
||
2. 배송지(Address) API | 2.2 배송지 조회 | delivery-controller | CUSTOMER | GET | /api/users/addresses | Authorization: Bearer {token} | [ { "id": "uuid", "address_name": "집", "recipient_name": "John Doe", "address": "서울특별시 강남구 역삼동", "zip_code": "06123", "is_default": true } ] |
|||
2. 배송지(Address) API | 2.3 배송지 정보 수정 | delivery-controller | CUSTOMER | PUT | /api/users/addresses/{userId} | Authorization: Bearer {token} | { "address_name": "집", "recipient_name": "Jane Doe", "address": "서울특별시 강남구 삼성동", "zip_code": "06233", "is_default": false } |
{ "id": "uuid", "address_name": "집", "recipient_name": "Jane Doe", "address": "서울특별시 강남구 삼성동", "zip_code": "06233", "is_default": false } |
||
2. 배송지(Address) API | 2.4 배송지 삭제 | delivery-controller | CUSTOMER | DELETE | /api/users/addresses/{userId} | Authorization: Bearer {token} | { "id": "uuid", "is_default": true } |
|||
3. 매장(Store) API | 3.1 매장 등록 요청 | store-controller | OWNER | POST | /api/stores | Authorization: Bearer {token} | { "name": "맛있는 치킨", "location_category_id": "uuid", "address": "서울 강남구", "phone": "0212345678", "image_url": "https://example.com/image.jpg" } |
{ "id": "uuid", "name": "맛있는 치킨", "address": "서울 강남구", "phone": "0212345678", "image_url": "https://example.com/image.jpg", "status": "PENDING", "message": "매장 등록 요청이 접수되었습니다." } |
매장 등록 플로우 관련해서 질문(튜터) | |
3. 매장(Store) API | 3.2 전체 매장 목록 조회(사용자용) | store-controller | ALL | GET | /api/stores | Authorization: Bearer {token} | [ { "id": "uuid", "name": "맛있는 치킨", "address": "서울 강남구", "phone": "0212345678", "image_url": "https://example.com/image.jpg", "status": "OPEN" } ] |
- 폐업은 조회 불가능( customer일경우) | ||
3. 매장(Store) API | 3.3 매장 상세 조회 | store-controller | ALL | GET | /api/stores/{store_id} | { "id": "uuid", "name": "맛있는 치킨", "address": "서울 강남구", "phone": "0212345678", "image_url": "https://example.com/image.jpg", "status": "OPEN", "menus": [ { "id": "uuid", "name": "후라이드 치킨", "price": 18000, "description": "바삭하고 맛있는 후라이드 치킨", "is_hidden": false }, { "id": "uuid", "name": "양념 치킨", "price": 19000, "description": "매콤달콤한 양념 치킨", "is_hidden": false } ], "reviews": [ { "id": "uuid", "user_id": 1, "rating": 5, "comment": "너무 맛있어요!", "created_at": "2025-02-12T12:34:56Z" }, { "id": "uuid", "user_id": 2, "rating": 4, "comment": "양념이 살짝 부족했어요.", "created_at": "2025-02-10T14:20:30Z" } ] } |
||||
3. 매장(Store) API | 3.4 매장 삭제 요청( 점주) | store-controller | OWNER | DELETE | /api/stores/{store_id} |
Authorization: Bearer {token} |
{ "id": "uuid", "status": "DELETION_REQUESTED", "message": "매장 삭제 요청이 접수되었습니다." } |
|||
3. 매장(Store) API | 3.5 매장 정보 수정 요청(업주용) | store-controller | OWNER | POST | /api/stores/{store_id} | Authorization: Bearer {token} | { "name": "새로운 치킨집", "address": "서울 서초구", "phone": "0212345679", "image_url": "https://example.com/new_image.jpg" } |
{ "id": "uuid", "status": "UPDATE_REQUESTED", "message": "매장 정보 수정 요청이 접수되었습니다." } |
||
3. 매장(Store) API | 3.6 전체 매장 목록 조회((관리자용) | admin-controller | MASTER | GET | /api/admin/stores | Authorization: Bearer {token} | [ { "id": "uuid", "name": "매장1", "status": "PENDING" }, { "id": "uuid", "name": "매장2", "status": "OPEN" } ] |
|||
3. 매장(Store) API | 3.7 특정 매장 강제 삭제(관리자) | admin-controller | MASTER | DELETE | /api/admin/stores/{store_id} | Authorization: Bearer {token} | { "message": "매장이 강제 삭제되었습니다." } | |||
3. 매장(Store) API | 3.8 매장 등록 ,삭제승인(관리자용) | admin-controller | MASTER | PUT | /api/admin/stores/{store_id}/approve | Authorization: Bearer {token} | { "id": "uuid", "status": "OPEN", "message": "승인되었습니다." }| |
- 폐업된 매장까지 모두 | ||
3. 매장(Store) API | 3.9 매장 정보 수정 (관리자용) | admin-controller | MASTER | PUT | /api/admin/stores/{store_id}/update | Authorization: Bearer {token} | { "id": "uuid", "status": "UPDATED", "message": "매장 정보 수정이 승인되었습니다." } |
|||
3. 매장(Store) API | 3.10 매장 정보 등록(관리자용) | admin-controller | MASTER | POST | /api/stores | |||||
4. 주문(Order) API | 4.1 주문 생성 요청 | order-controller | CUSTOMER, MANAGER, OWNER | POST | /api/orders | Authorization: Bearer {token} | { "store_id": "uuid", "address_id": "uuid", "total_price": 25000, "description": "문 앞에 두고 가주세요." } |
{ "id": "uuid", "status": "PENDING", "total_price": 25000, "description": "문 앞에 두고 가주세요.", "message": "주문이 접수되었습니다. 점주가 주문을 확인할 때까지 기다려주세요." } |
주문 유형: 온라인 주문과 대면 주문(가게에서 직접 주문) 모두 지원 대면 주문 처리: 가게 사장님이 직접 대면 주문을 접수 |
|
4. 주문(Order) API | 4.2 주문 접수 (점주) | order-controller | MANAGER, OWNER | PUT | /api/orders/{order_id}/accept | Authorization: Bearer {token} | { "id": "uuid", "status": "CONFIRMED", ”order_type” : “DELIVERY” "message": "주문이 접수되었습니다. 조리가 시작됩니다." } |
|||
4. 주문(Order) API | 4.3 주문 상태 변경 (점주) | order-controller | MANAGER, OWNER | PUT | /api/orders/{order_id}/status | Authorization: Bearer {token} | { "status": "DELIVERING" } |
{ "id": "uuid", "status": "DELIVERING", ”order_type” : “DELIVERY” "message": "주문이 배달 중입니다." } { "id": "uuid", "status": "COMPLETED", ”order_type” : “TAKEOUT” "message": "포장주문이 완료되었습니다." } |
||
4. 주문(Order) API | 4.4 주문 목록 조회(사용자용) | order-controller | CUSTOMER | GET | /api/orders/{userId} | Authorization: Bearer {token} | [ { "id": "uuid", "store_id": "uuid", "status": "PENDING", "total_price": 25000, "ordered_at": "2025-02-12T12:34:56Z" }, { "id": "uuid", "store_id": "uuid", "status": "COMPLETED", "total_price": 18000, "ordered_at": "2025-02-10T15:20:00Z" } ] |
|||
4. 주문(Order) API | 4.5 주문 목록 조회( 업주용) | order-controller | MANAGER, OWNER | GET | /api/orders/{storeId} | Authorization: Bearer {token} | [ { "id": "uuid", "store_id": "uuid", "status": "PENDING", "total_price": 25000, "ordered_at": "2025-02-12T12:34:56Z" }, { "id": "uuid", "store_id": "uuid", "status": "CONFIRMED", "total_price": 18000, "ordered_at": "2025-02-10T15:20:00Z" } ] |
|||
4. 주문(Order) API | 4.6 주문 상세 조회 - 고객: 본인이 주문한 내역만 조회 가능 - 점주: 자신의 매장에 들어온 주문만 조회 가능 - 관리자: 모든 주문 조회 가능 |
order-controller | ALL | GET | /api/orders/{orderId} | Authorization: Bearer {token} | { "id": "uuid", "user_id": 1, "store_id": "uuid", "store_name": "맛있는 치킨", "user_name": "김철수", "status": "PENDING", "total_price": 25000, "description": "문 앞에 두고 가주세요.", "ordered_at": "2025-02-12T12:34:56Z", "items": [ { "menu_id": "uuid", "menu_name": "후라이드 치킨", "quantity": 1, "price": 18000 }, { "menu_id": "uuid", "menu_name": "콜라 1.25L", "quantity": 1, "price": 2500 } ], "payment": { "payment_id": "uuid", "amount": 25000, "method": "KAKAO_PAY", "status": "PAID" } } |
|||
4. 주문(Order) API | 4.7 주문 취소 요청 (고객 & 점주) * 제약사항: 주문 상태가 PENDING일 때만 가능 |
order-controller | CUSTOMER, MANAGER, OWNER | PUT | /api/orders/{order_id}/cancel | Authorization: Bearer {token} | { "id": "uuid", "order_status": "CANCELLED", "payment_status": "REFUNDED", "message": "주문이 취소되고 결제가 환불되었습니다." } |
주문 취소: 주문 생성 후 5분 이내에만 취소 가능하도록 제한 | ||
4. 주문(Order) API | 4.8 전체 주문 목록 조회(관리자용) | admin-controller | MASTER | GET | /api/admin/orders | Authorization: Bearer {token} | [ { "id": "uuid", "status": "PENDING" }, { "id": "uuid", "status": "COMPLETED" } ] |
|||
4. 주문(Order) API | 4.9 주문 상태 강제 변경 (관리자) | admin-controller | MASTER | PUT | /api/admin/orders/{order_id}/status | Authorization: Bearer {token} | { "message": "주문 상태가 변경되었습니다." } | |||
5. 결제(Payment) API | 5.1 결제 요청 | order-controller | CUSTOMER | POST | /api/payments | Authorization: Bearer {token} | { "order_id": "uuid", "amount": 25000, "method": "KAKAO_PAY" } |
{ "id": "uuid", "status": "PENDING", "amount": 25000, "method": "KAKAO_PAY" } |
주문과 별개로 결제가 필요한 순간이 있는가?(튜터) 1. 결제 API 자체는 필요없을 수 있다.2. 다만, 주문 API 호출 시에 결제 이력 테이블에 데이터가 저장되어야 함.3. 결제 수단을 관리하는 API가 있어야 할 수도 있음. |
|
5. 결제(Payment) API | 5.2 환불 요청 * 제약사항: 주문 상태가 CONFIRMED 또는 COMPLETED일 때만 가능 |
order-controller | CUSTOMER | PUT | /api/orders/{order_id}/refund | Authorization: Bearer {token} | { "id": "uuid", "order_status": "REFUNDED", "payment_status": "REFUNDED", "message": "주문이 환불 요청되었습니다." } |
|||
5. 결제(Payment) API | 5.3 결제 취소 (결제만 취소) (예: 시스템 오류, 잘못된 결제 등) * 제약사항: 결제 상태가 PAID일 때만 가능 |
order-controller | CUSTOMER | PUT | /api/payments/{payment_id}/cancel | Authorization: Bearer {token} |
{ "id": "uuid", "payment_status": "CANCELLED", "message": "결제 취소요청되었습니다." } |
|||
5. 결제(Payment) API | 5.4 전체 결제 목록 조회 | admin-controller | MASTER | GET | /api/admin/payments | Authorization: Bearer {token} |
[{ "id": "uuid", "status": "PAID" }, {...}] | |||
5. 결제(Payment) API | 5.5 특정 결제 상세 조회 | admin-controller | MASTER | GET | /api/admin/payments/{payment_id} | Authorization: Bearer {token} |
{ "id": "uuid", "status": "PAID", "amount": 25000 } | |||
5. 결제(Payment) API | 5.6 사용자 환불 요청 승인(관리자) | admin-controller | MASTER | PUT | /api/admin/payments/{payment_id}/refund | Authorization: Bearer {token} |
{ "status": "REFUNDED" } | { "message": “ 환불처리 승인하였습니다." } | ||
6. 리뷰(Review) API | 6.1 리뷰 작성 | review-controller | CUSTOMER | POST | /api/reviews | Authorization: Bearer {token} | { "order_id": "uuid", "store_id": "uuid", "rating": 5, "comment": "맛있어요!" } |
{ "id": "uuid", "rating": 5, "comment": "맛있어요!" } |
||
6. 리뷰(Review) API | 6.2 매장 리뷰 조회 | review-controller | ALL | GET | /api/reviews?store_id=uuid | Authorization: Bearer {token} | [ { "id": "uuid", "rating": 5, "comment": "맛있어요!" } ] |
|||
6. 리뷰(Review) API | 6.3 사용자 리뷰 조회 | review-controller | CUSTOMER | GET | /api/reviews?user_id=uuid | Authorization: Bearer {token} | [ { "id": "uuid", "rating": 5, "comment": "맛있어요!" } ] |
|||
6. 리뷰(Review) API | 6.4 리뷰 수정 | review-controller | CUSTOMER | PUT | /api/reviews/{review_id} | Authorization: Bearer {token} | { "order_id": "uuid", "store_id": "uuid", "rating": 5, "comment": "맛있어요!" } |
{ "id": "uuid", "rating": 5, "comment": "맛있어요!" } |
||
6. 리뷰(Review) API | 6.5 리뷰 삭제(사용자용) | review-controller | CUSTOMER | DELETE | /api/reviews/{review_id} | Authorization: Bearer {token} | { "message": "리뷰가 삭제되었습니다." } | |||
6. 리뷰(Review) API | 6.6 전체 리뷰 목록 조회 | admin-controller | MASTER | GET | /api/admin/reviews | Authorization: Bearer {token} | [{ "id": "uuid", "rating": 5, "comment": "맛있어요!" }, {...}] | |||
6. 리뷰(Review) API | 6.7 특정 리뷰 삭제 | admin-controller | MASTER | DELETE | /api/admin/reviews/{review_id} | Authorization: Bearer {token} | { "message": "리뷰가 삭제되었습니다." } | |||
7. 메뉴(Menu) API | 7.1 메뉴 등록 | menu-controller | MANAGER, OWNER | POST | /api/menus | Authorization: Bearer {token} | { "store_id": "uuid", "name": "후라이드 치킨", "price": 18000, "description": "바삭하고 맛있는 후라이드 치킨", "is_hidden": false } |
{ "id": "uuid", "store_id": "uuid", "name": "후라이드 치킨", "price": 18000, "description": "바삭하고 맛있는 후라이드 치킨", "is_hidden": false } |
||
7. 메뉴(Menu) API | 7.2 특정 매장의 메뉴 목록 조회 | menu-controller | MANAGER, OWNER | GET | /api/menus?store_id=uuid | [ { "id": "uuid", "name": "후라이드 치킨", "price": 18000, "description": "바삭하고 맛있는 후라이드 치킨", "is_hidden": false }, { "id": "uuid", "name": "양념 치킨", "price": 19000, "description": "매콤달콤한 양념 치킨", "is_hidden": false } ] |
||||
7. 메뉴(Menu) API | 7.3 메뉴 상세 조회 | menu-controller | MANAGER, OWNER | GET | /api/menus/{menu_id} | { "id": "uuid", "store_id": "uuid", "name": "후라이드 치킨", "price": 18000, "description": "바삭하고 맛있는 후라이드 치킨", "is_hidden": false } |
||||
7. 메뉴(Menu) API | 7.4 메뉴 수정 | menu-controller | MANAGER, OWNER | PUT | /api/menus/{menu_id} | Authorization: Bearer {token} | { "name": "크리스피 치킨", "price": 18500, "description": "더 바삭한 크리스피 치킨", "is_hidden": false } |
{ "id": "uuid", "store_id": "uuid", "name": "크리스피 치킨", "price": 18500, "description": "더 바삭한 크리스피 치킨", "is_hidden": false } |
||
7. 메뉴(Menu) API | 7.5 메뉴 삭제 | menu-controller | MANAGER, OWNER | DELETE | /api/menus/{menu_id} | Authorization: Bearer {token} | { "message": "메뉴가 삭제되었습니다." } |
|||
8. 메뉴 옵션(Menu Option) API | 8.1 메뉴 옵션 추가 | menu-controller | MANAGER, OWNER | POST | /api/menus/{menu_id}/options | Header Authorization: Bearer {token} |
{ "name": "엑스트라 치즈", "price": 2000 } |
{ "id": "uuid", "menu_id": "uuid", "name": "엑스트라 치즈", "price": 2000 } |
||
8. 메뉴 옵션(Menu Option) API | 8.2 메뉴 옵션 조회 | menu-controller | MANAGER, OWNER | GET | /api/menus/{menu_id}/options | [ { "id": "uuid", "name": "엑스트라 치즈", "price": 2000 }, { "id": "uuid", "name": "L 사이즈", "price": 3000 } ] |
||||
8. 메뉴 옵션(Menu Option) API | 8.3 메뉴 옵션 수정 | menu-controller | MANAGER, OWNER | PUT | /api/menus/options/{option_id} | Header Authorization: Bearer {token} |
{ "name": "치즈 추가", "price": 2500 } |
{ "id": "uuid", "menu_id": "uuid", "name": "치즈 추가", "price": 2500 } |
||
8. 메뉴 옵션(Menu Option) API | 8.4 메뉴 옵션 삭제 | menu-controller | MANAGER, OWNER | DELETE | /api/menus/options/{option_id} | Header Authorization: Bearer {token} |
{ "message": "메뉴 옵션이 삭제되었습니다." } |
|||
9. AI 질의응답(AI Interaction) API | 9.1 AI 질의 생성 | ai-controller | MANAGER, OWNER | POST | /api/ai/interactions | Header Authorization: Bearer {token} |
{ "query_text": "후라이드 치킨에 대한 자세한 설명을 생성해줘" } |
{ "id": "uuid", "user_id": 1, "query_text": "후라이드 치킨에 대한 자세한 설명을 생성해줘", "response_text": "후라이드 치킨은 바삭한 튀김옷과 부드러운 속살이 조화를 이루는 인기 메뉴입니다.", "created_at": "2025-02-12T12:34:56Z" } |
||
9. AI 질의응답(AI Interaction) API | 9.2 AI 질의 목록 조회 | ai-controller | MANAGER, OWNER | GET | /api/ai/interactions | Header Authorization: Bearer {token} |
[ { "id": "uuid", "user_id": 1, "query_text": "후라이드 치킨에 대한 자세한 설명을 생성해줘", "response_text": "후라이드 치킨은 바삭한 튀김옷과 부드러운 속살이 조화를 이루는 인기 메뉴입니다.", "created_at": "2025-02-12T12:34:56Z" }, { "id": "uuid", "user_id": 1, "query_text": "양념 치킨과 후라이드 치킨의 차이점은?", "response_text": "양념 치킨은 매콤달콤한 소스를 입힌 반면, 후라이드 치킨은 튀김옷의 바삭함이 특징입니다.", "created_at": "2025-02-10T14:20:30Z" } ] |
|||
9. AI 질의응답(AI Interaction) API | 9.3 특정 AI 질의 상세 조회 | ai-controller | MANAGER, OWNER | GET | /api/ai/interactions/{interaction_id} | Header Authorization: Bearer {token} |
{ "id": "uuid", "user_id": 1, "query_text": "후라이드 치킨에 대한 자세한 설명을 생성해줘", "response_text": "후라이드 치킨은 바삭한 튀김옷과 부드러운 속살이 조화를 이루는 인기 메뉴입니다.", "created_at": "2025-02-12T12:34:56Z" } |
|||
9. AI 질의응답(AI Interaction) API | 9.4 특정 AI 질의 삭제 | ai-controller | MANAGER, OWNER | DELETE | /api/ai/interactions/{interaction_id} | Header Authorization: Bearer {token} |
{ "message": "AI 질의 기록이 삭제되었습니다." } |
|||
테이블 명세서 | Notion
1. p_users 테이블 필드 정의
teamsparta.notion.site
(마크다운이 정상적으로 복붙이 되지 않아 링크로 대체합니다.)
테이블 명세서
1. p_users 테이블 필드 정의
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
user_id 🗝️ | INTEGER | ✅ | ✅ | ❌ | 기본 키, 자동 증가 ID | |
userid | VARCHAR(255) | ✅ | ❌ | 로그인 ID (고유) | ||
VARCHAR(255) | ✅ | ❌ | 이메일 주소 | |||
password | VARCHAR(255) | ❌ | ❌ | 해시된 비밀번호 | ||
name | VARCHAR(100) | ❌ | ❌ | 사용자 실명 | ||
phone | VARCHAR(20) | ✅ | ❌ | 고유한 핸드폰 번호 | ||
role | VARCHAR(50) | ❌ | ❌ | 사용자 역할‘CUSTOMER’, ‘OWNER’, ‘MANAGER’, ‘MASTER’ | ||
created_at | TIMESTAMP | ❌ | ❌ | 생성 일시 | ||
created_by | VARCHAR(100) | ❌ | ✅ | 생성자 | ||
updated_at | TIMESTAMP | ❌ | ✅ | 수정 일시 | ||
updated_by | VARCHAR(100) | ❌ | ✅ | 수정자 | ||
deleted_at | TIMESTAMP | ❌ | ✅ | 삭제 일시 | ||
deleted_by | VARCHAR(100) | ❌ | ✅ | 삭제자 |
Table p_users {
id INTEGER [primary key, increment] // PK (자동 증가 ID)
username VARCHAR(255) [unique, not null] // name
email VARCHAR(255) [unique, not null] // 이메일 (로그인 ID)
password VARCHAR(255) [not null] // 암호 (해싱 저장)
name VARCHAR(100) [not null] // 사용자 이름
phone VARCHAR(20) [unique, not null] // 휴대폰 번호
role VARCHAR(50) [not null, note: "CUSTOMER, OWNER, MANAGER, MASTER"] // 역할 구분 (고객, 점주, 관리자)
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_users (사용자) 테이블 관계도 요약
- p_user_addresses (배송지 정보): 1:N 관계 (사용자는 여러 개의 배송지를 가질 수 있음)
- p_orders (주문): 1:N 관계 (사용자는 여러 개의 주문을 할 수 있음)
- p_stores (매장): 1:N 관계 (점주는 여러 개의 매장을 소유할 수 있음)
- p_reviews (리뷰): 1:N 관계 (사용자는 여러 개의 리뷰를 작성할 수 있음)
- p_ai_interactions (AI 질의응답 기록): 1:N 관계 (사용자는 여러 개의 AI 상호작용을 할 수 있음)
- p_payments (결제): 1:N 관계 (사용자는 여러 개의 결제를 수행할 수 있음)
2. p_user_addresses 테이블 필드 정의
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 배송지 ID (PK) | |
user_id | INTEGER | ✅ | ❌ | 배송지 소유자 ID (FK) | ||
address_name | VARCHAR(255) | ❌ | 주소명 (예: “집”, “회사”, “친구 집”) | |||
recipient_name | VARCHAR(100) | ❌ | 수령인 이름 | |||
address | VARCHAR(255) | ❌ | 상세 주소 | |||
zip_code | VARCHAR(10) | ❌ | 우편번호 | |||
is_default | BOOLEAN | ✅ (기본값 false) | 기본 배송지 여부 (true이면 기본 설정) | |||
created_at | TIMESTAMP | ❌ | 배송지 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
- p_users (사용자 테이블): 1:N 관계 (각 사용자는 여러 개의 배송지를 가질 수 있음)
- p_orders (주문 테이블): 1:N 관계 (각 주문은 특정 배송지를 참조할 수 있음)
3. p_location_categories (지역 카테고리) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 지역 카테고리 ID (PK) | |
type | VARCHAR(255) | ✅ | ❌ | 지역 타입 (예: 시, 구, 동) | ||
name | VARCHAR(255) | ✅ | ❌ | 지역 이름 (예: 서울, 강남구) | ||
parent_id | UUID | ✅ (자기참조) | ✅ | 부모 지역 ID (최상위 지역은 NULL) | ||
created_at | TIMESTAMP | ❌ | 지역 카테고리 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 지역 카테고리 (지역 계층 구조를 위한 테이블, 예: 서울 > 강남구)
Table p_location_categories {
id UUID [primary key, default: "uuid_generate_v4()"] // PK
type VARCHAR(255) [unique, not null] // 지역 타입 (예: 시,구,동)
name VARCHAR(255) [unique, not null] // 지역 이름 (예: 서울, 강남구)
parent_id UUID [ref: > p_location_categories.id] // 부모 지역 FK (NULL 가능, 최상위 지역)
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_location_categories (지역 카테고리) 테이블 관계도 요약
- p_location_categories (자기참조): 1:N 관계 (각 지역은 하위 지역을 가질 수 있음)
- p_stores (매장): 1:N 관계 (각 매장은 특정 지역에 속함)
4. p_industry_categories (업종 카테고리) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 업종 카테고리 ID (PK) | |
name | VARCHAR(255) | ✅ | ❌ | 업종명 (예: 치킨, 피자, 한식) | ||
created_at | TIMESTAMP | ❌ | 업종 카테고리 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
//p_stores (1) --- (N) p_store_industry_categories (N) --- (1) p_industry_categories
// 업종 카테고리 (매장 업종을 구분, 예: 치킨, 한식, 카페 등)
Table p_industry_categories {
id UUID [primary key, default: "uuid_generate_v4()"]
name VARCHAR(255) [unique, not null] // 업종명 (예: 치킨, 피자, 한식)
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_industry_categories (업종 카테고리) 테이블 관계도 요약
- p_store_industry_categories (매장-업종 관계): N:M 관계 (각 매장은 여러 업종을 가질 수 있음)
- p_stores (매장): N:M 관계 (각 매장은 여러 업종을 가질 수 있으며, 하나의 업종은 여러 매장에 적용될 수 있음)
5. p_stores (매장) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 매장 ID (PK) | |
user_id | INTEGER | ✅ | ❌ | 점주 ID (FK) | ||
location_category_id | UUID | ✅ | ❌ | 지역 카테고리 ID (FK) | ||
name | VARCHAR(255) | ❌ | 매장 이름 | |||
address | VARCHAR(255) | ❌ | 매장 주소 | |||
phone | VARCHAR(20) | ✅ | ❌ | 매장 전화번호 (고유) | ||
image_url | VARCHAR(255) | ❌ | 매장 대표 이미지 URL | |||
status | VARCHAR(50) | ❌ | 매장 상태 (OPEN, CLOSED, SUSPENDED) | |||
created_at | TIMESTAMP | ❌ | 매장 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 매장 테이블 (점주가 운영하는 매장 정보 저장)
Table p_stores {
id UUID [primary key, default: "uuid_generate_v4()"]
user_id INTEGER [not null, ref: > p_users.id] // 점주 FK
location_category_id UUID [not null, ref: > p_location_categories.id] // 지역 FK
name VARCHAR(255) [not null] // 매장 이름
address VARCHAR(255) [not null] // 매장 주소
phone VARCHAR(20) [not null] // 매장 전화번호
image_url VARCHAR(255) [not null] // 이미지 URL
status VARCHAR(50) [not null, note: "OPEN, CLOSED, SUSPENDED"] // 매장 상태 (운영 중, 폐점, 정지)
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_stores (매장) 테이블 관계도 요약
- p_users (사용자): N:1 관계 (점주는 여러 개의 매장을 운영할 수 있음)
- p_location_categories (지역 카테고리): N:1 관계 (각 매장은 특정 지역에 속함)
- p_store_industry_categories (매장-업종 관계): N:M 관계 (각 매장은 여러 업종을 가질 수 있음)
- p_menus (메뉴): 1:N 관계 (하나의 매장은 여러 개의 메뉴를 제공할 수 있음)
- p_orders (주문): 1:N 관계 (각 매장에서는 여러 주문이 발생할 수 있음)
- p_reviews (리뷰): 1:N 관계 (여러 사용자가 매장에 대한 리뷰를 남길 수 있음)
6. p_store_industry_categories (매장 - 업종 관계) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
store_id | UUID | ✅ (복합) | ✅ | ❌ | 매장 ID (FK) | |
industry_category_id | UUID | ✅ (복합) | ✅ | ❌ | 업종 카테고리 ID (FK) |
// 매장 - 업종 다대다 관계 테이블
Table p_store_industry_categories {
store_id UUID [not null, ref: > p_stores.id] // 매장 FK
industry_category_id UUID [not null, ref: > p_industry_categories.id] // 업종 FK
primary key (store_id, industry_category_id)
}
p_store_industry_categories (매장 - 업종 관계) 테이블 관계도 요약
- p_stores (매장): N:M 관계 (하나의 매장은 여러 업종을 가질 수 있음)
- p_industry_categories (업종 카테고리): N:M 관계 (하나의 업종은 여러 매장에 적용될 수 있음)
7. p_menus (메뉴) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 메뉴 ID (PK) | |
store_id | UUID | ✅ | ❌ | 해당 매장 ID (FK) | ||
name | VARCHAR(255) | ❌ | 메뉴 이름 | |||
price | DECIMAL(10,2) | ❌ | 메뉴 가격 | |||
description | TEXT | ✅ | 메뉴 설명 | |||
is_hidden | BOOLEAN | ✅ (기본값 false) | 숨김 여부 (true = 숨김, false = 노출) | |||
created_at | TIMESTAMP | ❌ | 메뉴 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 메뉴 테이블 (매장 메뉴 정보)
Table p_menus {
id UUID [primary key, default: "uuid_generate_v4()"]
store_id UUID [not null, ref: > p_stores.id] // 매장 FK
name VARCHAR(255) [not null] // 메뉴 이름
price DECIMAL(10, 2) [not null] // 가격
description TEXT // 메뉴 설명
is_hidden BOOLEAN [default: false] // 숨김 여부 (true = 숨김, false = 노출)
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_menus (메뉴) 테이블 관계도 요약
- p_stores (매장): N:1 관계 (각 매장은 여러 개의 메뉴를 가질 수 있음)
- p_menu_images (메뉴 이미지): 1:N 관계 (각 메뉴는 여러 개의 이미지를 가질 수 있음)
- p_menu_options (메뉴 옵션): 1:N 관계 (각 메뉴는 여러 개의 옵션을 가질 수 있음)
- p_order_items (주문 상세): 1:N 관계 (각 메뉴는 여러 주문에 포함될 수 있음)
8. p_menu_options (메뉴 옵션) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 메뉴 옵션 ID (PK) | |
menu_id | UUID | ✅ | ❌ | 해당 메뉴 ID (FK) | ||
name | VARCHAR(255) | ❌ | 옵션명 (예: “L 사이즈”, “엑스트라 치즈”) | |||
price | DECIMAL(10,2) | ❌ | 옵션 가격 | |||
created_at | TIMESTAMP | ❌ | 옵션 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 메뉴별 옵션 (예: "L 사이즈", "엑스트라 치즈")
Table p_menu_options {
id UUID [primary key, default: "uuid_generate_v4()"]
menu_id UUID [not null, ref: > p_menus.id] // 메뉴 FK
name VARCHAR(255) [not null] // 옵션명
price DECIMAL(10, 2) [not null] // 옵션 가격
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_menu_options (메뉴 옵션) 테이블 관계도 요약
- p_menus (메뉴): N:1 관계 (각 메뉴는 여러 개의 옵션을 가질 수 있음)
9. p_menu_images (메뉴 이미지) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 메뉴 이미지 ID (PK) | |
menu_id | UUID | ✅ | ❌ | 해당 메뉴 ID (FK) | ||
image_url | VARCHAR(255) | ❌ | 이미지 URL | |||
order_index | INT | ✅ (기본값 0) | 이미지 순서 | |||
created_at | TIMESTAMP | ❌ | 이미지 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 메뉴 이미지 테이블 (각 메뉴의 다중 이미지 저장)
Table p_menu_images {
id UUID [primary key, default: "uuid_generate_v4()"]
menu_id UUID [not null, ref: > p_menus.id] // 메뉴 FK
image_url VARCHAR(255) [not null] // 이미지 URL
order_index INT [default: 0] // 이미지 순서
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_menu_images (메뉴 이미지) 테이블 관계도 요약
- p_menus (메뉴): N:1 관계 (각 메뉴는 여러 개의 이미지를 가질 수 있음)
10. p_orders (주문) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 주문 ID (PK) | |
user_id | INTEGER | ✅ | ❌ | 주문한 사용자 ID (FK) | ||
store_id | UUID | ✅ | ❌ | 주문이 발생한 매장 ID (FK) | ||
address_id | UUID | ✅ | ❌ | 주문 배송지 ID (FK) | ||
total_price | DECIMAL(10,2) | ❌ | 총 주문 금액 | |||
status | VARCHAR(50) | ❌ | 주문 상태 (PENDING, CONFIRMED, CANCELLED, DELIVERING, COMPLETED) | |||
description | TEXT | ✅ | 주문자 요구사항 | |||
ordered_at | TIMESTAMP | ❌ | 주문 접수 일시 | |||
created_at | TIMESTAMP | ❌ | 주문 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 주문 테이블
Table p_orders {
id UUID [primary key, default: "uuid_generate_v4()"]
user_id INTEGER [not null, ref: > p_users.id] // 주문자 FK
store_id UUID [not null, ref: > p_stores.id] // 매장 FK
address_id UUID [not null, ref: > p_stores.id] // 주소 FK
total_price DECIMAL(10, 2) [not null] // 총 주문 금액
status VARCHAR(50) [not null, note: "PENDING, CONFIRMED, CANCELLED, DELIVERING, COMPLETED"] // 주문 상태
description TEXT // 주문자 요구사항
ordered_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_orders (주문) 테이블 관계도 요약
- p_users (사용자): N:1 관계 (사용자는 여러 개의 주문을 할 수 있음)
- p_stores (매장): N:1 관계 (주문은 특정 매장에서 발생)
- p_user_addresses (배송지): N:1 관계 (각 주문은 특정 배송지로 설정됨)
- p_order_items (주문 상세): 1:N 관계 (하나의 주문에는 여러 개의 메뉴 포함 가능)
- p_payments (결제): 1:1 관계 (각 주문은 하나의 결제와 연결됨)
- p_reviews (리뷰): 1:1 관계 (주문 1건당 리뷰 1개 가능)
11. p_order_items (주문 상세) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 주문 상세 ID (PK) | |
order_id | UUID | ✅ | ❌ | 해당 주문 ID (FK) | ||
menu_id | UUID | ✅ | ❌ | 주문한 메뉴 ID (FK) | ||
quantity | INT | ❌ | 주문한 메뉴 수량 (1 이상) | |||
price | DECIMAL(10,2) | ❌ | 개별 메뉴 가격 | |||
created_at | TIMESTAMP | ❌ | 주문 상세 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 주문 상세 테이블 (각 주문 내 개별 메뉴 정보 저장)
Table p_order_items {
id UUID [primary key, default: "uuid_generate_v4()"]
order_id UUID [not null, ref: > p_orders.id] // 주문 FK
menu_id UUID [not null, ref: > p_menus.id] // 메뉴 FK
quantity INT [not null, note: "Must be greater than 0"] // 수량
price DECIMAL(10, 2) [not null] // 개별 가격
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_order_items (주문 상세) 테이블 관계도 요약
- p_orders (주문): N:1 관계 (하나의 주문에는 여러 개의 주문 상세가 포함될 수 있음)
- p_menus (메뉴): N:1 관계 (여러 주문 상세가 동일한 메뉴를 포함할 수 있음)
12. p_payments (결제) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | 결제 ID (PK) | |
order_id | UUID | ✅ | ❌ | 결제가 발생한 주문 ID (FK) | ||
user_id | INTEGER | ✅ | ❌ | 결제한 사용자 ID (FK) | ||
amount | DECIMAL(10,2) | ❌ | 결제 금액 | |||
status | VARCHAR(50) | ❌ | 결제 상태 (PENDING, PAID, FAILED, REFUNDED) | |||
method | VARCHAR(50) | ❌ | 결제 방식 (CREDIT_CARD, KAKAO_PAY, NAVER_PAY, BANK_TRANSFER) | |||
created_at | TIMESTAMP | ❌ | 결제 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 결제 테이블 (주문에 대한 결제 정보 저장)
Table p_payments {
id UUID [primary key, default: "uuid_generate_v4()"]
order_id UUID [not null, ref: > p_orders.id] // 주문 FK
user_id INTEGER [not null, ref: > p_users.id] // 고객 FK
amount DECIMAL(10, 2) [not null] // 결제 금액
status VARCHAR(50) [not null, note: "PENDING, PAID, FAILED, REFUNDED"] // 결제 상태
method VARCHAR(50) [not null, note: "CREDIT_CARD, KAKAO_PAY, NAVER_PAY, BANK_TRANSFER"] // 결제 방식
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_payments (결제) 테이블 관계도 요약
- p_orders (주문 테이블): 1:1 관계 (각 주문은 하나의 결제 정보를 가질 수 있음)
- p_users (사용자 테이블): N:1 관계 (각 사용자는 여러 개의 결제를 수행할 수 있음)
13. p_ai_interactions (AI 질의 응답 기록) 테이블 명세서
필드 이름데이터 타입PRIMARY KEYFOREIGN KEYUNIQUENULL 허용설명
id | UUID | ✅ | ✅ | ❌ | AI 질의 응답 기록 ID (PK) | |
user_id | INTEGER | ✅ | ❌ | AI 질의 응답을 요청한 사용자 ID (FK) | ||
query_text | TEXT | ❌ | 사용자 질문 내용 | |||
response_text | TEXT | ❌ | AI 응답 내용 | |||
created_at | TIMESTAMP | ❌ | 질의 응답 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
//업주가 메뉴 설명시 사용하는 AI 질의 응답 기록
Table p_ai_interactions {
id UUID [primary key, default: "uuid_generate_v4()"]
user_id INTEGER [not null, ref: > p_users.id]
query_text TEXT [not null]
response_text TEXT [not null]
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
deleted_by VARCHAR(100)
}
p_ai_interactions (AI 질의 응답 기록) 테이블 관계도 요약
- p_orders (주문 테이블): 1:1 관계 (각 주문은 하나의 결제 정보를 가질 수 있음)
- p_users (사용자 테이블): N:1 관계 (사용자는 여러 개의 AI 질의 응답을 수행할 수 있음)
14. p_reviews 테이블 필드 정의
컬럼명타입PKFKNULL 허용UNIQUE설명
id | UUID | ✅ | ❌ | 리뷰 ID (Primary Key) | ||
order_id | UUID | ✅ | ❌ | 주문 ID (Foreign Key, p_orders.id) | ||
user_id | INTEGER | ✅ | ❌ | 작성자 ID (Foreign Key, p_users.id) | ||
store_id | UUID | ✅ | ❌ | 매장 ID (Foreign Key, p_stores.id) | ||
rating | INTEGER | ❌ | 별점 (1~5 범위) | |||
comment | TEXT | ✅ | 리뷰 내용 (선택 사항) | |||
created_at | TIMESTAMP | ✅ | 생성 일시 | |||
created_by | VARCHAR(100) | ✅ | 생성자 | |||
updated_at | TIMESTAMP | ✅ | 수정 일시 | |||
updated_by | VARCHAR(100) | ✅ | 수정자 | |||
deleted_at | TIMESTAMP | ✅ | 삭제 일시 | |||
deleted_by | VARCHAR(100) | ✅ | 삭제자 |
// 리뷰 테이블 (고객이 매장에 남기는 리뷰)
Table p_reviews {
id UUID [primary key, default: "uuid_generate_v4()"] // 리뷰 ID (PK)
order_id UUID [not null, ref: > p_orders.id] // 주문 FK (리뷰는 특정 주문을 기반으로 작성됨)
user_id INTEGER [not null, ref: > p_users.id] // 작성자 FK (고객)
store_id UUID [not null, ref: > p_stores.id] // 리뷰 대상 매장 FK
rating INT [not null, note: "1~5 범위의 별점"] // 별점 (CHECK 제약조건은 SQL에서 설정)
comment TEXT // 리뷰 내용 (선택 사항)
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP
deleted_by VARCHAR(100)
}
p_reviews (리뷰) 테이블 관계도 요약
- p_users (사용자 테이블): N:1 관계 (하나의 사용자는 여러 개의 리뷰를 작성할 수 있음)
- p_orders (주문 테이블): 1:1 관계 (하나의 주문에는 하나의 리뷰만 작성 가능)
- p_stores (매장 테이블): N:1 관계 (여러 사용자가 동일한 매장에 대한 리뷰를 남길 수 있음)
// 사용자 배송지 정보 테이블 (유저가 여러 개의 배송지를 저장할 수 있음)
Table p_user_addresses {
id UUID [primary key, default: "uuid_generate_v4()"] // 배송지 ID (PK)
user_id INTEGER [not null, ref: > p_users.id] // 유저 FK (배송지 소유자)
address_name VARCHAR(255) [not null] // 주소명 (예: "집", "회사", "친구 집")
recipient_name VARCHAR(100) [not null] // 수령인 이름
address VARCHAR(255) [not null] // 상세 주소
zip_code VARCHAR(10) [not null] // 우편번호
is_default BOOLEAN [default: false] // 기본 배송지 여부 (true이면 기본 설정)
created_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
created_by VARCHAR(100)
updated_at TIMESTAMP [default: "CURRENT_TIMESTAMP"]
updated_by VARCHAR(100)
deleted_at TIMESTAMP
deleted_by VARCHAR(100)
}
- erd
- 인프라 설계서
'국비지원 (스파르타)' 카테고리의 다른 글
2.18 어드민 API추가 (0) | 2025.02.18 |
---|---|
2.17 싱글톤 공부 (1) | 2025.02.17 |
UUID generate deprecated (0) | 2025.02.14 |
2-13 팀 프로젝트 (0) | 2025.02.13 |
JPA에서 N+1 이슈는 과연 문제일까? (0) | 2025.02.11 |