Skip to content

maxlchan/PandaMarket-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

35 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿผ ํŒ๋‹ค๋งˆ์ผ“

ํŒ๋‹ค๋งˆ์ผ“์€ ์ผ๋ฐ˜์ธ๋“ค์ด ์ž์‹ ์˜ ์ค‘๊ณ ๋ฌผํ’ˆ์„ ๋ผ์ด๋ธŒ ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ†ตํ•ด ์ง์ ‘ ๊ฒฝ๋งคํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.panda logo

๐Ÿ‘‰ Deploy Address: https://www.pandamarket.live/

๐Ÿ‘‰ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฐ€์ด๋“œ ์˜์ƒ : https://www.youtube.com/watch?v=hcTGFmjfqOs

https://media.giphy.com/media/xnHosKB0mFOK8Yy3WG/giphy-downsized.gif

https://media.giphy.com/media/4RlgoDefSt3FSJGeux/giphy-downsized-large.gif

๐Ÿ‘‰ ๋ผ์ด๋ธŒ ์ค‘๊ณ  ๊ฒฝ๋งค ์‹œ์—ฐ ์˜์ƒ(ํ”„๋กœ์ ํŠธ ๋ฐœํ‘œ ไธญ) : https://youtu.be/jMw5MIxLY3o?t=6597

๐Ÿ”Table Contents

โ—๏ธ Motivation

  • ํ˜„์žฌ ์ค‘๊ณ ๋‚˜๋ผ ๊ฐ€์ž…์ž ์ˆ˜(๋‹น๊ทผ๋งˆ์ผ“, ๋ฒˆ๊ฐœ์žฅํ„ฐ ์ œ์™ธ)๋งŒ 2์ฒœ ๋งŒ๋ช…์ด ๋„˜์„ ์ •๋„๋กœ ์ค‘๊ณ  ๊ฑฐ๋ž˜์— ๋Œ€ํ•œ ์ „๊ตญ๋ฏผ์ ์ธ ์ˆ˜์š”๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ € ๋˜ํ•œ ํ‰์†Œ์— ๋งŽ์ด ์ด์šฉํ•˜๋Š” ์ค‘๊ณ ๊ฑฐ๋ž˜์˜ ์‹œ์žฅ์„ฑ์„ ํ•ญ์ƒ ์ฃผ๋ชฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์•„์ง๊นŒ์ง€ ํŒ๋งค์ž๊ฐ€ ๊ฐ€๊ฒฉ์„ ์ •ํ•˜๊ณ , ๊ตฌ๋งค์ž๋Š” ์ •ํ•ด์ง„ ๊ฐ€๊ฒฉ์œผ๋กœ ๊ตฌ๋งคํ•˜๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์˜ ์ค‘๊ณ ๊ฑฐ๋ž˜๊ฐ€ ์ฃผ๋ฅผ ์ด๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒ๋งค์ž๊ฐ€ ๋ผ์ด๋ธŒ ๋ฐฉ์†ก์œผ๋กœ ์ค‘๊ณ  ๋ฌผํ’ˆ์„ ๊ฒฝ๋งคํ•˜๋Š” ์„œ๋น„์Šค๋Š” ๊ฑฐ์˜ ์ „๋ฌดํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ๊ฐœ์‹œํ•œ๋‹ค๋ฉด ์„ ์ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ์กด ์ค‘๊ณ  ๊ฑฐ๋ž˜์—์„œ๋Š” ํŒ๋งค์ž์™€ ๋Œ€๋ฉดํ•˜๊ธฐ๊นŒ์ง€ ๋ง‰์—ฐํ•œ ๋‘๋ ค์›€์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ํŒ๋งค์ž์˜ ์–ผ๊ตด์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ ์ค‘๊ณ  ๊ฒฝ๋งค๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ƒ์‡„์‹œํ‚ค๊ณ , ์ค‘๊ณ ๊ฑฐ๋ž˜์— ๋Œ€ํ•œ ์‹ ๋ขฐ์„ฑ์ฆ๊ฐ€๋ฅผ ๋„๋ชจํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฏธ ์ธ์Šคํƒ€๊ทธ๋žจ๊ณผ ๊ฐ™์€ ์†Œ์…œ ํ”Œ๋žซํผ์—์„œ ๋ผ์ด๋ธŒ ์ค‘๊ณ ๊ฑฐ๋ž˜๊ฐ€ ๊ฐ„๊ฐ„ํžˆ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ์ง€๋งŒ, ํŠน์ • influencer์—๊ฒŒ๋งŒ ์˜ํ–ฅ๋ ฅ์ด ๋ฐœํœ˜๋ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์•ž์œผ๋กœ ๋„๋ž˜ํ•  ๋น„๋Œ€๋ฉด ์‹œ๋Œ€ ํ๋ฆ„์— ๋งž์ถ”์–ด ์ผ๋ฐ˜์ธ๋“ค๋„ ์‰ฝ๊ฒŒ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ค‘์ ์ด๊ณ  ํŠน์„ฑํ™” ๋œ ๋ผ์ด๋ธŒ ์ค‘๊ณ  ๊ฒฝ๋งค ํ”Œ๋žซํผ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก Features

  • ๊ฒฝ๋งค๋ฅผ ์›ํ•˜๋Š” ์ค‘๊ณ  ๋ฌผํ’ˆ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›ํ•˜๋Š” ์‹œ๊ฐ„ ๋Œ€์— ๊ฒฝ๋งค๋ฐฉ์„ ๊ฐœ์„คํ•˜์—ฌ, ์‹ค์‹œ๊ฐ„ ๋น„๋””์˜ค ์ŠคํŠธ๋ฆฌ๋ฐ์„ ํ†ตํ•ด ๊ฒฝ๋งค๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ตฌ๋งค๋ฅผ ์›ํ•˜๋Š” ์ค‘๊ณ  ๋ฌผํ’ˆ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒฝ๋งค๋ฐฉ์— ์ฐธ์—ฌํ•˜์—ฌ, ๊ฒฝ๋งค์ค‘์ธ ๋ฌผํ’ˆ์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ๊ฐ€๊ฒฉ๋Œ€๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐฐํŒ…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒฝ๋งค ์ผ์ž, ๊ฒฝ๋งค ์ฐธ์—ฌ ๋“ฑ ์˜ˆ์•ฝ์— ๋Œ€ํ•œ ๋ฉ”์ผ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ด ํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ๋“ฑ๋กํ•œ ๊ฒฝ๋งค, ์˜ˆ์•ฝํ•œ ๊ฒฝ๋งค ์ •๋ณด๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ›  Tech Stack

