언택트 시대에 급증하고 있는 온라인 주문 시스템은 이미 생활전반에 그 영향을 끼치고 있는 상황에, 가깝게는 배달어플, 매장에는 키오스크,
식당에는 패드를 이용한 메뉴 주문까지 그 사용범위가 점점 확대되어 가고 있습니다.
이런 시대에 해당 시스템을 이해, 경험하고 각 단계별 프로세스를 이해하여 구현함으로써 서비스 구축에 경험을 쌓고, golang의 이해를 돕습니다.
- 주문자/피주문자의 역할에서 필수적인 기능을 도출, 구현합니다.
- 해당 시스템에 대해 요구사항을 접수하고 주문자와 피주문자 입장에서 필요한 기능을 도출하여, 기능을 확장하고 주문 서비스를 원할하게 지원할수 있는 기능을 구현합니다.
- 주문자는 신뢰있는 주문과 배달까지를 원합니다. 또, 피주문자는 주문내역을 관리하고 원할한 서비스가 제공되어야 합니다.
$ docker start mongodb
$ git clone https://github.com/codestates/WBABEProject-14.git
$ cd go-mvc-project/
$ go mod tidy
> go run main.go- Mac OS M1
- vscode
- MongoDB Compass
- Docker
- PostMan
- Talen API Tester
- Go(go1.19.4 darwin/arm64)
- Gin Gonic
- MongoDB
- Swagger
├── config
│ ├── config.go
│ └── config.toml
├── controller
│ ├── controller.go
│ ├── orderer.controller.go /* 주문자 컨트롤러 */
│ └── taker.controller.go /* 피주문자 컨트롤러 */
├── docs
│ ├── docs.go
│ ├── swagger.json
│ └── swagger.yaml
├── go.mod
├── go.sum
├── logger
│ └── logger.go
├── logs
│ └── go-loger_2022-12-20.log
├── main.go
├── model
│ ├── menu.go /* 메뉴 모델 */
│ ├── model.go /* 모델 정의 */
│ ├── order.go /* 주문 모델 */
│ ├── response.go /* 응답 메세지 모델 */
│ ├── review.go /* 리뷰 모델 */
│ └── swaggerModel.go /* 스웨거 작성시 요청과 응답에 대한 모델 */
├── route
│ └── route.go
└── services
├── orderer.service.go /* 주문자 서비스 인터페이스 */
├── orderer.service.impl.go /* 주문자 서비스 구현체 */
├── taker.service.go /* 피주문자 서비스 인터페이스 */
└── taker.service.impl.go /* 피주문자 서비스 구현체 */
프로젝트 실행후 아래 도메인 으로 접속
http://localhost:8080/swagger/index.html#/
- created_at, updated_at 한 세트로 구성하기
- 주문 상태를 Enum, Const 활용하기
- 사용하지 않는 주석 코드 제거
- rest Api 에 맞게 리팩토링 URI 에 자원만 명시 ( detail 삭제 )
- 메뉴 추가, 변경과 같은 것을 구분하기 위해선 일반적으로 쿼리스트링으로 사용
- 직관적이지 못한 네이밍 수정
- 함수의 코드가 길어지는 경우 하나의 책임을 가질수 있도록 분리 필요
- 메뉴 추가시 메뉴 이름만으로 중복검사 처리는 용이하지 못함
- CORS 허용은 특정 도메인만 적용하기
POST /api/v01/taker/menu
{
"storenumber":100,
"limitorder": 300,
"menuname": "우동",
"orderstatus": false,
"origin": "국내산",
"price": 15000,
"spice": 0
}{
"message": "success"
}PUT /api/v01/taker/menu/우동
{
"limitorder": 300,
"orderstatus": false,
"origin": "국내산",
"price": 5500,
"spice": 0
}{
"message": "success"
}DELETE /api/v01/taker/menu
{
"menuname": "우동"
}{
"message": "success"
}PATCH /api/v01/taker/menu{
"menuname": "우동"
}{
"menuList": [
{
"_id": "63a73a1c8d989838729bc114",
"createdat": "2022-12-24T13:17:12.793+00:00",
"grade": 3.5,
"isdelete": false,
"limitorder": 100,
"menuname": "떡볶이",
"orderstatus": true,
"origin": "국내산",
"price": 10000,
"recommend": true,
"reorder": 30,
"spice": 3
},
{
"_id": "63a79abf892e3345fd2f2150",
"createdat": "2022-12-24T16:22:41.551+00:00",
"grade": 2.5,
"isdelete": false,
"limitorder": 200,
"menuname": "김밥",
"orderstatus": true,
"origin": "국내산",
"price": 5000,
"recommend": true,
"reorder": 50,
"spice": 0
}
...
]
}GET /api/v01/taker/orders
{
"orders": [
{
"_id": "63a73a1c8d989838729bc114",
"address": "서울시 강남구 강남동 1212-202 101호",
"createdat": "2022-12-24T16:17:12.793+00:00",
"isdelete": false,
"isexistreview": false,
"menuname": "떡볶이",
"ordernumber": 11,
"phone": "010xxxxxxxx",
"status": 0
},
{
"_id": "63a79abf892e3345fd2f2150",
"address": "서울시 용산구 용산동 2525-111 303호",
"createdat": "2022-12-24T18:11:22.440+00:00",
"isdelete": false,
"isexistreview": false,
"menuname": "우동",
"ordernumber": 12,
"phone": "010xxxxxxxx",
"status": 0
}
...
]
}PATCH /api/v01/taker/orders/{menuname}
{
"status": 0
}{
"message": "success"
}GET /api/v01/orderer/menu/{sort}
sort : [recommend, grade, reorder, createdat] 중 하나 택하여 요청
{
"menuList": [
{
"_id": "63a73a1c8d989838729bc114",
"createdat": "2022-12-24T16:17:12.793+00:00",
"grade": 3.5,
"isdelete": false,
"limitorder": 100,
"menuname": "떡볶이",
"orderstatus": true,
"origin": "국내산",
"price": 150000,
"recommend": true,
"reorder": 30,
"spice": 3
},
{
"_id": "63a79abf892e3345fd2f2150",
"createdat": "2022-12-24T18:42:20.191+00:00",
"grade": 4,
"isdelete": false,
"limitorder": 50,
"menuname": "우동",
"orderstatus": true,
"origin": "국내산",
"price": 5000,
"recommend": true,
"reorder": 50,
"spice": 0
},
...
]
}POST /api/v01/orderer/order
{
"address": "서울시 강남구 강남동 1212-202 101호",
"menuname": "떡볶이",
"phone": "01020221225"
}{
"주문번호": 15
}PATCH /api/v01/orderer/order/{orderId}?flag={0,1}
{
"menuname": "우동"
}{
"message": "success"
}{
"message": "해당 주문은 배달중입니다. 신규주문으로 처리되었습니다.",
"ordernumber": 17
}POST /api/v01/orderer/review/{orderID}
{
"comment": "맛있어요",
"grade": 3.5
}{
"message": "success"
}GET /api/v01/orderer/detailMenu/{menuname}
{
"avgGrade": 3.5,
"reviewList": [
{
"_id": "63a73a1c8d989838729bc114",
"comment": "맛있었습니다.",
"createdat": "2022-12-24T17:42:53.949+00:00",
"grade": 3,
"isdelete": false,
"menuname": "떡볶이"
},
{
"_id": "63a79abf892e3345fd2f2150')",
"comment": "맛없어요.",
"createdat": "2022-12-24T17:44:19.147+00:00",
"grade": 4,
"isdelete": false,
"menuname": "떡볶이"
},
...
]
}GET /api/v01/orderer/orders
{
"currentOrders": [
{
"_id": "63a79abf892e3345fd2f2150",
"address": "서울시 강남구 강남동 1212-202 101호",
"createdat": "2022-12-24T16:17:12.793+00:00",
"isdelete": false,
"isexistreview": false,
"menuname": "떡볶이",
"ordernumber": 1,
"phone": "010xxxxxxxx",
"status": 0
},
...
],
"pastOrders": [
{
"_id": "63a73a1c8d989838729bc114",
"address": "서울시 용산구 용산동 1212-202 303호",
"createdat": "2022-12-24T16:15:44.327+00:00",
"isdelete": false,
"isexistreview": false,
"menuname": "우동",
"ordernumber": 0,
"phone": "010xxxxxxxx",
"status": 5
},
...
]
}

