1. ๊ธฐ์ ๋ฐ ์ํคํ ์ฒ ์ค๊ณ
ํ๋ฐํธ์๋ ๊ธฐ์ ์คํ์ ๊ฒฝ์ฐ์๋ ํ๋ฐํธ์๋ ๊ฐ๋ฐ ๋ด๋น์ธ ์ฐ์์B๊ฐ ๊ตฌ์ฑ ํ ์ฐ๋ฆฌ์๊ฒ ๊ณต์ ํ์๋ค. ๋์ ์ฐ์์A๋ ๋ฐฑ์๋ ํํธ ๊ธฐ์ ์คํ ๊ตฌ์ฑ๊ณผ AWS ์ํคํ
์ฒ ์ค๊ณ๋ฅผ ๋ด๋นํ์๋ค. AWS ์ํคํ
์ฒ ์ค๊ณ์ ๊ฒฝ์ฐ, ์ฐ๋ฆฌ์ ๋ด๋น ๋ฉํ ๋์ด์ ๋ฉํ ๋A์ ๋์์ ๋ฐ์๋ค. ๋ฉํ ๋A๋ ํ์ฌ AWS ์ปค๋ฎค๋ํฐ ๋น๋(Community Builder)๋ก ํ๋ํ์๋ AWS ์ ๋ฌธ๊ฐ์ด์๋ค. ๋๋ถ์ ์ด์ ์ ๊ฒฝํํด๋ณด์ง ๋ชปํ ๋ณด์๊ณผ ๋์ฉ๋ ํธ๋ํฝ์ ๊ณ ๋ คํ ์๋ฒ/DB ์ํคํ
์ฒ๋ฅผ ์ค๊ณํ๊ณ ๊ตฌ์ถํด ๋ณผ ์ ์์๋ค.
1.1. ๊ธฐ์ ์คํ ์ ํํ๊ธฐ
ํ๋ก ํธ์๋ ํํธ์์ ์ ์ ๋ ๊ธฐ์ ์คํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- TypeScript/ReactJS
- React-Router
- Styled-Components
- Zustand
๋ฐฑ์๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํํธ์์ ์ต์ข ์ ์ผ๋ก ์ ํํ ๊ธฐ์ ์คํ์ ๋ค์๊ณผ ๊ฐ๋ค.
- TypeScript/Nest.js
- Socket.io
- TypeORM/MySQL
- (+) Redis
์ฐ์์A์ ๋ฐฑ์๋ ๊ธฐ์ ์คํ ์ ํ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ๋๋์ด๋ณธ ๊ฒฐ๊ณผ ๊ณตํต์ ์ผ๋ก ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ ๋ํ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์์๋ค. ํ์ง๋ง ๋์ ์ฐ์์A ๋ชจ๋ Node.js์ Express์ ์ฃผ๋ก ํ์ฉํด์๋๋ฐ ์ฐ๋ฆฌ๊ฐ ์ต์ํ๊ฒ ์ฌ์ฉํ๋ JavaScript๋ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ค๊ณํ๊ธฐ์๋ ๊น๋ค๋ก์ด ๋ถ๋ถ๋ค์ด ์๋ค. ๋ฐ๋ผ์, ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฌธ๋ฒ๊ณผ ๊ตฌ์กฐ๋ฅผ ์ง์ํ๋ TypeScript๋ฅผ ํ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค. ์ฒ์์๋ ๋ํ์ ์ธ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ธ Java๋ฅผ ๊ณ ๋ คํด๋ณด๊ธฐ๋ ํ์ง๋ง ์งง์ ๊ธฐ๊ฐ ๋ด์ ์๋ก์ด ์ธ์ด์ ํ๋ ์์ํฌ๋ฅผ ์ตํ ํ์ฉํ๋ ๊ฒ์ ์์ฑ๋ ์๋ ๊ฒฐ๊ณผ๋ฌผ์ ๋์ถํด์ผํ๋ ํ๋ก์ ํธ์ ํน์ฑ ์ ํ๊ณ๊ฐ ์์ ๊ฒ์ด๋ผ๊ณ ํ๋จํ๋ค. TypeScript๋ ๊ธฐ๋ณธ์ ์ผ๋ก JavaScript๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด๊ฒ ์ตํ๊ณ ํ์ฉํ๊ธฐ์ ์ ํฉํ์ผ๋ฉฐ, ํ์ ์์คํ ์ผ๋ก ์๋ฌ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ ์ฌ์ ์ ๋ฐฉ์งํ๋ ๋ฑ์ ์ฅ์ ๋ ์๋ค. ๋ฐฑ์๋ ํ๋ ์์ํฌ๋ TypeScript์ ๊ถํฉ์ด ์ข์ NestJS๋ฅผ ์ ํํ๋ค. NestJS๋ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ค์นํ๋ฉฐ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค๋ Node.js์ ์ฅ์ ์ ๊ทธ๋๋ก ๊ฐ์ง๋ฉด์ ๋ชจ๋/์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ ์ ์๋ค. ์ด๋ํ ๊ฒฐ๊ตญ์ ์๋ฒฝํ ๊ฐ์ฒด ์งํฅ์ ์ํ ์ ํ์ด์๋ ๊ฒ์ด๋ค. '์ง๊ธ๊ฐ๊ฒ' ์๋น์ค์ ๊ฒฝ์ฐ '์ค์๊ฐ์ฑ'์ด ๊ฐ์ฅ ํต์ฌ์ ์ธ ๊ตฌํ ์์์ด๊ธฐ ๋๋ฌธ์ ์๋ฐฉํฅ ํต์ ์ ํตํ ์ค์๊ฐ ์์ฒญ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ์น์์ผ์ผ๋ก Socket.io๋ฅผ ํ์ฉํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฝ์ฐ ๊ด๊ณํ DB์ธ MySQL์ ์ฌ์ฉํ๋ TypeORM์ผ๋ก ๋งคํํ ์์ ์ด๋ค.
1-2. AWS ๋์ฉ๋ ์ํคํ
์ฒ ๊ตฌ์ฑํ๊ธฐ
์ต์ข ์ ์ผ๋ก ๊ตฌ์ฑ๋ AWS ์์คํ ๊ตฌ์ฑ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- Amazon S3/CloudFront
- Amazon EC2/ELB/NatGateway
- Amazon AutoScalingGroup
- Amazon Route53/CertificateManager
- Amazon RDS/ElasticCacheForRedis
์๋ฒ ์ํคํ ์ฒ๋ ๋์ฉ๋ ํธ๋ํฝ๊ณผ ๋ณด์, ๊ณ ์ฑ๋ฅ์ ๊ณ ๋ คํ ๊ตฌ์ฑํด๋ดค๋ค. ์๋ง์์ ํ๋ณ๋ก ํด๋ผ์ฐ๋ ์ง์๊ธ์ ์ง๊ธํ๊ธฐ ๋๋ฌธ์ AWS ํ๊ฒฝ์ ์ง์ ๊ตฌ์ถ๋ ํด๋ณผ ์ ์์๋ค. ์ฐ์ ์ฐ์์A์ ํจ๊ป ๋ฉํ ๋A์ ๋์์ ๋ฐ์ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉ๋ ์คํ๊ณผ ๋์ผํ๊ฒ ์ฐ์ต์ฉ ํด๋ผ์ฐ๋ ํ๊ฒฝ ๊ตฌ์ถ ์ค์ต์ ์งํํ๋ค. ํด๋ผ์ด์ธํธ ์ธก์ S3๋ฅผ ์ฌ์ฉํ์ฌ ์น์ฌ์ดํธ๋ฅผ ํธ์คํ ํ๊ณ , ์ด์ ์ ์ก ์๋์ ๋ณด์์ฑ์ ๋์ด๊ณ ์ CDN ์๋น์ค์ธ Cloudfront๋ฅผ ๋ง๋ถํ๋ค. ์๋ฒ ์ธก์ ๋ ๊ฐ์ EC2 ์ธ์คํด์ค์ ELB๋ฅผ ํ์ฉํ์ฌ ๋ถ์ฐ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ค. ์ด๋, ๋ณด์์ ๊ณ ๋ คํ์ฌ ๋ ๊ฐ์ EC2 ์ธ์คํด์ค๋ ๋ ๊ฐ์ ๊ฐ์ฉ์์ญ ๋ด ๊ฐ๊ฐ์ ํ๋ผ์ด๋น ์๋ธ๋ท ์์ญ์ ์์น์ํค๊ณ , ์ธ๋ถ ์ธํฐ๋ท ํต์ ์ ์ํ Nat Gateway์ ํ๋ผ์ด๋น ์ธ์คํด์ค ์ ๊ทผ์ ์ํ bastion host๊น์ง ๊ตฌ์ถํ๋ค. ์ด๋ค์ Auto Scaling Group์ผ๋ก ์ธ์คํด์ค ์์ ํฌ๊ธฐ๊ฐ ์๋์ผ๋ก ๊ด๋ฆฌ๋๋ค. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฝ์ฐ RDS๋ฅผ ์ด์คํํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฅ์ ๋ฑ์ ๋๋นํ๊ณ , ์ฝ๊ธฐ ์ ์ฉ ๋ณต์ ๋ณธ(Replica)์ผ๋ก ๋ถ์ฐ DB๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ ์ฑ๋ฅ์ ๋ํ๋ค. ๋ง์ง๋ง์ผ๋ก ๋ฐ์ดํฐ ์บ์ฑ๊ณผ ๋ฉ์์ง PUP/SUB์ ์ง์ํ๊ธฐ ์ํ ElastiCache for Redis๋ฅผ Master-Slave ๊ตฌ์กฐ๋ก ์ด์คํํ๋ค.
2. ์คํ๋ฆฐํธ ์์
์ฒซ ์คํ๋ฆฐํธ๊ฐ ์์๋์๋ค. ๋จผ์ , Jira ํ ํ์ด์ง์ ์ ๋ฐ์ ์ ๋ก๋๋งต๊ณผ ๋ฐฑ๋ก๊ทธ๋ฅผ ์ ์ํ ํ ๋ด๋น์๊น์ง ์ง์ ํด์ ๋ฑ๋กํ์๋ค. ์ด์ ๊น์ง๋ ์ค๊ตฌ๋๋ฐฉ์ผ๋ก ํ ์ผ์ ์ ์ํ๊ณ , ์๋ฌด๋ ํด๋น ์ผ์ฒ๋ฆฌ๋ฅผ ์งํํ๋ค๋ฉด ์ ์์ผ(์คํฌ๋ผ) ๊ฐ๋ฐ ๋ฐฉ์ ๋์
ํ์๋ ๋ฅ๋ฅ ์ด ํ์คํ ์ฌ๋๋ค. ์ฐ์ , ์คํ๋ฆฐํธ์ ๋ฐฑ๋ก๊ทธ๋ฅผ ํ์คํ๊ฒ ์ ์ํ๊ณ ์ด๋ฅผ ๊ธฐ๋ก์ผ๋ก ๋จ๊ฒจ๋๊ฒ ๋์ด ํ๋ก์ ํธ ์งํ ํํฉ์ด๋ ๋ด๊ฐ ํด์ผํ ์ผ์ ํ๋์ ํ์ธํ ์ ์์๊ณ , ์คํ๋ฆฐํธ ๊ธฐ๊ฐ์ด ์ ํด์ ธ ์๋ค ๋ณด๋ ์์
๋ค์ด ๋ค๋ก ๋ฐ๋ฆฌ์ง ์๊ณ ์ฒด๊ณ์ ์ผ๋ก ๋ง๋ฌด๋ฆฌ๊ฐ ๋๋ค๋ ๋๋์ ๋ฐ์๋ค. ๋, ์ค๊ฐ์ค๊ฐ ๋ฐ์ํ๋ ์ด์๋ค์ ๋ํด ์ผ์ ๋๋ ์ด ์์ด ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์๋ค.
2-1. Socket.io๋ฅผ ํ์ฉํ ์ฑํ ๋ฐฉ ๋ง๋ค์ด๋ณด๊ธฐ
๋์ ์ฐ์์A ๋ชจ๋ Socket.io์ ๊ฐ์ ์น์์ผ์ ์ฒ์ ์ฌ์ฉํด ๋ณด์๋ค. ์์ธํ ํต์ ๋ฐฉ๋ฒ์ด๋ ์ฌ์ฉ๋ฒ์ ๋ํ ์ดํด๋ ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ Socket.io๋ฅผ ๋ณธ ํ๋ก์ ํธ์ ๋ฐ๋ก ์ ์ฉํ๋ ๊ฒ์ ๋ฌด๋ฆฌ๊ฐ ์๋ค๊ณ ํ๋จํ๋ค. ๋ฐ๋ผ์, ์คํฐ๋๋ฅผ ํตํด ์น์์ผ(Socket.io)์ ๋ํ ๊ธฐ๋ณธ์ง์ ๋ฐ ๊ฐ๋ ์ ๊ณต๋ถํ๊ณ , ์ฑํ ๋ฐฉ์ ๊ตฌํํ๋ ๋ฏธ๋ ํ๋ก์ ํธ๋ฅผ ๊ฐ์ธ์ ์ผ๋ก ์งํํด ๋ณด๊ธฐ๋ก ํ๋ค. ์คํฐ๋๋ Socket.io ๊ณต์๋ฌธ์(https://socket.io)์ ์ ํ๋ธ ๊ฐ์ ๋ฑ์ ํ์ต์๋ฃ๋ก ๊ณต๋ถํ ํ ๊ทธ ๋ด์ฉ์ ๋ ํผ๋ฐ์ค์ ํจ๊ป ๋ ธ์ ์ ์ ๋ฆฌํด์ ๊ณต์ ํ๋ค. ์ดํ ์์ผ ํต์ ์ ๊ตฌํํ ์ ์๋ ๋ํ ์์ ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ฑํ ๋ฐฉ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ค. namespace์ room์ ๊ฐ๋ , ๊ทธ๋ฆฌ๊ณ ๋ฐํ(Publish)์ ํด๋นํ๋ emit๊ณผ ๊ตฌ๋ (Subscribe)์ ํด๋นํ๋ on ๊ธฐ๋ฅ์ ํ์ฉํ๋ค. ๋ฐฑ์๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํํธ ๋ํ ๊ณต์ ๋ฌธ์ ๋ฑ์ ํ์ฉํด NestJS์ TypeORM/MySQL๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ตํ ์ ์ฉํ๋ค.
https://github.com/J1Yun/simple-chatting-web
2-2. JWT์ Passport๋ฅผ ํ์ฉํ ๋ก๊ทธ์ธ ์ธ์ฆ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
๋ณธ๊ฒฉ์ ์ธ MVP ๊ฐ๋ฐ์ ๋ค์ด๊ฐ๊ธฐ ์ด์ ์ ๋จผ์ ์๋น์ค ๋ก์ง๊ณผ ๊ด๊ณ์๋ ๋ก๊ทธ์ธ ์ธ์ฆ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ๋ก ํ๋ค. ๊ธฐ์กด์ ํ ์ด ํ๋ก์ ํธ๋ฅผ ์งํํ ๋๋ ์ฃผ๋ก ์ฟ ํค์ ์ธ์ ์ ํตํด ์ธ์ฆ ๊ธฐ๋ฅ์ ๊ตฌํํด์์ง๋ง ์ด๋ฒ์๋ ํ์ฅ์ฑ์ ๊ณ ๋ คํด ํ ํฐ ๊ธฐ๋ฐ์ ์ธ์ฆ ๋ฐฉ์์ ์ฑํํ๋ค. ๊ทธ ์ค์์ ๊ฐ์ฅ ๋ํ์ ์ธ JWT ํ ํฐ์ ํ์ฉํด ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ค. ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์๋ฒ๋ JWT ํ ํฐ์ ๋ฐ๊ธํด ์ด๋ฅผ ํด๋ผ์ด์ธํธ์์ ๊ด๋ฆฌํ๋๋ก ๋๊ฒจ์ค๋ค. ํ ํฐ ์ธ์ฆ ๋ฐฉ์ ๋ฐ JWT์ ๊ด๋ จํ ์์ธ ๋ด์ฉ์ ๋ธ๋ก๊ทธ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋ฉด ๋๋ค. JWT์ ๋๋ถ์ด Passport.js๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํจ๊ป ์ฌ์ฉํ๋ค. Passport.js JWT ํ ํฐ์ผ๋ก '์ธ์ฆ'์ ์ํํ ์ ์๋๋ก ํ๋ Node.js์ ๋ฏธ๋ค์จ์ด์ด๋ค. passport์๋ ์ฌ๋ฌ strategy(์ ๋ต)์ด ์๋๋ฐ ๋จ์ํ JWT ํ ํฐ์ ์ฝ์ด์ ์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋๋ก ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด JwtStrategy๋ฅผ ์์ฑํ๋ค. ์ด์ํจ๊ป @UseGuards() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ํตํด ์ฌ์ฉ์ ์ ๋ณด ํ์ธ์ด ํ์ํ API ํธ์ถ ์ ์ธ์ฆ ๊ณผ์ ์ด ์ํ๋๋๋ก ๊ตฌํํ๋ค.