๋์ผ๋ฆฌ๋ ํฉ์ด์ ธ ์๋ ๋์ผ ๋ผ์ดํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ๋ฟ๋ง ์๋๋ผ ๋น์ง ๊ฑฐ๋๋ฅผ ํตํด ๋์ผ ๋ผ์ดํ ์คํ๊น์ง ๋์ฐ๋ฉฐ ๋น์ง ๋ฌธ์ ๊น์ง๋ ํด๊ฒฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ ํ๋ซํผ์ ๋๋ค.
ํต์ฌ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋น ์ง ๊ฒ์๊ธ์ ์์ฑํ๊ณ ์กฐํ
- ๋น ์ง ๊ฒ์๊ธ์ ํตํ ๊ฑฐ๋
- ๋์ผ ๋ผ์ดํ์ ๊ด์ฌ ์๋ ์ฌ์ฉ์๋ค๊ฐ์ ์ปค๋ฎค๋ํฐ
Springboot(Java)
๋ฅผ ์ด์ฉํ API ์๋ฒ๋ฅผ ๊ฐ๋ฐํ์๊ณ , JPA(ORM)
๊ณผ MySQL
์ ์ด์ฉํ CRUD ๊ตฌํํ์์ต๋๋ค.
AWS EC2
๋ฅผ ์ด์ฉํด ์๋ฒ๋ฅผ ๋ฐฐํฌํ์๊ณ , AWS RDS
๋ฅผ ์ด์ฉํด DB ์๋ฒ๋ฅผ ๊ตฌ์ฑํ์์ต๋๋ค.
AWS S3
๋ฅผ ์ด์ฉํด ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ์์ต๋๋ค.
Redis
๋ฅผ ์ด์ฉํด ์ธ์ฆ์ ์ํ ํ ํฐ ์ ๋ณด์ ์ธ์ฆ์ฝ๋ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ์์ต๋๋ค.
Prometheus
๋ฅผ ์ด์ฉํด ์๋ฒ์ ๋ฐ์ดํฐ ๋ก๊ทธ๋ฅผ ์์งํ๊ณ , Grafana
๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ์์ต๋๋ค.
Docker
๋ฅผ ์ด์ฉํด EC2 ์๋ฒ ๋ด์์ API ์๋ฒ, Redis, Prometheus, Grafana๋ฅผ ์ปจํ
์ด๋ํํ์ฌ ๊ตฌ์ถํ์์ต๋๋ค.
ํ์
๋ฐ ์ฝ๋ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ํด github
์ ์ด์ฉํ์์ผ๋ฉฐ, API ๋ฌธ์ํ ๋๊ตฌ๋ก Spring Rest Docs
๋ฅผ ์ฌ์ฉํ์์ต๋๋ค.
์๋ ๋ฐฐํฌ๋ฅผ ์ํด github actions
๋ฅผ ์ด์ฉํ์์ต๋๋ค.
- JWT ํ ํฐ + Spring Security ๋ฅผ ์ด์ฉํ ์์ ๋ก๊ทธ์ธ ( kakao )
- ๋น ์ง ๊ฒ์๊ธ ์์ฑ| ์์ธ์กฐํ | ๋ชฉ๋ก์กฐํ
- ํ๊ธฐ ๊ฒ์๊ธ ์์ฑ| ์์ธ์กฐํ| ๋ชฉ๋ก์กฐํ
- ์ง์ญ ๊ฒ์๊ธ ์กฐํ
- ์ฌ์ฉ์ ์ ๋ณด ์กฐํ
- ์ ํ๋ฒํธ ์ธ์ฆ
- ์ด๋ฏธ์ง ์ ๋ก๋| ์ญ์
- ๊ฑฐ๋ ์์ฑ| ๊ฑฐ๋ ์๋ฃ
์์คํ
์ํคํ
์ฒ๋ ๋์ผ๋ฆฌ
์น ์์คํ
์ ๋ํ ์ํคํ
์ฒ์
๋๋ค. ํด๋น ์ํคํ
์ฒ๋ ์ฌ์ฉ์๊ฐ ์์คํ
์ ์ด์ฉํ๋ ๋ฐ ์ฌ์ฉ ๋๋ ํต์ฌ ์ปดํฌ๋ํธ๋ง์ ๋ด์์ต๋๋ค.
์ฌ์ฉ์๋ HTTPS ํ๋กํ ์ฝ์ ํตํด ์์ฒญ๊ณผ ์๋ต์ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ, ํ๋ก ํธ์๋๋ ๋ฒ์
์ ํตํด ๋ฐฐํฌํ์์ต๋๋ค. ๋ฒ์
์ REST API ์๋ฒ์ธ Spring APP๊ณผ ํต์ ์ ํฉ๋๋ค.
API ์๋ฒ๋ฅผ ๋น๋กฏํ ์บ์ฑ์ฉ ์๋ฒ์ธ Redis, ๋ฐ์ดํฐ ๋ก๊ทธ ์์ง์ ์ํ Prometheus, ๋ฐ์ดํฐ ์๊ฐํ๋ฅผ ์ํ Grafana ๊ฐ Docker ์ปจํ
์ด๋๋ก EC2 ์์ ๊ตฌ๋ ์ค์
๋๋ค.
DB ์๋ฒ๋ AWS์ RDS๋ฅผ ํตํด ๊ตฌ์ถํ์๊ณ , ์ธ์ฅ ์คํ ๋ฆฌ์ง๋ก S3 ๋ฒํท์ ์ฌ์ฉํ์์ต๋๋ค.
- ๋ก์ปฌ
feature
๋ธ๋์น ( Dual-# )์์ origin์feature
๋ก push - origin์
feature
๋ธ๋์น์์ origin์develop
๋ธ๋์น๋ก push - github actions CI/CD ์คํ
A. Java 11 ๋ฒ์ ์ค์น
B. Gradle ์บ์ฑ
C. Gradle ๊ถํ ๋ถ์ฌ
D. DB, Redis, aws ๋ฑ ์ ๋ณด๋ฅผ ๋ด์ application-secret.yml ํ์ผ ๊ฐ ์ธํ
E. jar ํ์ผ ์์ฑ
F. Dockerfile ๋น๋ ๋ฐ Docker hub ๋ก push
G. AWS EC2์ deploy
๊ฐ์ฅ ์ต๊ทผ ๋ฐฐํฌ ์๊ฐ ๊ธฐ์ค,1๋ถ 19์ด
์์.
์คํ์์ ์ ์์คํ ๊ตฌ์ฑ์ ๋ํ๋ธ ๊ทธ๋ฆผ์ ๋๋ค. ์ค์ ์ฌ์ฉ์์์๋ถํฐ ๋ฐ์ดํฐ๊ฐ ํ๋ฌ๊ฐ๋ ํ๋ฆ์ ํ์ ํ ์ ์์ต๋๋ค.
Backend ๋ด ํ๋ก์ ํธ ๊ตฌ์ฑ์ ๋๋ค. ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Security config, Controller, Service, Repository, Domain ๊ตฌ์ฑ์ ๊ฐ๊ณ ๋ถ๊ฐ์ ์ธ ์์๋ค์ ๋ฐ๋ก ํ๊ธฐํ์ง ์์์ต๋๋ค.
ํ์ฌ ๋์ผ๋ฆฌ ์์คํ
์ ์ธํ๋ผ ์ํคํ
์ฒ์
๋๋ค. ํด๋น ์ํคํ
์ฒ๋ ํ๋ฆฌํฐ์ด ๊ณ์ ์ผ๋ก ์ ํ๋ ๋ฆฌ์์ค๋ง์ ๊ฐ์ง๊ณ ๊ตฌ์ถํ๋ค๋ ์ ์ ๋ฏธ๋ฆฌ ์ํด๋ฐ๋๋๋ค.
์ฌ์ฉ์๋ Route 53 ( DNS )๋ฅผ ํตํด "duaily.net"์ผ๋ก ์ ์ํฉ๋๋ค. ํด๋น ๋๋ฉ์ธ์ผ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ํด ALB ( Application Load Balancing )์ด HTTPS๋ก forwarding ํฉ๋๋ค.
Public ์๋ธ๋ท์ ์กด์ฌํ๋ WAS ์๋ฒ๋ก ์์ฒญ์ด ๋ค์ด๊ฐ๋ฉด, ์๋ฒ ๋ด์ Spring boot ( 8080 ) ์ปจํ
์ด๋๊ฐ ์์ฒญ์ ๋ฐ์ ์ํํฉ๋๋ค. ํด๋น ์๋ฒ๋ EC2 ๋ด๋ถ์์ ๋์ปค ์ปจํ
์ด๋ ๊ฐ์ ๋คํธ์ํฌ๋ก Redis์ ํต์ ํ๋ฉฐ, RDS์๋ ๋ณ๋์ ๋ณด์ ๊ทธ๋ฃน์ ํ์ฑํ์ฌ ํต์ ํ๋๋ก ํ์์ต๋๋ค.
S3 ์ ๊ฒฝ์ฐ, ์ด๋ฏธ์ง ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๋ ์ฉ๋๋ก ๊ตฌ์ถํ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ก๊น ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ด์ ์์ ์ ๋๋ค.
ํด๋น ์ํคํ
์ฒ๋ ์์ผ๋ก ํ์ฅ์์ผ ๋๊ฐ ์๋น์ค๋ฅผ ์ํ ์ธํ๋ผ ์ํคํ
์ฒ์
๋๋ค.
WEB/WAS/DB 3 Tier ํํ๋ก ๊ตฌ์ถํ์ฌ ๊ฐ ๊ณ์ธต์ ๋
๋ฆฝ์ฑ์ ๋ณด์ฅํ๊ณ , ๋ณด์์ฑ์ ๊ณ ๋ คํด WAS, DB๋ private ์๋ธ๋ท์ผ๋ก ๊ตฌ์ฑํ ์์ ์
๋๋ค. ๋ํ, ํ๋ฆฌํฐ์ด ๊ณ์ ์ธ ์ ์ ๊ฐ์ํ์ฌ Auto-scaling ์ต์
๋์ EC2 ์ธ์คํด์ค๋ฅผ 1๋ ๋ ๋์ด WAS์ ๋ํด์ ์ด์คํ๋ฅผ ํ ์์ ์
๋๋ค. RDS๋ ๊ทธ๋๋ก MySQL ์ธ์คํด์ค๋ฅผ 2๋์ WAS๊ฐ ๊ฐ์ด ๋ง์ฃผ๋ณด๋ ์์ผ๋ก ๊ตฌ์ฑํ ์์ ์
๋๋ค.
AS-IS์์ ๋์ปค ์ปจํ ์ด๋๋ก ๊ตฌ์ถํ๋ Redis๋ฅผ ๋ณ๋์ Elastic Cache for Redis ์๋น์ค๋ฅผ ์ด์ฉํ ์์ ์ ๋๋ค. ( ํด๋น ์๋น์ค๋ ํ๋ฆฌํฐ์ด ๊ธฐ์ค ์ ํ๋ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ค๋ ์ ์์ ์ฒ์๋ถํฐ ๋์ ํ ๊ฒ์ธ์ง์ ๋ํด ๊ณ ๋ฏผํ์์ต๋๋ค. )
์ ๋ฆฌํ๋ฉด, EC2 ์ธ์คํด์ค๋ ์ด 3๊ฐ๊ฐ ํ์ํ๋ฉฐ, RDS๋ ๊ธฐ์กด ๊ทธ๋๋ก ์ ์งํ๋ Redis๋ง ๋ณ๋์ ์๋น์ค๋ฅผ ์ด์ฉํ ๊ฒ์
๋๋ค.
WEB ์๋ฒ์ ์ฌ๋ผ๊ฐ๋ ์์ง์ผ๋ก๋ Ngnix๋ฅผ ์ ํํ ์์ ์ด๋ฉฐ ๋ก๋๋ฐธ๋ฐ์ฑ, ๋ฆฌ๋ฒ์ค ํ๋ก์, ๊ฒฝ๋ํ ๋ฑ์ ์ด์ ๋ก ์ ์ ํ์์ต๋๋ค.
ํด๋น ๊ทธ๋ฆผ์ 1.0.0 release ์ QA ๋จ๊ณ์ Grafana ๋์๋ณด๋์
๋๋ค. Prometheus์ Grafana JVM ( Micrometer )๋ฅผ ์ด์ฉํด ์ฑ๋ฅ ์งํ๋ฅผ ํ์ธํฉ๋๋ค.
์์ฒญ์ ์ฒ๋ฆฌํ๋ ์๊ฐ๋, ๋ฐ์ ๋ก๊ทธ, ์ค๋ ๋์ ์ํ ๋ฑ์ ํ์ธํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
ํด๋น ๊ทธ๋ฆผ์ 1.0.0
release ์ QA ๋จ๊ณ์ ๋์๋ณด๋์
๋๋ค. ํ๋์ ํฌ์ธํธ๋ ์์
๋ก๊ทธ์ธ ์ ์์ฒญ๋๋ API ์๊ฐ๋์ ์์ฒญ ์, ์๋ต์ฝ๋๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋ฉ์ธ ํ์ด์ง ๋ก๋ฉ ์ดํ, ์์
๋ก๊ทธ์ธ์ ํตํ ํ์๊ฐ์
ํน์ ์ฌ์ฉ์์ ํ๋์ ํ์ธํ ์ ์๋ ์งํ๋ก ๋ฉ์ธ ํ์ด์ง ๋ก๋ฉ์ดํ ๋ก๊ทธ์ธ๊น์ง ๊ฐ๋ ์ฌ์ฉ์์ ์์ ๊ฑธ๋ฆฐ ์๊ฐ์ ํ์ธํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ์ธ ํ์ด์ง์์ ์ฌ์ฉ์๊ฐ ๋งค๋ ฅ์ ๋๋ผ๊ณ ๋ก๊ทธ์ธ๊น์ง ๊ฐ๋ ์๊ฐ๊ณผ ๊ทธ ์๋ฅผ ํตํด ๋์์ธ์ด๋ ์ ๊ณต๋๋ ๋ฐ์ดํฐ์ ๋ง์กฑ๋๋ฅผ ์ง์ํ ์ ์์ต๋๋ค. ์ด๋ ์๋น์ค ์ด์ฐฝ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ๊ฒ ํ์ธํด์ผ ํ๋ ํฌ์ธํธ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ก์ปฌ ๊ฐ๋ฐ ์, WiKi ํ์ด์ง ๋งํฌ์ ๊ฐ์ด๋๋ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์งํํ์ต๋๋ค.
๊ฐ๋ฐ ํน์ ํ๊ฒฝ ์ธํ
์ค์ ๋ฐ์ํ ์ด์ ๋ด์ฉ ๋ฐ ๋ ํผ๋ฐ์ค๋ฅผ ๊ฐ๊ฐ์ issue์ comment๋ก ๊ธฐ๋กํ๋ฉฐ ํ์๋ค๊ฐ์ ์ ๋ณด ๊ณต์ ๋ฅผ ํ์ฑํํ์์ต๋๋ค.
// ์์
feat: Create get all region posts API
- feat: ๊ธฐ๋ฅ ๊ตฌํ ์
- fix: ๋ฒ๊ทธ ์์ ์
- refactor: ๋ฆฌํํ ๋ง ์
- docs: API ๋ฌธ์ ์์ ์
- test: ํ ์คํธ ์ฝ๋ ์์ฑ ์
- chore: ํ๊ฒฝ ์ธํ ์์ ์
- ํ์ ์ ์ฒซ ๊ธ์๋ ๋๋ฌธ์๋ก ์์ํ๊ธฐ
- ๋ฉ์ธ์ง ๋ด์ฉ์ 50์ ์ด๋ด๋ก ์์ฑํ๊ธฐ
- ๋ฌธ์ฅ์ ๋์ฌ ์ํ์ผ๋ก ์์ํ๋ ๋ช ๋ น๋ฌธ ํํ๋ก ์์ฑํ๊ธฐ