Frontend

  • ES2015+
  • React for component-based-architecture
  • Redux for state management(Redux-toolkit)
  • Redux Thunk for managing asynchronous operation
  • Styled Component
  • Socket.io
  • Web RTC for real time communication
  • Jest for unit-test
  • Enzyme for component-test

Backend

  • Node.js
  • Express
  • MongoDB / MongoDB Atlas for data persistence
  • Mongoose
  • JSON Web Token Authentication
  • AWS S3 for uploading data file
  • Socket.io
  • Node mailer / Node-schedule for reservation service
  • Chai / Mocha / SuperTest for unit-test

๐Ÿ“Œ Requirements

  • ํฌ๋กฌ ํ™˜๊ฒฝ์—์„œ์˜ ์‹คํ–‰์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“€ Installation

Local ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰์„ ์œ„ํ•ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Client

Root ๋””๋ ‰ํ† ๋ฆฌ์— .envํŒŒ์ผ์„ ์ƒ์„ฑ ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

// in .env in Root directory
REACT_APP_GOOGLE_CLIENT_ID=<YOUR_GOOGLE_CLIENT_ID>
git clone https://github.com/maxlchan/PandaMarket-frontend.git
cd PandaMarket-frontend
npm install
npm start

Server

Root ๋””๋ ‰ํ† ๋ฆฌ์— .envํŒŒ์ผ์„ ์ƒ์„ฑ ํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

// in .env in Root directory
PORT=<YOUR_PORT_NUMBER>
DB_URL=<YOUR_MONGODB_URL>
JWT_SECRET=<YOUR_JWT_SECRET>
AWS_ACCESS_KEY=<YOUR_AWS_ACCESS_KEY>
AWS_SECRET_KEY=<YOUR_AWS_SECRET_KEY>
NODE_MAILER_EMAIL=<YOUR_GMAIL_ADDRESS>
NODE_MAILER_PASSWORD=<YOUR_GMAIL_PASSWORD>
git clone https://github.com/maxlchan/PandaMarket-backend.git
cd PandaMarket-backend
npm install
npm run dev

๐ŸŒ Deploy

Client

Server

  • AWS Elastic Beanstalk (EB)
  • AWS Code Pipeline for Deployment automation

๐Ÿ•น How to Use

