๋๊ท๋ชจ ๋ชจ์์ ์ธ์๊ด๋ฆฌ, ์ผ์ ์กฐ์จ, ์ํต์ ํจ์จ์ ์ผ๋ก ๋์์ฃผ๋ MSA ๊ธฐ๋ฐ ๋ชจ์ ํตํฉ ๊ด๋ฆฌ ์๋น์ค
๊ฐ๋ฐ ๊ธฐ๊ฐ : 2025.04 ~ 2025.05
|
|
|
|
|
|
|---|---|---|---|---|
| ๊นํ์ฃผ | ๋ฐ์ฉํ | ์ต์ง์ | ๊น๋์ฐ | ๋ฐ๊ท์ |
| ๊ฒ์๊ธ, ์ผ์ | ์๋ชจ์, ์ธ์ | ํ์ | ์๋ฆผ, ๋ชจ์ | ์ฑํ , ๋๊ธ |
| Lead | Tech Lead | BE | BE | BE |
- ์๋น์ค URL : https://moim.agong.store
- API : (wiki์ ๋ฌธ์ํํ ์์ ์ ๋๋ค.)
๐งฉ ์๋ฒ ์ํคํ ์ฒ
ํ๋ก์ ํธ ๋ชฉ์
- ๋๊ท๋ชจ ๋ชจ์ ๊ด๋ฆฌ๋ฅผ ๋ณด๋ค ์ฝ๊ณ ํธํ๊ฒ ๋์์ฃผ๋ ์๋น์ค ์ ๋๋ค.
ํ๋ก์ ํธ ์ค๋ช
- ๋ชจ๋ ์ธ์์ด ๊ณต์ง๋ฅผ ํ์ธํ ์ ์๋๋ก ์ฃผ๊ธฐ์ ์ผ๋ก ์๋์ ๋ณด๋ด์ฃผ๊ณ , ์ ์ฐฉ์ ์ธ์ , ์ฑํ , ํฌํ ๋ฑ์ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ํตํด ๋ชจ์์ ๊ด๋ฆฌ๋ฅผ ์์ํ๊ฒ ํ ์ ์๋๋ก ์ง์ํด์ค๋๋ค.
ํ๋ก์ ํธ ๊ตฌ์ฑ
- ํ์, ์ธ์ , ์๋ฆผ, ์ฑํ , ๋ชจ์, ์๋ชจ์, ๊ฒ์๊ธ, ๋๊ธ, ์ผ์ ๋๋ฉ์ธ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ์๋น์ค ๊ฐ์ ํต์ ์ FeignClient๋ก ์ด๋ฃจ์ด์ง๋๋ค. ๋ํ Kafka๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ฑํ์์ผ๋ฉฐ, OpenTelemetry๋ฅผ ํตํ์ฌ ๋ชจ๋ ๋ก๊ทธ๋ค์ ํจ์จ์ ์ผ๋ก ์์งํ์์ผ๋ฉฐ, ๋ถ์ฐ์ถ์ ์ ์ํํ์๊ณ , Grafana๋ก ์๊ฐํ๋ฅผ ์งํํ์ฌ ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง์ ์งํํ์ต๋๋ค.
์ํคํ ์ณ ์ค๋ช
- MSA ๊ธฐ๋ฐ์ด๋ฉฐ, ๊ฐ ์๋น์ค ์ธ์คํด์ค๋ค์ AWS ECS ์์ ๋์ํฉ๋๋ค. ์ ํจ์ค๋ฅผ ํตํ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์์ต๋๋ค. RDB๋ MySQL์ ์ฌ์ฉํ์๊ณ , AWS RDS์ DB์๋ฒ๋ฅผ ๊ตฌ์ถํ์์ต๋๋ค. NoSQL์ธ Redis์ MongoDB๋ AWS EC2์ ๊ตฌ์ถํ์์ต๋๋ค. Kafka/Zookeeper, Prometheus, Grafana, Grafana Tempo, Grafana Loki, OpenTelemetry๋ AWS EC2์ ๋ฐฐํฌํ๊ฒฝ์ ๊ตฌ์ถํ์์ต๋๋ค.
-
ํ์:
- ํ์๊ฐ์ ์ด ๊ฐ๋ฅํฉ๋๋ค.username์ ์ ๋ํฌํ๋ฉฐ, password๋ ์ธ์ฝ๋ฉ๋์ด ์ ์ฅ๋ฉ๋๋ค.
- ๋ก๊ทธ์ธ/๋ก๊ทธ์์์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ก๊ทธ์ธ ์ JWT๋ฅผ ์ฟ ํค๋ก ๋ฐ๊ธํ๊ณ , ๋ก๊ทธ์์ ์ ์ฟ ํค๋ฅผ ๋ง๋ฃ์ํต๋๋ค.
- ๊ฒ์ดํธ์จ์ด๋ก๋ถํฐ ์ธ์ฆ ์์ฒญ์ด ๋ค์ด์ค๋ฉด, ๊ฒ์ฆ์ ์ํํ ๋ค Passport๋ฅผ ๋ฐ๊ธํฉ๋๋ค. Passport๋ ๊ฐ ์๋น์ค์์ ํ์ฌ ์์ฒญ์ ์ ์ ์ ๋ณด๋ก ํ์ฉ๋ฉ๋๋ค.
- ํ์ ์กฐํ, ์์ , ์ญ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
-
์ธ์ :
- ์ธ์ ์์ฑ/์์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์ธ์ ์ ์ฐธ์ฌ/๋๊ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- ์ธ์ ์์ฑ์ ํ๊ฒ ๋๋ฉด ๋ชจ์ - ๋งค๋์ ๊ฐ ์น์ธ์ ์์ผ ์ธ์ ์ ํ์ฑํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ค์์ ์ฌ์ฉ์๊ฐ ๋์์ ์ ์ฅํ ์ ์๋๋ก ๋ฃจ์์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์์์ฑ์ ์ ์ดํ๊ณ ์์ต๋๋ค.
-
์๋ฆผ:
- ๋ค์ํ ์๋น์ค๋ก๋ถํฐ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ์์ ํ์ฌ ์๋ฆผ์ ์์ฑํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ์ ๊ฐ์ ์ ์ฒญ, ์น์ธ ๋ฑ์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ์ด๋ฒคํธ ํ์ ์ ๋ฐ๋ผ ์ฌ์ ์ ์ ์๋ ์๋ฆผ ํ ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ ์ ๋ฌํ ์๋ฆผ ๋ฉ์์ง๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.
- ์์ฑ๋ ์๋ฆผ์ DB์ ์ ์ฅ๋๋ฉฐ, ๊ฐ ์๋ฆผ์ ์ฝ์/์์ฝ์ ์ํ๋ฅผ ํตํด ๊ตฌ๋ถ๋ฉ๋๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํํฐ๋ง๋ ์๋ฆผ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ค์ํ ์๋ฆผ ์ ํ์ด ์ ๋ต ํจํด ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋์ด ์์ด ์๋ก์ด ์๋ฆผ ํ์ ์ด ์ฝ๊ฒ ํ์ฅ ๊ฐ๋ฅํฉ๋๋ค.
-
์ฑํ :
- ws-stomp๋ฅผ ํตํด ์ค์๊ฐ ์ฑํ ์ด ๊ฐ๋ฅํฉ๋๋ค. (1๋1 ์ฑํ ๊ณผ 1๋N ์ฑํ ์ด ๊ฐ๋ฅํฉ๋๋ค)
- Kafka๋ฅผ ์ฑํ ๋ธ๋ก์ปค๋ก ์ฌ์ฉํ์ฌ, ๋์ฉ๋ ์ฑํ ํธ๋ํฝ์ ๊ฒฌ๋ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
- ๊ธฐํ์์ผ๋ก, ๋ชจ์ 1๊ฐ๋น ์ฑํ ๋ฐฉ์ 1๊ฐ๋ง ์์ฑํ ์ ์๋๋ก ์ค๊ณ๋์์ง๋ง, ์ถํ ํ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
-
๋ชจ์:
- ์ฌ์ฉ์๋ ์๋ก์ด ๋ชจ์์ ์์ฑํ ์ ์์ผ๋ฉฐ, ๋ชจ์ ์ด๋ฆ, ์ค๋ช , ๋ชจ์ง ์กฐ๊ฑด ๋ฑ ๋ค์ํ ์ ๋ณด๋ฅผ ์ ๋ ฅํ์ฌ ๊ฐ์คํ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์๋ ๊ด์ฌ ์๋ ๋ชจ์์ ์ ์ฒญํ ์ ์๊ณ , ๊ด๋ฆฌ์๋ ์ ์ฒญ์๋ฅผ ์น์ธ ๋๋ ๊ฑฐ์ ํ ์ ์์ต๋๋ค. ์ด ๊ณผ์ ์ ์๋ฆผ ์์คํ ๊ณผ ์ฐ๋๋ฉ๋๋ค.
- ๊ด๋ฆฌ์๋ ๋ชจ์์ ๊ฐ์ ๋ ๋ฉค๋ฒ๋ค์ Role์ ๋ถ์ฌํ๊ฑฐ๋, ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐ/์ญ์ ํ ์ ์์ต๋๋ค. Role์ ๋ฐ๋ผ ์ ๊ทผ ๊ถํ์ด ๊ตฌ๋ถ๋ฉ๋๋ค.
- ๋ชจ์ ๋ฉค๋ฒ ์ ๋ณด๋ฅผ ์บ์(Redis)์ ์ ์ฅํ์ฌ ์กฐํ ์ฑ๋ฅ์ ํฅ์์์ผฐ์ต๋๋ค. ์์ฃผ ์กฐํ๋๋ ๋ฉค๋ฒ ์ ๋ณด ์์ฒญ์ ๋น ๋ฅธ ์๋ต์ด ๊ฐ๋ฅํฉ๋๋ค.
-
์๋ชจ์:
- ์๋ชจ์ ์์ฑ/์์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
- ์๋ชจ์์ ์ฐธ์ฌ/๋๊ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
-
๊ฒ์๊ธ
- ๋ชจ์๋ณ ๊ฒ์๊ธ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฉฐ, ๊ฒ์๊ธ์ ํผ๋ ํน์ ํฌํ๋ก ์์ฑํ ์ ์์ต๋๋ค.
- ๊ถํ์ ๋ฐ๋ผ ๊ฒ์๊ธ ์์ ๋ฐ ์ญ์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ์กฐํ๊ฐ ๋น๋ฒํ ๊ฒ์ผ๋ก ํ๋จํ์ฌ, CQRS๋ฅผ ํ์ฉํ์ฌ ์ฝ๊ธฐ DB(MongoDB)๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์กฐํ ์ฑ๋ฅ์ ๋์์ต๋๋ค.
- DB ์ฌ์ด์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ด๋ฒคํธ ์์ฑ์ผ๋ก ๊ตฌ์ฑํ์ผ๋ฉฐ, ์ ํํ ํ๋ฒ์ ๋ณด์ฅํ๊ธฐ ์ํด OutBoxํจํด๊ณผ ๋ฉฑ๋ฑ์ ์๋น์ ํจํด์ ํ์ฉํ์์ต๋๋ค.
- ์บ์์ ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ฌ ์กฐํ ์ฑ๋ฅ์ ๋์ฑ ์ต์ ํ ๊ฐ๋ฅํฉ๋๋ค.
-
๋๊ธ
- ๊ฒ์๊ธ๊ณผ ๋๊ธ ๋๋ฉ์ธ์ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค.
- ๋ถ๋ชจ๋๊ธ๊ณผ ์์๋๊ธ์ ๊ตฌ๋ถํ์ฌ ๋๊ธ๊ณผ ๋๋๊ธ์ ๊ตฌ๋ถ์ง์์ต๋๋ค.
- ๊ฒ์๋์ง ์๊ฐ์ด ์ง๋ ๊ฒ์๊ธ์ ๋๊ธ์ ์์ ์ด ๋น๋ฒํ๊ฒ ์ผ์ด๋์ง ์๋๋ค๊ณ ํ๋จํ์ฌ, ๋๊ธ ์กฐํ ์ต์ ํ๋ฅผ ์ํด ์บ์ฑ์ ๋์ ํ์์ต๋๋ค.
- ๊ฒ์๊ธ์ด ์ญ์ ๋๋ฉด, ๋๊ธ๋ ๋ชจ๋ ์ญ์ ๋๋ ํธ๋์ญ์ ์ ๊ฐ๊ณ ์์ต๋๋ค.
-
์ผ์
- ๋ชจ์๋ณ ์ผ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ชจ์์ ๊ถํ์ ๋ฐ๋ผ ์ผ์ ์ ์์ ํ๊ณ , ์ญ์ ํ ์ ์์ต๋๋ค.
- ๐ง ์๋ฆผ ์๋น์ค ์ฆ์ INSERT๋ก ์ธํ DB ๋ถํ
- ๐ง taggedIds ๋ณ๊ฒฝ์, ๋ฐ์ํ๋ ์ฟผ๋ฆฌ ์ ์ต์ ํ
- ๐ค ๋๊ธฐํ ์ฒ๋ฆฌ ์๋ ๊ฐ์
- ๐ค Redisson ๊ธฐ๋ฐ ์ธ์ ์ฐธ๊ฐ ๊ธฐ๋ฅ ์ต์ ํ ๊ณผ์
- ๐ค ์ฟผ๋ฆฌํ๋ โ ์ฐ๊ธฐ ์ต์ ํ
- ๐ค ๊ด์ธก ํ๊ฒฝ ๊ตฌ์ถ Part#1
- ๐ค ๊ด์ธก ํ๊ฒฝ ๊ตฌ์ถ Part#2


