๐ Stalk Project๋ฅผ ์๊ฐํฉ๋๋ค.
Stalk ํ๋ก์ ํธ๋ฅผ ์๊ฐํ๊ณ , ํ๋ก์ ํธ์ ์ด์๋ค์ ๋ชจ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๐ฑ ๊ฐ์
์ฌ๋ฌ ์ฆ๊ถ์ฌ์ ์ข ๋ชฉ ํ์ ๋ฐ ์ต๋ 5๋ ๊ฐ์ ๊ฐ์ฅ๊ฐ, ์ข ๊ฐ, ์ ๊ฐ, ๊ณ ๊ฐ ๋ฑ ์ธ๋ถ ์ ๋ณด ์ ๊ณต๊ณผ ํฌ์์ ๊ฐ ์ธ์ฌ์ดํธ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ ์ปค๋ฎค๋ํฐ ํ๋ก๊ทธ๋จ์ ๋๋ค.
Stalk ํ๋ก์ ํธ๋ MSA ํ๊ฒฝ์ ๊ธฐ๋ฐ์ผ๋ก ๊ธฐํ๋ ํ๋ก์ ํธ์ ๋๋ค.
๊ธฐ์กด Tosstock ํ๋ก์ ํธ์์ MSA๋ก ๋ง์ด๊ทธ๋ ์ด์ ๋ฐ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ์ ์์๋์์ต๋๋ค. ์ฌ์ค Tosstock ํ๋ก์ ํธ๋ User, Post, Newsfeed, Stock ์ ๋์ ํฐ ๋๋ฉ์ธ์ ๊ฐ์ง๊ณ ์์ด MSA๋ก ํ์ฅํ ์ฌ์ด์ฆ์ ํ๋ก์ ํธ๋ ์๋๋๋ค.
ํ์ง๋ง Stalk ํ๋ก์ ํธ์๋ ์์ผ๋ก ๊ธฐํํ๊ณ ์๋ ๊ฐ ์ฆ๊ถ๋ง๋ค ์ค์๊ฐ์ผ๋ก ์ฌ๋๋ค๊ณผ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋จ์ฒด ์ฑํ
๊ฐ์ ๊ตต์งํ ๊ธฐ๋ฅ๋ค์ ์ง์์ ์ผ๋ก ๊ฐ๋ฐํ ์์ ์
๋๋ค. ๊ฐ์ธ ํ๋ก์ ํธ์ด๊ธฐ์ ํธ๋ํฝ ๊ฑฑ์ ์ ์์ง๋ง, ๋๋ฉ์ธ๋ณ๋ก ๊ฐ๊ฐ ํน์ง๊ณผ ๊ธฐ์ ์ ์ ๋ณด์ฌ์ค ์ ์๋ ๊ฐ๋ณ์ ์ธ ํ๋ก์ ํธ๊ฐ ๋๋ค๋ ๋ชฉ์ ์ผ๋ก MSA๋ฅผ ์ ์ฉํด๋ณด๊ฒ ๋์์ต๋๋ค.
Stalk ํ๋ก์ ํธ์ 1์ฐจ ๋ชฉํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Main Branch Merge๋ง๋ค ๊ฐ์ธ ์๋ฒ์์ ๋ฐ๋ก ์คํํ ์ ์๋ CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
- MSA ํ๊ฒฝ์ ๊ตฌ์ฑํ์ฌ User, Post, Newsfeed, Stock ๋๋ฉ์ธ ๋จ์๋ก ๋ถ๋ฆฌ
- ์ค์ ์๋น์ค๋๊ณ ์๋ ์ฌ๋ฌ ๋น์ฆ๋์ค ๊ตฌ์ฑ์ ๊ธฐ๋ฐ์ผ๋ก API ์ ๊ณต
- ๊ฐ์ข ๋ชจ๋ํฐ๋ง, MSA ๋ก๊น ๋ฑ์ ํด ์ฌ์ฉ
- Java -> Kotlin ๋ง์ด๊ทธ๋ ์ด์
๊ฐ์ฅ ํฐ ๋ชฉํ๋ ์ฌ๊ธฐ์ ๊ฐ๋ฐํ ๋ชจ๋ ์ง์๋ค์ ์ ๊ฐ ์ถฉ๋ถํ ๊ณ ๋ฏผํ๊ณ ์ ์ฉํด๋ณด๋ ๊ฒ์
๋๋ค. ๊ฐ๋ฐ์๋ ์ ๋์ ์ธ ๊ธฐ์ , ์ํํ
์ด ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ๊ณ ๊น๊ฒ ์๊ฐํ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๊ฐ๊ณ ์ถ์ต๋๋ค. ๐ช๐ป
๐ฑ 1์ฐจ ํ๋ก์ ํธ ๊ตฌ์ฑ์
ํ์ ์์๋ ๋ฌด์์ ํ๋ก์ ํธ ๋ง๋ค์!! ๊ฐ ์๋๋ผ ๋๋ฃ๋ค๊ณผ ์ถฉ๋ถํ ํ์ ๋์ ์์ ์ ์ฐ์ ์์๋ฅผ ๋๊ณ ์งํํด์ผํฉ๋๋ค. ํ๋์ ํ๋ก์ ํธ ์์์ ๊ณ ๋ฏผํด์ผํ ๊ฒ๋ค์ด ์ธํ๋ผ, ํ๊ฒฝ ๋ฑ์ ํจ๊ป ๊ณ ๋ คํ๋ฉด์ ์ฐ์ ์์๋ฅผ ๋๊ณ ์ด๊ธฐ ๊ณํ ๋ฐ ๊ตฌ์ฑ์์ ์ธ์ ํ๋ก์ ํธ๋ฅผ ์์ํ๊ณ ์ ํฉ๋๋ค. (์ด๊ธฐ์ ์ธ์๋ ๊ณํ์ด ์ดํ์ ์์ฑ๋ ํ๋ก์ ํธ์ ๊ตฌ์ฑ๊ณผ ์ผ๋ง๋ ์ฐจ์ด์ ์ด ์๋์ง ๋น๊ต ๋ถ์ํด๋ณด๊ณ ์ค์ค๋ก๋ฅผ ๋ณด์ํ๊ณ ์ ํฉ๋๋ค.)
์ด๋ฏธ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ํด ๋ง๋ค์ด์ง ํ๋ก์ ํธ๋ ์์ด, ์ด๊ธฐ์ ์ด๋ค ์ธํ ๊ณผ ์์ ์ ์ฐ์ ํ ์ง๊ฐ ๊ณ ๋ฏผ์ด์์ต๋๋ค. ํนํ, MSA๋ฅผ ๋์ ํ๊ฒ ๋๋ฉด์ ๊ธฐ์กด์ ๋ฐ๋ก ๋ชจ๋๋ฆฌ์์ผ๋ก ๋ง๋ค์๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ์๊ฐ์ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๊ฐ ๋์ ๋ค์๊ณผ ๊ฐ์ ํฐ ์ฃผ์ ๋ค์ ์์๋ก ๊ฐ๋ฐ์ ์งํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
- CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ
- ๋ก์ปฌ์์๋ง ํ ์คํธํ ๊ฒ์ด ์๋๋ผ ๊ตฌํํ ์๋น์ค๋ค์ด ํด๋ผ์ฐ๋ ๋ฑ์์ ์ ์์ ์ผ๋ก ๋์ํ๋์ง ์ฃผ๊ธฐ์ ์ธ ํ์ธ์ด ํ์ํ๋ค๊ณ ํ๋จ
- ๋น์ฆ๋์ค ๋ก์ง์ด ๊ฑฐ๋ํด์ง๋ง ๊ทธ๋งํผ CI/CD ํ์ดํ๋ผ์ธ์์๋ ๊ณ ๋ฏผํ๊ฒ ๋ง์์ง๊ฒ ๋๋๋ฐ, ๋์ค์ ์๋น์ค๋ค์ด ์ฝํ์ ๋ญํจ๋ฅผ ๋ณด๊ฒ ๋ ์๋ ์๊ฒ ๋ค๋ ์๊ฐ
- ์ง๊ธ์ ํ๋์ ์๋ฒ์์ Docker network๋ฅผ ๊ตฌ์ฑํ์ฌ ์ปจํ ์ด๋ ๊ฐ IP ํต์ ์ ํด์ ์๋ฒ ๋น์ฉ์ด ๋ค์ง๋ ์์ง๋ง, ์ดํ CI/CD ํด๋ง๋ค ํด๋ผ์ฐ๋ ์๋ฒ๋ฅผ ๋๊ณ ๋์์ํค๊ฒ ๋ ๋ ๋ฐ์ํ๊ฒ ๋ ์๋ฒ ๋น์ฉ์ด ๋จ์
- MSA ํ๊ฒฝ ๊ตฌ์ฑ
- CI/CD ๊ตฌ์ฑ๊ณผ ๋น์ทํ ์ด์ ๋ก 2๋ฒ์งธ์ ์์ ์งํ
- ๊ฐ ๋๋ฉ์ธ ๋ฐ ๋น์ฆ๋์ค ๋ก์ง ๊ตฌํ
์ด๋ฐ ํฐ ํ์ ๋๊ณ ๊ฐ๋ฐ ๊ณํ์ ์ธ์ ์ต๋๋ค.
๐ฅ ํ๋ก์ ํธ ์์ ์ค๊ณ
CI / CD
- Jenkins๋ ๋ชจ๋ Spring ์๋ฒ์ CI/CD ์๋ ํํฉ์ ํ๋์ ํ์ ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- Ansible๋ ์ง์ ๋ ๊ฐ๊ฐ ๋ค์คํ๋ ๋๋ฉ์ธ ์๋ฒ(docker container)์ ๋ฐฐํฌ ์์ ์ ์๋ํํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ํด๋ค๋ก Jenkins์ Ansible์ ์ฌ์ฉํ๋ ค ํฉ๋๋ค. Jenkins๋ CI(Continuous Integration)๊ณผ CD(Continuous Delivery)๋ฅผ ๋ด๋นํ ์์ ์ด๋ฉฐ, Ansible๊ฐ CD(Continuous Deploy)๋ฅผ ๋ด๋นํ ์์ ์ ๋๋ค.
Server Architecture
- API Gateway๋ ๋ถ์ฐ๋ ๋๋ฉ์ธ API ์์ฒญ์ ํ๋๋ก ๋ชจ์ผ๋ ์ญํ ๊ณผ ์ธ๊ฐ๋ฅผ ๋ด๋นํฉ๋๋ค.
- Eureka๋ ๋ฐฐํฌ๋ ์๋ฒ IP์ Port๋ฅผ ํ์ธํ๊ณ ๊ฐ๋จํ ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- Config๋ ๊ฐ Spring ์๋น์ค์ ์ค์ ํ์ผ์ ๊ด๋ฆฌํ๊ณ ์๋ํํฉ๋๋ค.
์๋ฒ ์ํคํ ์ฒ๋ก๋ API Gateway, Eureka, Config๋ฅผ ์ฌ์ฉํ์ฌ MSA ์ํคํ ์ฒ ๊ตฌ์ฑ์ ์ต๋ํ ๋จ์ํํ์์ต๋๋ค.
Infra
- MySQL์ ๊ธฐ๋ณธ์ ์ธ RDB๋ก ์ฌ์ฉ๋์ด์ง ์์ ์ ๋๋ค.
- Redis๋ ๋ก๊ทธ์ธ ๋จ๊ณ์์ Session / Token ์คํ ๋ฆฌ์ง๋ก ์ฌ์ฉ๋์ด์ง ์์ ์ ๋๋ค.
- RabbitMQ๋ Spring Config์์ ์ค์ ํ์ผ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์ด ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๋, RabbitMQ์ broadcast ๋ฐฉ์์ผ๋ก ๋ชจ๋ Spring ์๋น์ค์ ์ ๋ฐ์ดํธ๋ ์ค์ ํ์ผ์ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํ๋๋ก ์ฌ์ฉ๋ ์์ ์ ๋๋ค.
- Kafka๋ ๋ด์คํผ๋ ์์คํ , ๋๋ฉ์ธ ์๋น์ค ๋ฉ์์ง ๋ธ๋ก์ปค ๋ฑ์ ์ฌ์ฉ๋์ด์ง ์์ ์ ๋๋ค.
๐ฑ ์ ๋ฆฌ
๋ง์ ๊ธฐ์ ์ด ๋ค์ด๊ฐ๋งํผ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ํํ ํ์ง ์๋๋ก ํด์ผํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฐ ์๋น์ค๋ค์ ๊ตฌํํด๋๊ฐ๋ฉด์ ์ด๋ป๊ฒ ๊ตฌํํ๊ฒ ๋์๋์ง, ์ ๊ตฌํํ๋์ง, ํธ๋ฌ๋ธ ์ํ ๋ฑ์ ์ฌ๋ก๋ค์ ์๊ฐํ ์๊ฐ์ ๊ดํ ์ค๋ ๋ ํ๋ฃจ์ ๋๋ค.
๐ง๐ปโ๐ป Stalk ํ๋ก์ ํธ์ ๋ค์ํ ์ด์ผ๊ธฐ
- ์๊ธฐ์๊ธฐํ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์๋ฒ ๊ตฌ์ถ
- Jenkins & Ansible์ ํ์ฉํ CI/CD ๊ตฌ์ถ๊ธฐ
- Spring Cloud Config๋ก ๋ถ์ฐ๋ ๋ง์ดํฌ๋ก ์๋น์ค ์ค์ ์ค์ ๊ด๋ฆฌ
Service Discovery๋ก ๋ง์ดํฌ๋ก ์๋น์ค ์ฃผ์ ๊ด๋ฆฌํ๊ธฐ
- JPA์ N + 1 Query issue ์ฑ๋ฅ ๊ฐ์ ์ฌ๋ก
- @Async์ ํ์ฉํ ์ด๋ฉ์ผ ์์ API ๊ฐ์ ๋ฐฉ์
- JPA ๋ณ๊ฒฝ๊ฐ์ง vs QueryDSL : ํ์ ์ ๋ณด ์์ ์ต์ ํ ๋ฐฉ์