The Frontend of Tsuber Eats
๐ The Backend of Tsuber Eats
Cloning User Eats by Using React, TypeScript and GraphQL Apollo
+ Testing with React Testing Library(Unit Test) and Cypress(E2E Test)
Frontend | Technology | Description |
---|---|---|
01 | React | CRA |
02 | TypeScript | Add Type |
02 | TailwindCSS | Styling Method |
03 | GraphQL Apollo | Pull Data |
04 | React Testing Library | Unit Test |
05 | Cypress | E2E Test |
Backend | Technology | Description |
---|---|---|
01 | NestJS | Node Framework |
02 | GraphQL | Resolver |
03 | TypeScript | Add Type |
04 | TypeORM | Database |
05 | JsonWebToken | Authentication |
06 | Mailgun | Mail Service |
07 | Jest | Unit / E2E TEST |
coverage
cypress
node_modules
public
src
|-- __generated__
|-- components
|-- hooks
|-- images
|-- pages
| |-- client
| |-- driver
| |-- owner
| |-- user
|-- routers
|-- styles
...
- User
- Home
- ๋ก๊ทธ์ธ | ๋ก๊ทธ์์ ๋ผ์ฐํฐ ๋ถ๋ฆฌ
- Show
- User ์ ๋ณดํ์ธ
- Edit
- User ์ ๋ณด์์
- Navigation Geolocation์ ์ฌ์ฉํด ์ ์ ์์น ์ ๋ฐ์ดํธ
- Home
- Client
- Home
- Restaurants ๋ฆฌ์คํธ ๋ณด๊ธฐ
- Restaurant
- Menu ๋ฆฌ์คํธ ๋ณด๊ธฐ
- Order ์์ฑํ๊ธฐ
- Order
- ์ค์๊ฐ Order Status ํ์ธํ๊ธฐ
- Home
- Owner
- Home
- Owner Restaurants ๋ฆฌ์คํธ ๋ณด๊ธฐ
- Restaurant
- Menu ๋ฆฌ์คํธ ๋ณด๊ธฐ
- Victory ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋งค์ถํ ๋ณด๊ธฐ
- Menu
- Menu ์์ฑ | ์์ | ์ญ์ ํ๊ธฐ
- Order
- ์ค์๊ฐ Order Status ํ์ธํ๊ธฐ
- Client ์ธก์์ Order ์์ฑ ์, Order ํ์ด์ง๋ก ๋ฆฌ๋ค์ด๋ ํธ
- Home
- Driver
- Home
- Order Dashboard ๋ณด๊ธฐ
- Owner ์ธก์์ Menu ์ค๋น ์๋ฃ ์, Google Map API๋ฅผ ํ์ฉํ ๋ผ์ฐํ ๋ณด์ฌ์ง๊ธฐ
- Order
- ์ค์๊ฐ Order Status ํ์ธํ๊ธฐ
- Order ํํธ ๋ง๋ฌด๋ฆฌํ๊ธฐ
- Home
๋ณธ ํ๋ก์ ํธ๋ ์๋์ ๋ช๊ฐ์ง ์ด์ ๋ฅผ ์ถฉ์กฑ์ํค๊ธฐ ์ํด ํด๋ก ์ฝ๋ฉํ ๊ฒ ์
๋๋ค.
- TypeScript๋ฅผ ์ ๋ ๋ฐฉ์์ ์ต์ํด์ง๊ณ JavaScript์ Type์ ๊ณ๋ค์ด๋ฉด ์ ์ข์์ง ๋๊ปด๋ณด๊ธฐ
- GraphQL์ ์์ ํ ์ฌ์ฉํด๋ณด๊ณ REST API์ ์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง ์๊ฐํด๋ณด๊ธฐ
- ๋ฐฑ์๋ ์คํ์ผ๋ก NodeJS์ NestJS ์ค ๋ฌด์์ด ๋์๊ฒ ์๋ง์์ง ๊ฒฝํํ๊ธฐ
- ํ ์คํธ ์ฝ๋ ์์ฑ์ ํด๋ด์ผ๋ก์จ ์์ ๋ ํ๋ก์ ํธ ๋น๋
-
JavaScript vs TypeScript
์ด๋ฒ ํ๋ก์ ํธ์์ ์ฒ์์ผ๋ก ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๋ถ ์ ์ฉํด๋ดค๋๋ฐ ๊ฐ์ธ์ ์ธ ์๊ฐ์ผ๋ก๋ ํ์ ์คํฌ๋ฆฝํธ ๋น๋ ๊ฒฝํ์ด ๋งค์ฐ ์ข์๋ค๊ณ ๋๊ปด์ง๋๋ค.
ํ์ ์ ์ถ๋ก ํ๊ฑฐ๋ ํ์ ์ ์ง์ ์์ฑํ๋ ์ผ์ ๋๋๋ก ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ๋ ์์์ผ๋ ํ์ ์ ์ ๊ณ ๋ ํ, VSC์์ ์ง์ํ๋ auto complete๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด์ ํ์ ์ด ์กด์ฌํ๋ค๋ ๊ฒ์ ๋ฐ๋ก๋ฐ๋ก ํ์ธํ ์ ์์๊ณ ๊ทธ ๋๋ถ์ ์ค์ํ ์์ ๋ค์ด ์๋ฌ๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ฐ๋ก๋ฐ๋ก ์คํ๋๋ ๊ฒฝํ์ ํ ์๊ฐ ์์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ ๋๋ ์ ๋ ๋ถ๊ฐ๋ฅํ ์ผ์ด์๋ค. ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ถ๋ช ํ ์ด๋๊ฐ์ ์ค์๋ฅผ ์ ๋ฐํด ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ๊ฐ๋์ ์ด๋์ ๋ฐ์ํ ์๋ฌ์ธ์ง ์๊ธฐ ์ด๋ ค์ธ ๋๋ ์กด์ฌํ ์ ๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฌํ ์๋ฌ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ์๊ฐ์ ๋นํด ํ์ ์ ์ ๋ ์ผ์ ์ ๋ฐ๋ ์ฑ ๋์ง ์๊ธฐ ๋๋ฌธ์ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์ ์๊ฐ์ ๋ญ๋นํ๋ ์ผ๋ง์ ์๋ ๊ฒ ๊ฐ๋ค.
์์ผ๋ก ์ ์์ ํ์ ์ค ๋ฌด์์ ์ ํํ ๊ฒ์ธ์ง ๋ฐ์ ธ๋ณธ๋ค๋ฉด ํน๋ณํ ์ด์ ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋ ํ์๋ฅผ ํํ ๊ฒ ๊ฐ์ต๋๋ค.
-
GraphQL vs REST API
GraphQL์ ์ฌ์ฉํด๋ณด๋ฉด์ ์๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ง ์๊ณ ์์ ์ ์ํฉ์ ๋ง์ถฐ ์ํ๋ ํ๋๋ค๋ง ์์ฒญํ ์ ์๋ค๋ ๊ฒ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ ์ข๊ฒ ๋ง๋ค์ด ์ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ๋ ์ข์๋ ๋ถ๋ถ์ Apollo Client Cache๋ฅผ ์ ๊ทน ํ์ฉํ์ ๋ ์ ๋๋ค.
Apollo๋ ๋ฐฑ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ธฐ ์ ์ Cache์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ๋จผ์ ํ์ธํ๊ฒ ๋๋๋ฐ ์ด ์ ์ ์ด์ฉํด API ์์ฒญ ํ์๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ต๋๋ค.
Mutation์ด ๋ฐ์ํ ํ refetchQueries ๋ฉ์๋๋ฅผ ์ฌ์ฉํด query ์์ฒญ์ ๋ค์ ํ ๋ฒ ํ์ง์๊ณ cache data๋ฅผ ์ง์ ์์ ํ์ฌ data๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ์๋๋ฅผ ํ๋๋ฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋งค์ฐ ๋น ๋ฅธ ์ํธ์์ฉ์ ๋ณด์ฌ์คฌ์ต๋๋ค.
์ด๋ GraphQL์์ ๋ฐ๊ฒฌํ ๊ฐ์ฅ ๋ฉ์ง ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
-
NodeJS vs NestJS
NestJS๋ NodeJS์ ๋ค๋ฅด๊ฒ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
NodeJS์์๋ ์ด๋์ ์ด๋ค ํ์ผ์ ์์นํ์ฌ๋ ์๊ด์ด ์์ง๋ง NestJS์์๋ ๋ชจ๋ ๊ฒ์ด Moudle๋ก ์ด๋ฃจ์ด์ง๋ฉฐ ์ด๋ ์บก์ํ๋ฅผ ํตํด ์ฒ ์ ํ ๋ถ๋ฆฌํ๋ ์์ ์ ํฉ๋๋ค.
๊ทธ๋ ๋ค๊ณ ์๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์๋๊ณ ์์กด์ฑ์ ์ฃผ์ ํจ์ผ๋ก์จ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉฐ ์ด๋ก ์ธํด ๋ถ๋ฆฌํ๊ฐ ์ด๋ฃจ์ด์ ธ๋ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ๋๋์ ๋ฐ์ต๋๋ค.
์ด๊ฒ์ ๊ต์ฅํ ํผํผํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ํ๋ฉฐ NodeJS์์๋ ์ฐพ์๋ณผ ์ ์๋ ๋ฉ์ง ์ฅ์ ์ค ํ๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ TypeScript ๊ธฐ๋ฐ์ผ๋ก ๋ NestJS๋ฅผ ์ฌ์ฉํ๋ฉด์ ์์ ๋ ์ฝ๋ ์์ฑ์ ํ ์ ์๋ ์ ๋ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ ์ธ์ DTO -> Resolver -> Service ํจํด์ผ๋ก ๋ฐ๋ณต์ ์ธ ์์ ์ ํ๋ฉด์ ๊ต์ฅํ ๋น ๋ฅด๊ฒ ๋ฐฑ์๋๋ฅผ ๊ตฌ์ถํ ์ ์๋ ๊ฒ๊ณผ ๋ฐ์ฝ๋ ์ดํฐ์ ๋ชจ๋์ ๋์ ์ผ๋ก ์์ฑํด ๋ค์ํ๊ฒ ํ์ฉํ ์ ์๋ ๊ฒ๋ NestJS๋ง์ ๋ฉ์ง ์ด์ ์ธ ๋ฏ ํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก๋ ์์ ๋ถ๋ฐฉํ ๋๋์ ์ฃผ๋ NodeJS๋ณด๋ค ์ผ์ ํ ๊ท์น๊ณผ ํจํด์ ๊ฐ์ง NestJS๊ฐ ๊ต์ฅํ ๋งค๋ ฅ์ ์ผ๋ก ๋ค๊ฐ์์ต๋๋ค.
-
Testing
Unit Test | E2E Test ๋ชจ๋ ์งํํด ๋ณด์๊ณ ์์ ๊ฐ์ด ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ํ ์คํ ํด๋ดค์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก Unit Test๋ณด๋ค๋ E2E Test์์ ํ์์ฑ์ ๋๊ผ๋๋ฐ ํนํ Cypress๋ฅผ ์ฌ์ฉํด Front Part๋ฅผ ํ ์คํธํ๋ฉด์ ์ค๋ฅ๋ฅผ ๊ฒ์ถํ ๊ฒฝํ์ด ์์ด Test์ ํ์์ฑ์ ๋๋ผ๊ฒ ๋์๋ค.
์ต๊ทผ์๋ StoryBook์ด๋ผ๋ library์ ๋ํด์๋ ์๊ฒ ๋์๋๋ฐ ๋น์ง๋์ค ๋ก์ง์ ์ ์ธํ๊ณ UI ๋ถ๋ถ์ ํ ์คํธํ๋ฉด์ Cypress๋ ๊ฐ์ด ์ฌ์ฉํด๋ณด๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
- Restaurant Hook์ ๋ง๋ค์ด Page ๋ณ๋์ Pagination ๊ตฌํ
- Create Dish ๊ธฐ๋ฅ์์ Dish Option ์ค Sub Option ๊ตฌํ
- Edit Dish ๊ตฌํ
- User Location Field ์ถ๊ฐ
- Edit User Page์์ Navigator Location์ ์ฌ์ฉํด ์ฌ์ฉ์ ์์น์ ๋ณด ์ ๋ฐ์ดํธ
- Driver์ Customer ๊ฐ, latitude | longitude ๋น๊ต ํ Google Map์ Route ํ์ํ๊ธฐ
- Gatsby๋ฅผ ์ฌ์ฉํด ์ ์ ๋ธ๋ก๊ทธ ๋ฐ ํฌํธํด๋ฆฌ์ค ๋น๋
- NestJS์ React๋ฅผ ์ฌ์ฉํด ๊ฐ์ธ ํ๋ก์ ํธ(๋งํผ์ ๊ฒ์) ๋น๋