[ํŒ๋งค์ž]

  • ์†Œ์…œ ๋กœ๊ทธ์ธ ํ›„, ๋ฉ”์ธ ํ™”๋ฉด ํ•˜๋‹จ์— [๋‚ด ์ค‘๊ณ ๋ฌผํ’ˆ ๊ฒฝ๋งคํ•˜๊ธฐ] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
  • ์ƒํ’ˆ ์‚ฌ์ง„ ~ ๊ฒฝ๋งค ์ผ์‹œ๊นŒ์ง€ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ฑ„์šด ํ›„ [๊ฒฝ๋งค ๋“ฑ๋กํ•˜๊ธฐ] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
  • ๊ฒฝ๋งค๋ฅผ ๋ฐ”๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ, [๊ฒฝ๋งค ๋ฐ”๋กœ ์‹œ์ž‘] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
  • ๊ฒฝ๋งค ์ผ์‹œ๊ฐ€ ๋‹ค๋‹ค๋ฅผ ๊ฒฝ์šฐ, ํŒ๋งค์ž์˜ ๋ฉ”์ผ๋กœ ์ „์†ก๋˜๋Š” ๊ฒฝ๋งค๋ฐฉ ๋งํฌ๋ฅผ ํ†ตํ•ด ๊ฒฝ๋งค๋ฐฉ์„ ๊ฐœ์„คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ์—ฌ์ž๊ฐ€ ๊ฒฝ๋งค๋ฐฉ ์ž…์žฅ ํ›„ ์ผ์ • ๊ธˆ์•ก์„ ๋ฐฐํŒ…ํ•˜๋ฉด, [์นด์šดํŠธ ๋‹ค์šด Start] ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.
  • [์นด์šดํŠธ ๋‹ค์šด Start] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, 10์ดˆ์˜ ์นด์šดํŠธ ๋‹ค์šด์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
  • 10์ดˆ ๋™์•ˆ ์ตœ๊ณ ๊ฐ€์˜ ๋ฐฐํŒ…์ด ๋‚˜์˜ค์ง€ ์•Š์œผ๋ฉด 1๋“ฑ ๊ตฌ๋งค์ž์™€์˜ ๊ฐœ์ธ ๋Œ€ํ™”์ฐฝ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

[๊ตฌ๋งค์ž]

  • ์†Œ์…œ ๋กœ๊ทธ์ธ ํ›„, ํ™ˆ ํ™”๋ฉด์— [๋ฐ”๋กœ ์ฐธ์—ฌํ•˜๊ธฐ] ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ˜„์žฌ ๊ฒฝ๋งค์ค‘์ธ ๊ฒฝ๋งค๋ฐฉ์œผ๋กœ ์ž…์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • [๊ฒฝ๋งค์ƒํ’ˆ] ํƒญ์„ ํ†ตํ•ด ํ˜„์žฌ ์˜ˆ์•ฝ์ค‘์ธ ๊ฒฝ๋งค ์ƒํ’ˆ๋“ค์„ ๋‘˜๋Ÿฌ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • [์ƒ์„ธ๋ณด๊ธฐ]์˜ [๊ฒฝ๋งค ์˜ˆ์•ฝํ•˜๊ธฐ] ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ•ด๋‹น ๊ฒฝ๋งค๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŒ๋งค์ž๊ฐ€ ๊ฒฝ๋งค๋ฅผ ์‹œ์ž‘ํ•  ๊ฒฝ์šฐ, ๊ตฌ๋งค์ž ๋ฉ”์ผ๋กœ ์ „์†ก๋˜๋Š” ๊ฒฝ๋งค๋ฐฉ ๋งํฌ๋ฅผ ํ†ตํ•ด ๊ฒฝ๋งค๋ฐฉ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒฝ๋งค๋ฐฉ ์ž…์žฅ ํ›„ ๊ฐ€๊ฒฉ์„ ๋ฐฐํŒ…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ตœ๊ณ ๊ฐ€๋ณด๋‹ค ๋†’์€ ๊ฐ€๊ฒฉ์œผ๋กœ ๋ฐฐํŒ… ํ•  ๊ฒฝ์šฐ 1์œ„ ๊ตฌ๋งค์ž๋กœ ๋“ฑ๊ทนํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ ๊ฒฝ๋งค๋ฐฉ์„ ๋‚˜๊ฐ€๊ฒŒ ๋  ๊ฒฝ์šฐ, ์ž๋™์œผ๋กœ 2์œ„๊ฐ€ 1์œ„๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  • 10์ดˆ ๋™์•ˆ ์ตœ๊ณ ๊ฐ€์˜ ๋ฐฐํŒ…์ด ๋‚˜์˜ค์ง€ ์•Š์œผ๋ฉด ํŒ๋งค์ž์™€์˜ ๊ฐœ์ธ ๋Œ€ํ™”์ฐฝ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

