https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa700001

@startuml
actor User
actor StoreOwner
participant API_Server
database DB
== 회원가입 ==
User -> API_Server : POST /auth/signup
note right
name, email, password, role 전달
role: customer | owner | admin
end note
API_Server -> API_Server : name/email/password/role 유효성 검사
alt 필수 항목 누락 또는 형식 오류
API_Server --> User : 400 Bad Request ("유효하지 않은 입력")
else 유효
API_Server -> DB : email 중복 확인
alt 중복됨
API_Server --> User : 409 Conflict ("이미 가입된 이메일")
else 중복 아님
API_Server -> API_Server : 비밀번호 해시
API_Server -> DB : p_users insert (role 포함)
API_Server -> API_Server : JWT 발급
API_Server --> User : 201 Created (userId, name, role, accessToken)
end
end
== 로그인 ==
User -> API_Server : POST /auth/login
StoreOwner -> API_Server : POST /auth/login
note right
email, password 전달
end note
API_Server -> API_Server : email/password 유효성 검사
alt 누락 또는 형식 오류
API_Server --> User : 400 Bad Request
API_Server --> StoreOwner : 400 Bad Request
else 유효
API_Server -> DB : 사용자 조회
alt 존재하지 않거나 비밀번호 불일치
API_Server --> User : 401 Unauthorized
API_Server --> StoreOwner : 401 Unauthorized
else 일치
API_Server -> API_Server : JWT 발급
API_Server --> User : 200 OK (userId, name, role, accessToken)
API_Server --> StoreOwner : 200 OK (userId, name, role, accessToken)
end
end
== 회원 탈퇴 ==
User -> API_Server : PATCH /api/users/delete (JWT)
StoreOwner -> API_Server : PATCH /api/users/delete (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> DB : 토큰 사용자 ID 기준 soft delete 처리
API_Server --> User : 200 OK (userId, message)
API_Server --> StoreOwner : 200 OK (userId, message)
end
== 검색 ==
User -> API_Server : GET /api/search?keyword=김치&category=한식&sortBy=인기순 (JWT)
StoreOwner -> API_Server : GET /api/search?keyword=김치&category=한식&sortBy=인기순 (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : Query Parameter 유효성 검사 (keyword 등)
alt keyword 누락
API_Server --> User : 400 Bad Request ("검색어는 필수입니다")
API_Server --> StoreOwner : 400 Bad Request ("검색어는 필수입니다")
else 유효
API_Server -> DB : 메뉴 + 가게 검색 (필터 및 정렬 포함)
API_Server --> User : 200 OK (검색결과 반환)
API_Server --> StoreOwner : 200 OK (검색결과 반환)
end
end
== 가게 상세 조회 ==
User -> API_Server : GET /api/stores/{store_id}
StoreOwner -> API_Server : GET /api/stores/{store_id}
API_Server -> API_Server : store_id 유효성 검사
alt 유효하지 않음
API_Server --> User : 400 Bad Request ("store_id 오류")
API_Server --> StoreOwner : 400 Bad Request ("store_id 오류")
else 유효
API_Server -> DB : p_stores + p_menus 조회
API_Server --> User : 200 OK (가게 상세 정보 반환)
API_Server --> StoreOwner : 200 OK (가게 상세 정보 반환)
end
@enduml

@startuml
actor User
participant API_Server
database DB
== 장바구니 담기 ==
User -> API_Server : POST /api/cart/items (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> API_Server : store_id, menu_id, quantity 유효성 검사
alt 유효성 실패
API_Server --> User : 400 Bad Request ("입력값 오류")
else 유효
API_Server -> DB : 장바구니 존재 여부 확인
alt 없음
API_Server -> DB : p_cart insert
end
API_Server -> DB : p_cart_items insert
API_Server --> User : 200 OK ("장바구니 추가 완료")
end
end
== 장바구니 조회 ==
User -> API_Server : GET /api/cart (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> DB : p_cart + p_cart_items join
API_Server --> User : 장바구니 데이터 반환
end
== 장바구니 수정 ==
User -> API_Server : PUT /api/cart/items/{id} (JWT)
API_Server -> API_Server : JWT 유효성 검사
API_Server -> API_Server : quantity 정수형 + 1 이상인지 확인
alt 유효성 실패
API_Server --> User : 400 Bad Request ("수량 오류")
else 유효
API_Server -> DB : 수량 update
API_Server --> User : 200 OK (수정 완료)
end
== 장바구니 삭제 ==
User -> API_Server : DELETE /api/cart/items/{id} (JWT)
API_Server -> API_Server : JWT 유효성 검사
API_Server -> DB : 항목 존재 여부 확인 후 삭제
API_Server --> User : 200 OK (삭제 완료)
== 주문 생성 ==
User -> API_Server : POST /api/orders (JWT)
API_Server -> API_Server : JWT 유효성 검사
API_Server -> API_Server : 장바구니 비어있는지 검사
alt 비어있음
API_Server --> User : 400 Bad Request ("주문할 항목이 없습니다")
else 유효
API_Server -> DB : p_orders insert
API_Server -> DB : p_order_items insert
API_Server --> User : 201 Created (주문 완료)
end
== 주소 등록 (카카오 주소 api) ==
User -> API_Server : POST /api/users/address (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt JWT 실패
API_Server --> User : 401 Unauthorized
else JWT 통과
API_Server -> API_Server : address, detail, is_primary 유효성 검사
alt 주소 형식 불완전
API_Server -> KakaoAPI : 주소 자동완성/검증 요청
KakaoAPI --> API_Server : 정제된 주소 응답
API_Server -> API_Server : 응답 주소로 정규화
end
alt 유효성 실패
API_Server --> User : 400 Bad Request ("주소 입력값 오류")
else 유효성 통과
API_Server -> DB : p_user_address insert
API_Server --> User : 201 Created (주소 등록 완료)
end
end
== 주소 수정 (카카오 주소 api) ==
User -> API_Server : PATCH /api/users/{user_id}/address/{address_id} (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> API_Server : address 형식 검사
alt 주소 불완전
API_Server -> KakaoAPI : 주소 정제 요청
KakaoAPI --> API_Server : 정제된 주소 반환
API_Server -> API_Server : address 재구성
end
API_Server -> API_Server : 나머지 필드 유효성 검사
alt 유효성 실패
API_Server --> User : 400 Bad Request
else 통과
API_Server -> DB : 주소 update
API_Server --> User : 200 OK (수정 완료)
end
end
== 주소 삭제 ==
User -> API_Server : PATCH /api/users/{user_id}/address/{address_id} (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> DB : 주소 존재 여부 확인 후 soft delete
API_Server --> User : 200 OK (삭제 완료)
end
@enduml

@startuml
actor User
participant API_Server
database DB
== 토스페이먼츠 결제 요청 ==
User -> API_Server : POST /api/payments/toss (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> API_Server : 필수 필드 유효성 검사 (amount 등)
alt 실패
API_Server --> User : 400 Bad Request ("입력값 오류")
else 통과
API_Server -> TossPayments : 결제 요청
TossPayments --> API_Server : 결제 응답
API_Server -> DB : p_payments insert
API_Server --> User : 결제 URL 응답
end
end
== 가게 찜하기 ==
User -> API_Server : POST /favorites (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> API_Server : store_id 존재 여부 및 형식 확인
alt 실패
API_Server --> User : 400 Bad Request ("store_id 누락")
else 통과
API_Server -> DB : p_favorites insert
API_Server --> User : 201 Created (찜 완료)
end
end
== 가게 찜 취소 ==
User -> API_Server : DELETE /favorites/{store_id} (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> DB : p_favorites soft delete
API_Server --> User : 200 OK (찜 취소 완료)
end
== 찜 목록 조회 ==
User -> API_Server : GET /favorites?keyword=..&category=..&sortBy=.. (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> DB : p_favorites filter 조회
API_Server --> User : 찜 목록 반환
end
== 주문 내역 조회 ==
User -> API_Server : GET /api/orders (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> DB : p_orders + p_order_items 조회
API_Server --> User : 주문 내역 반환
end
== 주문 취소 ==
User -> API_Server : POST /api/orders/{order_id}/cancel (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> DB : 주문 상태 확인
alt 이미 취소됨 or 결제 완료 상태 불가
API_Server --> User : 400 Bad Request ("취소 불가 상태")
else 취소 가능
API_Server -> DB : p_orders 상태 update
API_Server --> User : 200 OK ("주문 취소 완료")
end
end
== 회원 정보 조회 ==
User -> API_Server : GET /users/me (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> DB : 사용자 정보 조회
API_Server --> User : 회원 정보 반환
end
== 회원 정보 수정 ==
User -> API_Server : PUT /users/me (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> API_Server : name, phone 유효성 검사
alt 실패
API_Server --> User : 400 Bad Request ("입력값 오류")
else 통과
API_Server -> DB : 사용자 정보 update
API_Server --> User : 200 OK (수정 완료)
end
end
== 내 리뷰 목록 조회 ==
User -> API_Server : GET /users/me/reviews?page=..&limit=.. (JWT)
API_Server -> API_Server : JWT 유효성 검사
alt 실패
API_Server --> User : 401 Unauthorized
else 성공
API_Server -> DB : 본인 리뷰 목록 조회 (페이징)
API_Server --> User : 리뷰 목록 반환
end
@enduml

@startuml
actor StoreOwner
participant API_Server
database DB
== 가게 등록 ==
StoreOwner -> API_Server : POST /api/stores (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 가게명, 주소 등 유효성 검사
alt 유효성 실패
API_Server --> StoreOwner : 400 Bad Request ("입력값 오류")
else 통과
API_Server -> DB : 동일한 가게명/주소 존재 여부 확인
alt 중복 존재
API_Server --> StoreOwner : 409 Conflict ("이미 존재하는 가게")
else 신규 등록
API_Server -> DB : p_stores insert
API_Server --> StoreOwner : 201 Created (storeId 반환)
end
end
end
== 가게 수정 ==
StoreOwner -> API_Server : PATCH /api/stores/{storeId} (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 수정 필드 유효성 검사
alt 실패
API_Server --> StoreOwner : 400 Bad Request
else 통과
API_Server -> DB : p_stores update
API_Server --> StoreOwner : 200 OK (수정됨)
end
end
== 가게 삭제 ==
StoreOwner -> API_Server : PATCH /api/stores/{storeId} (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> DB : p_stores soft delete 처리
API_Server --> StoreOwner : 200 OK (삭제됨)
end
== 메뉴 등록 ==
StoreOwner -> API_Server : POST /api/stores/menus (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 메뉴명, 가격 등 유효성 검사
alt 실패
API_Server --> StoreOwner : 400 Bad Request
else 통과
API_Server -> DB : p_menus insert
API_Server --> StoreOwner : 201 Created (id 반환)
end
end
== 메뉴 수정 ==
StoreOwner -> API_Server : PATCH /api/stores/menus/{menuId} (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 수정 필드 유효성 검사
alt 실패
API_Server --> StoreOwner : 400 Bad Request
else 통과
API_Server -> DB : p_menus update
API_Server --> StoreOwner : 200 OK (수정 완료)
end
end
== 메뉴 삭제 ==
StoreOwner -> API_Server : PATCH /api/stores/menus/{menuId} (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> DB : p_menus soft delete 처리
API_Server --> StoreOwner : 200 OK (삭제 완료)
end
== 주문 상태 변경 ==
StoreOwner -> API_Server : PATCH /api/stores/orders/{orderId}/status (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 상태값 유효성 검사
alt 실패
API_Server --> StoreOwner : 400 Bad Request
else 통과
API_Server -> DB : p_orders status update
API_Server --> StoreOwner : 200 OK (변경 완료)
end
end
@enduml

@startuml
actor StoreOwner
participant API_Server
database DB
== AI 가게 설명 ==
StoreOwner -> API_Server : POST /api/ai/stores/store-ai (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 가게명/키워드 유효성 검사
alt 실패
API_Server --> StoreOwner : 400 Bad Request
else 통과
API_Server -> AI_Model : 키워드 전송
AI_Model --> API_Server : 설명 결과
API_Server --> StoreOwner : 설명 반환
end
end
== AI 메뉴 설명 ==
StoreOwner -> API_Server : POST /api/ai/stores/menu (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 메뉴명/재료 유효성 검사
alt 실패
API_Server --> StoreOwner : 400 Bad Request
else 통과
API_Server -> AI_Model : 키워드 전송
AI_Model --> API_Server : 설명 결과
API_Server --> StoreOwner : 설명 반환
end
end
== 본인 가게 찜 수 조회 ==
StoreOwner -> API_Server : GET /stores/favorites/count (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> DB : 본인 가게 찜 수 조회
API_Server --> StoreOwner : 200 OK (찜 수 반환)
end
== 리뷰 답글 등록 ==
StoreOwner -> API_Server : POST /api/stores/reviews/{reviewId}/reply (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 내용 유효성 검사
alt 실패
API_Server --> StoreOwner : 400 Bad Request ("내용 누락")
else 통과
API_Server -> DB : p_review_replies insert
API_Server --> StoreOwner : 201 Created (답글 등록 완료)
end
end
== 리뷰 답글 수정 ==
StoreOwner -> API_Server : PATCH /api/stores/reviews/{reviewId}/reply (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> API_Server : 내용 유효성 검사
alt 실패
API_Server --> StoreOwner : 400 Bad Request ("내용 누락")
else 통과
API_Server -> DB : p_review_replies update
API_Server --> StoreOwner : 200 OK (수정 완료)
end
end
== 리뷰 답글 삭제 ==
StoreOwner -> API_Server : DELETE /api/stores/reviews/{reviewId}/reply (JWT)
API_Server -> API_Server : JWT 검증
alt 실패
API_Server --> StoreOwner : 401 Unauthorized
else 성공
API_Server -> DB : p_review_replies soft delete
API_Server --> StoreOwner : 200 OK (삭제 완료)
end
@enduml