b1e7733e-50ab-465b-bd52-b89334e9c62f.mp4
์์ผ ํ๋ฉํด์ฃผ๋ ์ฑ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๋ค.
https://github.com/inha-commit/egusajo-nest
Joi
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ํ๊ฒฝ๋ณ์์ ๋ํ ์ ํจ์ฑ๊ณผ ํ์
์ ๊ฒ์ฌํ์ฌ ๋ฐํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ์์ต๋๋ค.
Guard๋ฅผ ์ด์ฉํ์ฌ request์ header๋ฅผ ์ฒดํฌํ์ฌ ์ ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์์ต๋๋ค.
nest.js์ ๋ด์ฅ๋ก๊ฑฐ๋ฅผ Winston.js
๋ก ๋์ฒดํ์ฌ info
warn
error
level๋ก ๋๋๊ณ ์๋ฒ์ ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ, ์๋ฒ์์ ๋ฐ์ํ๋ ๋ชจ๋ ์๋ฌ์ ๋ํด ํ์ผ๋ก ๊ธฐ๋กํ์์ต๋๋ค.
Validation-pipe๋ฅผ ์ด์ฉํ์ฌ client์ ์์ฒญ์ class-validator๋ก ๊ฒ์ฌํ๊ณ , class-transformor๋ก ๋ฐ์ดํฐ ๋ณํ์ด ํ์ํ ๋ฐ์ดํฐ์ ๋ํด ์์ฒญ์ ๋ณํํ์์ต๋๋ค.
Database์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ Convertor๋ก mappingํ์ฌ service๋ก ์ ๋ฌํ์์ต๋๋ค.
Service์์ returnํ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ResponseDto
๋ก ๋ค์ mappingํ์ฌ client์๊ฒ ํ์ํ ๋ฐ์ดํฐ๋ง ์ ์กํ๋๋ก ํ์์ต๋๋ค.
Interceptor๋ฅผ ์ด์ฉํ์ฌ http ์์ฒญ์ ๋ํ ์๋ต์๊ฐ์ ๊ณ์ฐํ๊ณ ๊ธฐ๋กํ์์ต๋๋ค.
nest.js์ ExceptionFilter
๋ฅผ ํ์ฅํ์ฌ ์๋ฒ์์ ๋ฐ์ํ ์ ์๋ ์๋ฌ๋ฅผ BadRequestError
, UnauthorizedError
, ForbiddenError
, InternalServerError
, NotFoundError
๋ก ๋๋์ด classํ ํ๊ณ Front-end๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ์๋ฌ๋ค์ ๋ํด์ ErrorCode๋ค์ ๋ฏธ๋ฆฌ enum type์ผ๋ก ์ ์ํด ๋ ๋ค์, ํด๋น ์๋ฌ์ ๋ง๋ class๋ก mappingํ์ฌ client์๊ฒ ์ ์กํ์์ต๋๋ค.
Jest
๋ฅผ ์ด์ฉํด์ controller์ service ํจ์์ ๋ํด ๊ฐ๊ฐ ํ
์คํธ๋ฅผ ์งํํ์์ต๋๋ค.
โ๏ธ Jest๋ฅผ ์ด์ฉํ unit test
typeorm-extension
์ ์ด์ฉํ์ฌ faker.js
๋ก ๋ฐ์ดํฐ๋ฅผ seeding ํ๊ณ ์ ์ ๋ณ๋ก API๋ฅผ ํ
์คํธํ์์ต๋๋ค.
โ๏ธ typeorm-extension์ผ๋ก ๋ฐ์ดํฐ seedingํ๊ธฐ
Artillery
๋ฅผ ์ด์ฉํ์ฌ 60์ด ๋์ ์ด๋น ์์ฒญํ์๋ฅผ ๋๋ ค๊ฐ๋ฉด์ development
production
๋ ๋ฒจ์์ ๊ฐ๊ฐ ๋ถํ ํ
์คํธ๋ฅผ ์งํํ์์ต๋๋ค.
โ๏ธ Artillery๋ก ์๋ฒ์ ๋ถํํ ์คํธ ํ๊ธฐ
Load Balancing
์ด ์ ์ฉ๋์ด ์๋ ์ค์ ์๋ฒ์ Artillery
๋ก ํ
์คํธ๋ฅผ ์งํํ์ฌ ์์ฒญ์ ๋ฐ์๋ค์ผ ์ ์๋ ์ ๋นํ ์ปจํ
์ด๋ ๊ฐ์๋ฅผ ์ ์ ํ์์ต๋๋ค.
โ๏ธ Artillery ํ ์คํธ๋ฅผ ํตํ ์ค์ ์๋ฒ ์ปจํ ์ด๋ ๊ฐ์ ์กฐ์
Artillery
๋ก ํ
์คํธ๋ฅผ ์งํํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํ์ธํ์๊ณ , ๋๋ฒ๊น
ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ๊ณ ์์ ํ์์ต๋๋ค.
โ๏ธ Artillery ํ ์คํธ๋ฅผ ํตํ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์ ๋ฐ ์ฝ๋ ์์
docker/build-push-action@v4
๋ฅผ ์ด์ฉํ์ฌ DockerFile์ ์์ฑ๋ ๋๋ก ์ฐ๋ฆฌ์ ์๋น์ค๋ฅผ ์ด๋ฏธ์ง๋ก ๋ง๋ค์ด Github packages
์ ์ ์ฅ๋๋๋ก ํ์์ต๋๋ค.
Github packages
์ ์ ์ฅ๋ ์ด๋ฏธ์ง๋ฅผ appleboy/ssh-action@master
๋ฅผ ์ด์ฉํ์ฌ ์ฐ๋ฆฌ์ ํด๋ผ์ฐ๋ ์๋ฒ์ ์ ๊ทผํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ปจํ
์ด๋ํ ํ์ฌ ์๋น์ค๋ฅผ ์คํํ ์ ์๊ฒ ํ์์ต๋๋ค.
โ๏ธ Github-action์ ํตํ CI/CD
Docker-network
๋ฅผ ์ด์ฉํ์ฌ Server
MySQL
Redis
๋ฅผ ํ network๋ก ๋ฌถ์ด ์ธ๋ถ์์์ ์ก์ธ์ค๋ฅผ ์ ์ดํ๊ณ ๋คํธ์ํฌ ์์ค์์ ๋ณด์์ ๊ฐํํ์์ต๋๋ค.
docker-compose.yml
ํ์ผ์ ์ปจํ
์ด๋๋ฅผ ์คํํ๋๋ฐ ํ์ํ ๋คํธ์ํฌ, ๋ณผ๋ฅจ, ํ๊ฒฝ ๋ณ์ ๋ฑ์ ์ ์ํ์ฌ. ๊ฐ๋
์ฑ์ด ์ข๊ฒ ํ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์
๊ตฌ์ฑ์ ์ดํดํ๊ณ ๊ณต์ ํ๊ธฐ ์ฝ๊ฒ ํ์์ต๋๋ค.
nginx
๋ฅผ ์ด์ฉํด http๋ก 80๋ฒ port์ ๋ค์ด์จ ์์ฒญ๋ค์ ๋ํด์ ๋๋ฆฌ๋ก ๋ฐ์ ๋ค์, 443๋ฒ port๋ก redirect์์ผ์ ๋ณด๋ด์ฃผ๊ณ . ๋ฆฌ๋ฒ์ค ํ๋ก์๋(reverse-proxy)
๋ฅผ ์ด์ฉํด 4000๋ฒ์์ ์๋ํ๊ณ ์๋ node.js์๋ฒ๋ก ์์ฒญ์ด ๊ฐ๊ฒ ํ์์ต๋๋ค. ์ด๋ ๊ฒย ๋ฆฌ๋ฒ์ค ํ๋ก์๋(reverse-proxy)
๋ฅผ ํตํด ์๋ฒ๋ฅผ ๊ฐ์ถ๊ณ , SSL/TLS ์ํธํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์กํ ์ ์๊ฒ ํ์์ต๋๋ค.
โ๏ธ Http์ Https ๊ทธ๋ฆฌ๊ณ SSL์ ๊ฐ๊ฐ ๋ฌด์์ผ๊น? | โ๏ธ Nginx๋ ๋ฌด์์ด๊ณ ์ ์ฌ์ฉํ ๊น? | โ๏ธ Nginx ์ค์น ๋ฐ Https ์ ์ฉํ๊ธฐ
๋ฆฌ๋ ์ค ์๋ฒ์ ์ด๋ฏธ ๋๋ฉ์ธ์ด ์ ์ฉ๋์ด ์์ด์ Nginx์ reverse-proxy๋ฅผ ์ด์ฉํ์ฌ ํ๋์ ์๋ฒ์ ๋๊ฐ์ ๋๋ฉ์ธ์ด ์ ์ฉ๋๋๋ก ํ์์ต๋๋ค.
โ๏ธ ๋๊ฐ์ port์ ๋ํด ์๋ก๋ค๋ฅธ ๋๋ฉ์ธ ์ ์ฉํ๊ธฐ
docker-compose
๋ฅผ ์ด์ฉํด ์ปจํ
์ด๋ ๊ฐ์๋ฅผ ๋๋ฆฌ๊ณ nginx
๋ฅผ ์ด์ฉํด least_conn
๋ฐฉ์์ ์ด์ฉํด ํ์ฌ ์ฐ๊ฒฐ ์ํ๋ฅผ ๊ณ ๋ คํ์ฌ ํธ๋ํฝ์ ๋ถ์ฐ์์ผ ์๋ฒ ๊ฐ์ ๋ถํ๋ฅผ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํ์์ต๋๋ค.
โ๏ธ Nginx + Docker๋ก Load Balancingํ๊ธฐ