[๊ณตํ†ต]

  • [๋‚ด์ •๋ณด] ํƒญ์„ ํด๋ฆญํ•˜๋ฉด '๋‚ด๊ฐ€ ๋“ฑ๋กํ•œ ๊ฒฝ๋งค', '๋‚ด๊ฐ€ ์˜ˆ์•ฝํ•œ ๊ฒฝ๋งค'๋ฅผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ œํ’ˆ์„ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฒฝ๋งค์‹œ์ž‘ ํ˜น์€ ๊ฒฝ๋งค ์ฐธ์—ฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—“ Project Schedule

์ „์ฒด ๊ธฐ๊ฐ„ 2020. 11. 30(์›”) ~ 2020. 12. 18(๊ธˆ) ์ด 3์ฃผ ์ง„ํ–‰

1์ฃผ์ฐจ - ๊ธฐํš(2020. 11. 30 ~ 2020. 12. 04)

2์ฃผ์ฐจ - ๊ฐœ๋ฐœ(2020. 12. 05 ~ 2020. 12. 13)

  • Social Login & JWT ํ† ํฐ ๋กœ๊ทธ์ธ ๊ตฌํ˜„
  • ์ค‘๊ณ  ๊ฒฝ๋งค ๋ฌผํ’ˆ ๋“ฑ๋ก ์ •๋ณด MongoDB ์ €์žฅ ๋ฐ ์‚ฌ์ง„ ํŒŒ์ผ AWS S3 ์—…๋กœ๋“œ
  • ๋“ฑ๋ก๋œ ์ค‘๊ณ  ๊ฒฝ๋งค ์ƒํ’ˆ list-up, categorizing, ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • Web RTC๋ฅผ ํ†ตํ•œ one-to-many Peer Connection ๊ตฌํ˜„
  • ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๋ฐ ๊ฒฝ๋งค ์ •๋ณด ๊ณต์œ ๋ฅผ ์œ„ํ•œ Socket ์—ฐ๊ฒฐ
  • nodeMailer & nodeScheduler ๋ฅผ ํ†ตํ•œ ๊ฒฝ๋งค ์˜ˆ์•ฝ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • ๋ฌผํ’ˆ ๋“ฑ๋ก ๋ฐ ์˜ˆ์•ฝ ์ด๋ ฅ ํ™•์ธ์„ ์œ„ํ•œ ๋งˆ์ดํŽ˜์ด์ง€ ํƒญ ์ถ”๊ฐ€

3์ฃผ์ฐจ - ๊ฒ€ํ†  ๋ฐ ์ •๋ฆฌ(2020. 12. 14 ~ 2020. 12. 18)

  • Refactoring & Styling & Debugging
  • Netlify ํ”„๋ก ํŠธ ๋ฐฐํฌ
  • AWS Elastic Beanstalk ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ๋ฐฐํฌ
  • Frontend & Backend Test code ์ž‘์„ฑ

๐ŸฅŠ Challenge & Focus point

