앞으로 모든 답변을 한국어로 대답합니다.
아래 API문서에 따라, 가짜 응답을 제공하는 Controller를 작성하고, 작성된 내용을 만족하는지 테스트하는 통합 테스트를 구현한다.
-
회원 가입 post
/auth/signRequest Body{ "email": "user@example.com", "password": "Password123!", "name": "김예진", "signupType": "USER" }Response Body
- 201 Created
{ "id": 1, "email": "user@example.com", "name": "김예진", "nickname": "yejin", "createdAt": "2026-01-05T12:30:00" } -
로그인 (session) POST
/auth/login{ "email": "user@example.com", "password": "Password123!" }Success (200 OK)
{ "userId": 1, "userType": "USER", "name": "김예진" } -
주문 생성 API
[USER] 주문 생성 할인 미리보기 결제 완료 ↓ [OWNER] 라이더 매칭 요청 ↓ [System] Route 생성 라이더 매칭
POST
/ordersRequest Body{ "storeId": 101, "orderItems": [ { "menuId": 1, "quantity": 2 }, { "menuId": 3, "quantity": 1 } ], "deliveryAddress": "서울시 강남구 테헤란로 123" }Response Body (201 Created)
{ "orderId": 5001, "orderStatus": "CREATED", "totalPrice": 18000 } -
할인 적용 결과 반환 API POST
/api/order/{orderId}/discounts/preview
- 배민 클럽 할인
- 쿠폰은 최소 금액 15,000원 이상일 때만 사용 가능.
- 최대 할인 금액은 5,000원이다.
- 어떤 쿠폰은 배달료를 포함한 전체 금액에 적용, 어떤 쿠폰은 음식 가격에만 적용
- 특정 가게에서만 사용할 수 있는 쿠폰
- 쿠폰 우선순위 결정 알고리즘. 어떤 쿠폰을 선택했을 떄 최종 금액이 최소인가? (쿠폰은 1개만 적용 가능하다.)
Request Body
{
"couponId": 10,
"useBaeminClub": true
} ResponseBody
{
"orderId": 5001,
"originalPrice": 18000,
"discountDetails": {
"couponDiscount": 3000,
"baeminClubDiscount": 1500
},
"totalDiscountAmount": 4500,
"finalPrice": 13500
} -
주문 결제 POST ```/payment/{orderId}/ Request Body
{ "paymentMethod": "CARD", "couponId": 10, "useBaeminClub": true }Response Body
{ "orderId": 5001, "orderStatus": "PAID", "paymentStatus": "SUCCESS", "originalPrice": 18000, "discountAmount": 4500, "paidAmount": 13500, "paymentMethod": "CARD", "paidAt": "2026-01-05T15:10:00" } -
Owner - 라이더 매칭 요청 (O) post
/deliveries/{orderId}/dispatch한집 배달 / 알뜰 배달 선택 가능Request Body
{ "deliveryType": "BUNDLE" }Response Body
{ "orderId": 5001, "dispatchStatus": "REQUESTED", "deliveryType": "BUNDLE" } -
라이더의 배달 상태 변경 POST
/deliveries/{deliveryId}/statusRequest Body
{
"status": "PICKED_UP"
}Status : 200 OK Response Body
{
"deliveryId" : 1,
"deliveryStatus" : "PICKED_UP"
}- 라이더의 현재 배달 Route 조회 API
GET
/routes/me/current-route
Status : 200 ok Response Body
{
"stops": [
{
"sequence": 1,
"type": "PICKUP",
"orderId": 5001,
"address": "가게 A"
},
{
"sequence": 2,
"type": "PICKUP",
"orderId": 5002,
"address": "가게 B"
},
{
"sequence": 3,
"type": "DELIVERY",
"orderId": 5001,
"address": "고객 A"
},
{
"sequence": 4,
"type": "DELIVERY",
"orderId": 5002,
"address": "고객 B"
}
]
}
- 라이더/주문자/owner 의 주문 단위 상세 조회 API
Role-based View Model
GET
/orders/{orderId}
{
"orderId": 5001,
"store": {
"name": "김밥천국",
"address": "서울시 강남구 ..."
},
"deliveryAddress": "서울시 강남구 테헤란로 123",
"orderStatus": "PICKED_UP",
"items": [
{ "name": "김밥", "quantity": 2 },
{ "name": "라면", "quantity": 1 }
],
"customerNote": "문 앞에 놔주세요"
}
- 알림 이벤트 - websocket?
- ORDER_PICKED_UP
- ORDER_NEARBY
- ORDER_DELIVERED
- 라이더의 위치 전송 API
[RIDER]
GPS 위치 획득
↓
POST /routes/{routeId}/location
↓
[SERVER]
↓
GET /orders/{orderId}/rider-location
↓
[USER]
지도에 표시 (클라이언트)
POST /riders/{routeId}/location
Request Body
{
"latitude": 37.498095,
"longitude": 127.027610
}- 사용자의 라이더 위치 조회 API
GET
/riders/{riderId}/locationResponse Body
{
"riderId": 5001,
"latitude": 37.498095,
"longitude": 127.027610,
"lastUpdatedAt": "2026-01-05T16:15:00"
}- 라이더 위치 업데이트 API
POST
/riders/{riderId}/locationRequestBody
{
"latitude": 37.498095,
"longitude": 127.027610
}
Response 201 created
{
"riderId": 5001,
"latitude": 37.498095,
"longitude": 127.027610,
"lastUpdatedAt": "2026-01-05T16:15:00"
}