๐ฑ์จ๋ผ์ธ ํ์์ฑํ
๋ณด๋๊ฒ์, We All Lion
'We All Lion' ์ ๋ณด๋๊ฒ์ '์คํ์ด ํด' ์ ๋ชจํฐ๋ธ๋ก ๋ง๋ ์จ๋ผ์ธ ํ์ ์ฑํ
๋ณด๋๊ฒ์ ํ๋ซํผ ์
๋๋ค.
1. ์๊ฐ
๐Notion
๐๊ธฐ๊ฐ
-
2022.11.04 ~ 2022.12.16 (6์ฃผ)
๐จโ๐ปํ์
2. ์๋น์ค
๐จโ๐ซ์๋น์ค ์๊ฐ
- ์ฌ์๋ค ์ฌ์ด์ ์จ์ด๋ ๊ณ ์์ด๋ก ๋์์ธ ์ปจ์
์ ์ ํด ๋ชจ๋ ์ฐ๋ น๋๊ฐ ์ ๊ทผํ๊ธฐ ์ฝ๊ฒ ์ ์ํ์ต๋๋ค.
- ์ต์ 4๋ช
๋ถํฐ ์ต๋ 8๋ช
๊น์ง ์ฝ๊ณ ๊ฐ๋จํ ๊ฒ์ ๊ท์น์ผ๋ก ์ฆ๊ธธ ์ ์์ต๋๋ค.
- ์ฐ๋ฆฌ๋ผ๋ฆฌ?! ์ง์ธ๋ค๊ณผ ์ฆ๊ธธ ์ ์๋๋ก ๋น๋ฐ๋ฐฉ ์ค์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ค์๊ฐ ์ฑํ
๊ณผ ์บ ์ผ๋ก ์ ์ ๋ค๊ณผ ์ํตํ๋ฉฐ ์จ๋ผ์ธ์ผ๋ก ์ง๊ธ ๋น์ฅ ๊ฒ์์ ์ฆ๊ฒจ๋ณด์ธ์!
๐ฐํ์ด์ง ์๊ฐ
๊ฒ์์ค๋ช
& ๋ก๊ทธ์ธ ํ์ด์ง |
๋ก๋น ํ์ด์ง |
|
|
์ ์ ํ๋กํ ๋ณ๊ฒฝ |
๋ฐฉ ๋ง๋ค๊ธฐ |
|
|
๋ฐฉ ์
์ฅ & ๋๊ธฐ ํ์ด์ง |
๊ฒ์์์ ํ์ด์ง |
|
|
๊ฒ์ํฌํ ํ์ด์ง |
๊ฒ์์ข
๋ฃ ํ์ด์ง |
|
|
๐๊ธฐ๋ฅ์๊ฐ
๊ฒ์์ค๋ช
& ๋ก๊ทธ์ธ ํ์ด์ง
- ์นด์นด์ค ์์
๋ก๊ทธ์ธ ํ์๊ฐ์
- ๊ฒ์ ์ค๋ช
๋ชจ๋ฌ
๋ก๋น ํ์ด์ง
- ๋ฐฉ ๋ชฉ๋ก (๋ฐฉ ์ ๋ณด ์ค์๊ฐ ํ์ธ ๊ฐ๋ฅ : ์ธ์, ๋ชจ๋, ๋ฐฉ ์ํ ๋ฑ)
- ๋ฐฉ ๋ง๋ค๊ธฐ ๋ฒํผ (๊ณต๊ฐ & ๋น๊ณต๊ฐ / EASY & HARD)
- ๋ก๋น ์ ์ฒด ์ฑํ
์ ์ ํ๋กํ ๋ณ๊ฒฝ
- ์ด๋ฏธ์ง, ์ ์ ์ด๋ฆ, ๊ฒ์ ์น๋ฅ
- ์ ์ ์ด๋ฆ ์์
๋ฐฉ ๋ง๋ค๊ธฐ
- ๋ฐฉ ๋ง๋ค๊ธฐ ๋ฒํผ (๊ณต๊ฐ & ๋น๊ณต๊ฐ / EASY & HARD)
๋ฐฉ ์
์ฅ & ๋๊ธฐ ํ์ด์ง
- ๋ฐฉ ์ ๋ณด (๋ชจ๋, ์ธ์ ๋ฑ)
- ๊ฒ์ ์ค๋น/ ๊ฒ์ ์์
- ๋ฐฉ ์ ์ฒด ์ฑํ
- ๋ง์ดํฌ, ์นด๋ฉ๋ผ ๊ธฐ๋ฅ
๊ฒ์์์ ํ์ด์ง
- ๊ฐ์ ์ญํ ์นด๋ ๋ถ๋ฐฐ / ์ ์์ด ์นดํ
๊ณ ๋ฆฌ & ๋จ์ด ๋ชจ๋ฌ
- ์ฌ์ ํฌํ ๊ธฐ๋ฅ
๊ฒ์ํฌํ ํ์ด์ง
- ์คํ์ด ํฌํํ๊ธฐ
- ์คํ์ด ์ ๋ต ์ ์์ด ์ ํ
๊ฒ์์ข
๋ฃ ํ์ด์ง
- ์คํ์ด ๋ฐํ๊ธฐ
- ์ฌ์์ ๋ฐ ๋๊ฐ๊ธฐ
3. ๊ตฌ์กฐ
๐คนโโ๏ธ์๋น์ค ์ํคํ
์ฒ
๐ERD
ERD
![erd](https://user-images.githubusercontent.com/113876583/207319448-35612007-56e3-478d-a503-17691fc2bfcd.jpg)
๐ํ๋ก์ ํธ ๊ตฌ์ฑ
ํ๋ก์ ํธ ๊ตฌ์ฑ
```markup
โโโ Dockerfile
โโโ nodemon.json
โโโ package-lock.json
โโโ package.json
โโโ server.js
โโโ src
โย ย โโโ app.js
โย ย โโโ chat
โย ย โย ย โโโ chat-socket.js
โย ย โโโ game
โย ย โย ย โโโ game-provider.js
โย ย โย ย โโโ game-repo.js
โย ย โย ย โโโ game-socket.js
โย ย โโโ middlewares
โย ย โย ย โโโ auth-middleware.js
โย ย โย ย โโโ exception.js
โย ย โย ย โโโ passport
โย ย โย ย โย ย โโโ index.js
โย ย โย ย โย ย โโโ kakao-stratege.js
โย ย โย ย โโโ socket-auth-middleware.js
โย ย โย ย โโโ test.js
โย ย โย ย โโโ user-error-handler.js
โย ย โย ย โโโ wrap-async-controller.js
โย ย โโโ redis.js
โย ย โโโ rooms
โย ย โย ย โโโ room-provider.js
โย ย โย ย โโโ room-repo.js
โย ย โย ย โโโ room-socket.js
โย ย โโโ schemas
โย ย โย ย โโโ game.js
โย ย โย ย โโโ index.js
โย ย โย ย โโโ room.js
โย ย โย ย โโโ user.js
โย ย โโโ socket.js
โย ย โโโ users
โย ย โย ย โโโ user-controller.js
โย ย โย ย โโโ user-repo.js
โย ย โย ย โโโ user-route.js
โย ย โย ย โโโ user-service.js
โย ย โย ย โโโ util
โย ย โย ย โโโ jwt.js
โย ย โย ย โโโ user-function.js
โย ย โโโ webRTC
โย ย โโโ webRTC.js
โโโ test
โย ย โโโ mockData
โย ย โย ย โโโ user-data.js
โย ย โโโ user-test
โย ย โโโ jwt.spec.js
โย ย โโโ user-controller.spec.js
โย ย โโโ user-function.spec.js
โย ย โโโ user-repo.spec.js
โย ย โโโ user-service.spec.js
โโโ ์ ๋ชฉ ์๋ ๋ค์ด์ด๊ทธ๋จ.drawio
```
๐ ์ฌ์ฉํ ๊ธฐ์
โ๊ธฐ์ ์ ์์ฌ ๊ฒฐ์
-
BE
1. Nginx
ใ**์ฌ์ฉ์ด์ **
- event-driven์ ๋น๋๊ธฐ ๊ตฌ์กฐ์ด๋ฏ๋ก ์ฑํ
๊ธฐ๋ฅ์ด๋ RTC๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ๋, ๋์ ์ ์์ ์๊ฐ ์ฆ๊ฐ๋ฅผ ๋๋นํ์ฌ ์ ํฉํ ๋ฐฉ์์ ์น ์๋ฒ๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๋ํ NginX๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐฉ์, ๋น๋๊ธฐ์ ์ฒ๋ฆฌ, ๋
ผ๋ธ๋กํน ๋ฐฉ์ ์ฒ๋ฆฌ๋ฅผ ํตํด ๊ณ ์์ผ๋ก ์ฒ๋ฆฌํ๋ ํน์ง์ด ์์ด ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
- ๋์ ์ ์์ ์๊ฐ ๋ง์์ ธ๋ Apache์ ๋นํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ด ๋ฎ๊ณ , ์ฒ๋ฆฌํ๋ ์ด ๋น ์์ฒญ ์๊ฐ ์๋์ ์ผ๋ก ๋์ ๋ชจ์ต์ ๋ณด์ฌ์ค๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ด์ํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ณ ์ค๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค.
- reverse proxy๋ก ์๋ฒ ํ์ฅ์ ์ฉ์ดํ๊ณ ๋ณด์์ ์ผ๋ก ๋ฐ์ด๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ต๋๋ค.
2. Socket.io
ใ**์ฌ์ฉ์ด์ **
- ํต์์ ์ผ๋ก ์ฌ์ฉ์(์๋ฒ์ ์ฐ๊ฒฐ๋ ์์ผ๋ค)์ ์ธ๋ฐํ๊ฒ ๊ด๋ฆฌํด์ผํ๋ ์๋น์ค์๋ socket.io์ ์๋ ๋ธ๋ก๋์บ์คํ
์ ์ฌ์ฉํ๋๊ฒ ๋ ํจ์จ์ ์ด๋ผ๊ณ ํฉ๋๋ค.
- socket์ ์ด์ฉํด์ ๊ฒ์ ๋ก์ง๊ณผ ๊ฐ์ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ socekt์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ํ์ฉํด์ ์๋น์ค ๋ด์์ ํ์ฉํ๋ ๋ถ๋ถ๋ค์ ์๊ฐํ๋ฉด socekt.io๊ฐ ๋ ์ ํฉํ๋ค๊ณ ํ๋จํ์ต๋๋ค.
3. Redis
ใ**์ฌ์ฉ์ด์ **
- ๊ฐ ๊ฒ์์ ๋ํด ํฌํ ๊ฒฐ๊ณผ ์ง๊ณ๋ ์ค๋น ์ํ ๋ฑ DB์ ์ ์ฅํ ํ์๋ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- I/O์ ๋น๋ฒํ ๊ฐ๋จํ ์ก์
๋ค์ ๋ํด ๊ฐ๋ณ๊ฒ ์ ์ฅํด ๋ DB์ memcached๋ redis ๊ฐ ํ๋ณด์์ต๋๋ค. memcached๋ณด๋ค redis๊ฐ cloud์๋น์ค๋ก ์ ๊ณต์ด ์ด๊ธฐ ์ธํ
ํ๊ธฐ์ ๋ ๋นจ๋ผ์ ์ ํํ๊ฒ ๋์ต๋๋ค.
- ๊ฐ๋จํ ๋ฐ์ดํฐ ํ์
๋ค๊ณผ key, value ํ์์ผ๋ก ์ ์ฅํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ DB๋ผ์ I/O์ ๋ค๋ฃจ๊ธฐ์๋ redis๊ฐ ์ ํฉํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- redis๋ฅผ ์ ํํ ๋ local๊ณผ cloud ๋๊ฐ์ง ์ต์
์ด ์์๋๋ฐ ํ์
ํ๋ฉด์ ์ฌ์ฉํ๊ธฐ์๋ ์๋ฌด๋๋ local๋ณด๋จ cloud๊ฐ ๋ ํจ์จ์ ์ผ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
4. JWT
ใ**์ฌ์ฉ์ด์ **
- ์นด์นด์ค์์ ๋ฐ๊ธ๋ฐ์ accessToken์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ ๋์ง๋ง ์นด์นด์ค์ accessToken ์ ์ ํจ์๊ฐ์ด 11์๊ฐ์ผ๋ก ๊ต์ฅํ ๊ธด ํธ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
- ์ง์ accessToken์ ๋ฐ๊ธํ๊ณ ์ ํจ์๊ฐ์ ์ค์ฌ ๋ณด์์ ์กฐ๊ธ ๋ ๊ฐํํ๊ณ ์ ์๊ฐํ์ต๋๋ค.
- ์ธ์
๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ๋ณ๋์ ์ธ์ฆ ์ ์ฅ์๊ฐ ํ์ํ์ง ์์ ์๋ฒ์์ ์ปค๋ฎค๋์ผ์ด์
์ ์ต์ํ์ผ๋ก ํ ์ ์์ด ํธ๋ํฝ์ ๋ํ ๋ถ๋ด์ด ์ ๋ค๊ณ ์๊ฐ์ด ๋ค์์ต๋๋ค.
5. MongoDB
ใ**์ฌ์ฉ์ด์ **
- ํ๋ก์ ํธ์์ DB์ ์ ์ฅํ๋ ๋์์ ์ ์ (์ ์ , ๊ฐ์ธ์ ๋ณด) / ๋ฃธ / ๊ฒ์ ์ด๋ ๊ฒ ์ธ ๊ฐ์ง ํ
์ด๋ธ(์ฝ๋ ์
) ๋ฐ์ ํ์ํ์ง ์๊ณ , ๋ฐ์ดํฐ์ ์งํฉ ๊ฐ์ ์ข
์์ฑ์ด ๋ง์ง ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ๊ฒ์ ๋ด์์ ์ค์๊ฐ์ผ๋ก ๋ณํ๋ ์ ๋ณด๋ ๋ฐฉ ์ํ์ ๋ณํ์ ๊ฒฝ์ฐ ์ผ์์ ์ธ ์ ๋ณด๋ Redis๋ฅผ ํตํด์ ์ ์ฅํ๊ธฐ๋ ํ์ง๋ง, Redis๋ก ๋ชจ๋ ์ ๋ณด๋ฅผ ์ ๋ถ ์ฒ๋ฆฌํ ์๋ ์๊ธฐ์ DB๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ณ , ๋ ๊ต์ฅํ ์์ฃผ DB์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์
๋ฐ์ดํธํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค๊ณ ์๊ฐ์ด ๋ค์์ต๋๋ค.
- ๋ค๋ฅธ ๋ฐ์ดํฐ ์งํฉ์ ์ฐ๊ฒฐ์์ผ์ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค์ํผํ๊ธฐ์ ์ฒ๋ฆฌ ์๋๊ฐ ๋น ๋ฅธ NoSQL์ด ์ฐ๋ฆฌ์ ํ๋ก์ ํธ์ ๋ ์ ํฉํ๋ค๊ณ ํ๋จํ์ต๋๋ค.
- ์์ผ์ ํตํด ์ค์๊ฐ์ผ๋ก ๋ง์ ์ ๋ณด๊ฐ ์์ฑ, ๋ณ๊ฒฝ๋๋ ์๋น์ค์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋นจ๋ฆฌ ์ฝ์ด์ฌ ์ ์์ผ๋ฉฐ ์์ง ๋ฐ ์ํ ํ์ฅ์ด ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐ์ด ๋ค์์ต๋๋ค.
6. Prettier / ESLint / Babel
ใ**์ฌ์ฉ์ด์ **
- prettier
๊น๋ํ ์ฝ๋์ ํ์
์ ์ํด์ ์ผ๊ด์ฑ ์๋ ์ฝ๋ ์คํ์ผ์ ์ ๊ณตํด์ค๋ค ์๊ฐํ์ฌ ์ฌ์ฉํ์ต๋๋ค.
- eslint
๋ค์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์๋ ์ฝ๋ ๋ฐฉ์์ ์ผ๊ด์ฑ ์๊ฒ ๊ตฌํํ ์ ์๋๋ก ํด์ค๋ค ์๊ฐํ์ฌ ์ฌ์ฉํ์ต๋๋ค.
- babel
Babel์ ์ด์ฉํ๋ฉด ES6 ์ด์์ ์ต์ ๋ฌธ๋ฒ์ผ๋ก ์์ฑํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ES5 ์ดํ์ ์์ ๋ฌธ๋ฒ์ผ๋ก ์์ฑํ ๊ฒ ์ฒ๋ผ ์์ค ์ฝ๋ ๋ด์ ๋ฌธ๋ฒ์ ํํ๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด ๋ค์ํ ์คํํ๊ฒฝ์์ ์๋ํ ์ ์๊ฒ ํด์ค๋ค ์๊ฐํ์ฌ ์ฌ์ฉํ์ต๋๋ค.
ใใ๐ ๊ธฐ์ ์ ์์ฌ ๊ฒฐ์
โฝํธ๋ฌ๋ธ์ํ
ใใ๐ ์นด์นด์ค์์
๋ก๊ทธ์ธ : ํ๋ก ํธ๋ก ๋ฐ์ดํฐ ์ ๋ฌ ๋ถ๊ฐ
ใใ๐ socket.js ๊ธฐ๋ฅ๋ณ ๋ถ๋ฆฌ ์ค ์ฐ๊ฒฐ ์๋ฌ
ใใ๐ ํน์ ๋ฃธ์ผ๋ก ์ฑํ
๋ฉ์ธ์ง ์ ๋ฌ ๋ถ๊ฐ (Socket.io)
ใใ๐ docker image๋ก ์๋ฒ ์คํ ์ 'Javascript heap out of memory' ํ์
ใใ๐ docker์์ openvidu ์๋ฒ๋ฅผ ํ์ฉํ SFU ๋ฐฉ์ ํ
์คํธ ์งํ ๋ด์ฉ
4. ๊ธฐํ
๐ปGitHub