์ปดํฌ๋„ŒํŠธ ์„ธ๋ถ„ํ™”์™€ ์žฌ์‚ฌ์šฉ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ๋น„๋ก ๊ทœ๋ชจ๋Š” ์ž‘์ง€๋งŒ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŽ์ด ๋งŒ๋“ค์–ด๋ณด๊ณ  ์žฌ์‚ฌ์šฉ๋„ ๋งŽ์ด ํ•ด๋ณด์ž! ๋ผ๋Š” ๋ชฉํ‘œ๋ฅผ ์ •ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ์ž„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์— ์ƒํƒœ๊ด€๋ฆฌ ๋กœ์ง์€ ์ตœ๋Œ€ํ•œ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ด๋ฃจ์–ด์ง€๋„๋กํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฒฝ๋Ÿ‰ํ™”์‹œํ‚ค๊ณ ์ž ํ•˜์˜€๊ณ , ํฐ ๋‹จ์œ„๋ผ๊ณ  ์ƒ๊ฐ๋˜์–ด์ง€๋Š” ๋ชจ๋‹ฌ์ฐฝ ํ˜น์€ ์นด๋ฃจ์…€ ์นด๋“œ์—์„œ๋ถ€ํ„ฐ ๋„ค๋น„๊ฒŒ์ด์…˜ Tab ๋“ฑ ์ž‘์€ ๋‹จ์œ„์˜ ์š”์†Œ๋“ค๊นŒ์ง€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ ์ž ๋…ธ๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜๋ฉด์„œ ๋Š๋‚€ ์žฅ์ ์€ ์ฒซ๋ฒˆ์งธ, Redux์™€ ์†Œํ†ตํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๋กœ์ง์ด ๊ธธ์–ด์ง€๊ณ  ๋ณตํ•ฉํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ ๋˜๋”๋ผ๋„ Concern ๋ถ„๋ฆฌ๊ฐ€ ๋ช…ํ™•ํ•ด์ง์— ๋”ฐ๋ผ ๊ฐ€๋…์„ฑ์ด ํฌ๊ฒŒ ๋–จ์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‘๋ฒˆ์งธ๋กœ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๊ฐ€ ์ˆœ์ˆ˜ํ•ด์ง์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์›ํ™œํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ต‰์žฅํžˆ ์ž‘์€ ๋‹จ์œ„๊นŒ์ง€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๊ต‰์žฅํžˆ ์ดˆ๋ฐ˜์—๋Š” ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š” ์ž‘์—…์ด์—ˆ์ง€๋งŒ, ์™œ ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๋ฆฌ์•กํŠธ์ ์œผ๋กœ ์‚ฌ๊ณ ํ•ด์•ผํ•˜๊ณ , ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ์ง€์— ๋Œ€ํ•ด ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Redux Thunk๋ฅผ ํ†ตํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

1์ฐจ ํ”„๋กœ์ ํŠธ ๋‹น์‹œ ํ•œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ชจ๋“  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด ํ•œ๊บผ๋ฒˆ์— ์ž‘์„ฑ๋˜์–ด์žˆ๋‹ค๋ณด๋‹ˆ, ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ์žฅํ™ฉํ•ด์ง„ ๋Š๋‚Œ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” redux-thunk ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ ์šฉํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. thunk ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋ณธ ๊ฒฐ๊ณผ, ์•„๋ž˜ ์„ธ๊ฐ€์ง€ ์ •๋„์˜ ์žฅ์ ์„ ์ฒด๊ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ ์ปจํ…Œ์ด๋„ˆ ์ž…์žฅ์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ๊ด€๋ จ๋œ ์•ก์…˜์— ๋Œ€ํ•ด์„œ๋Š” thunk์— ์œ„์ž„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปจํ…Œ์ด๋„ˆ ํ•จ์ˆ˜๊ฐ€ ์ข€๋” ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  ๊ด€์‹ฌ ๋ถ„๋ฆฌ๋„ ์ž˜๋˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ, ํŠน์ • ๋น„๋™๊ธฐ ์ž‘์—…์— ๋Œ€ํ•œ pending, success, failure ๋‹จ๊ณ„๊ฐ€ ๋ฆฌ๋•์Šค ์ƒํƒœ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ, ์ด์— ๋”ฐ๋ผ ๋น„๋™๊ธฐ Loading์ด๋‚˜ Error์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜ UI ์ƒ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ ์šฉ์ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, thunk ๋‚ด๋ถ€์—์„œ 1)ํ˜„์žฌ ๋ฆฌ๋•์Šค state๋ฅผ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•œ๋‹ค๋“ ์ง€, 2)๋‹ค๋ฅธ ์•ก์…˜๋“ค์„ ์—ฐ๋‹ฌ์•„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋“ ์ง€, 3)๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ํ›„์— ํŠน์ • URL๋กœ ๋ผ์šฐํŒ…์„ ํ•œ๋‹ค๋“  ์ง€ ๋“ฑ ์ž์œ ๋„๊ฐ€ ๋†’์•„์„œ ๊ฐœ๋ฐœํ•˜๊ธฐ์— ๊ต‰์žฅํžˆ ํŽธ๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ thunk๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ '์ˆœ์ˆ˜ํ•˜์ง€ ์•Š๋‹ค'๋ผ๋Š” ๊ฒƒ์„ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค. thunk ๋‚ด๋ถ€์—์„œ ๋„ˆ๋ฌด ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ผ์„ ํ•˜๋‹ค๋ณด๋‹ˆ, ์ œ 3์ž๊ฐ€ ๋ณด์•˜์„ ๋•Œ ์œ„ ํ•จ์ˆ˜๊ฐ€ ๋Œ€์ฒด ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ธ์ง€์— ๋Œ€ํ•ด ์ดํ•ดํ• ์ˆ˜ ์—†๋Š” ์—ฌ์ง€๊ฐ€ ๋งŽ์•˜๊ณ , ๊ฒฐ๋ก ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์–ด๋ ค์šด ์ฝ”๋“œ๊ฐ€ ๋„์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Functional Programming์„ ์ง€ํ–ฅํ•˜๋Š” React ์ƒํƒœ๊ณ„์—์„œ redux-thunk๋ณด๋‹ค redux-saga๊ฐ€ ์™œ ๋” ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ฒƒ์ธ์ง€ ๊นŠํžˆ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , redux-saga์— ๋Œ€ํ•ด์„œ๋„ ๊ณต๋ถ€๋ฅผ ํ•ด๋ณผ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ์˜ Edge Case์— ๋Œ€ํ•œ ๊ณ ๋ฏผ

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ค‘์ ์ ์œผ๋กœ ์ƒ๊ฐํ–ˆ๋˜ ๋ถ€๋ถ„์€ '์ด ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ํŠน์ด ํ–‰๋™์„ ์ทจํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ Edge Case์— ์–ด๋–ป๊ฒŒ ๋Œ€๋น„ํ•ด์•ผํ• ๊นŒ?'์— ๋Œ€ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๊ฐ€ 1๋“ฑ ๊ตฌ๋งค์ž๊ฐ€ ๊ฒฝ๋งค ๋„์ค‘์— ๋ฐฉ์„ ๋‚˜๊ฐ€๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ์˜€์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ redux๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ์—๋Š” currentWinner๋ผ๋Š” 1๋“ฑ ๊ตฌ๋งค์ž๋งŒ์„ ๋‚˜ํƒ€๋‚ด๋Š” state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€์‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 1๋“ฑ์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค, 1๋“ฑ์˜ ์ •๋ณด๋ฅผ ์Œ“์•„์˜ฌ๋ฆฌ๋Š” stack ์ž๋ฃŒ๊ตฌ์กฐ ํ˜•ํƒœ๋กœ currentWinnerList๋ผ๋Š” state๋ฅผ ๊ด€๋ฆฌํ•˜์˜€๊ณ , 1๋“ฑ ๊ตฌ๋งค์ž๊ฐ€ ๋ถ€๋“์ดํ•˜๊ฒŒ ๊ฒฝ๋งค๋ฐฉ์„ ๋‚˜๊ฐˆ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐํ•ด์ฃผ์–ด ์ž๋™์œผ๋กœ 1๋“ฑ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด์™ธ์—๋„ ๋‹ค๋ฅธ Edge case(๊ฒฝ๋งค ๋„์ค‘ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ peerConnection ์œ ์ง€, ๊ฒฝ๋งค ์ข…๋ฃŒ ํ›„ ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๋‹ค์‹œ ๊ฒฝ๋งค๋ฐฉ์— ์ž…์žฅํ•˜๋Š” ์ƒํ™ฉ ๋ฐฉ์ง€ ๋“ฑ)๋“ค์— ๋Œ€ํ•ด์„œ๋„ ๋ชจ๋“  ์ƒํ™ฉ์— ์™„๋ฒฝํ•˜๊ฒŒ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์ตœ๋Œ€ํ•œ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถ”์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ Things to do

  • ์›ํ•˜๋Š” ๋ฌผํ’ˆ๊ณผ ๊ฐ€๊ฒฉ์„ ๋“ฑ๋กํ•˜๋ฉด, ์ฐจํ›„ ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š” ๋ฌผํ’ˆ์ด ๋“ฑ๋ก๋˜์—ˆ์„ ๋•Œ ๋ฉ”์ผ ์•Œ๋žŒ์ด ์˜ค๋Š” ์„œ๋น„์Šค
  • ์‹ค์ œ ๊ฒฝ๋งค๊ฐ€ ๋‚™์ฐฐ๋˜์—ˆ์„ ๋•Œ ๊ตฌ๋งค์ž์˜ ํฌ์ธํŠธ๊ฐ€ ์„ ๊ฒฐ์ œ๋˜๋Š” ๊ฑฐ๋ž˜ ์‹œ์Šคํ…œ
  • ๊ฒฝ๋งค์‹œ ๋‹ค์ฑ„๋กœ์šด animationํšจ๊ณผ, ๋ฐ˜์‘ํ˜• ๋“ฑ ๋”์šฑ Interactive ํ•œ UI ๊ตฌํ˜„