๋ง์ดํฌ๋ก์๋น์ค์ ๋ง๋ น๊ณผ ์๋ณํ๊ธฐ: 2025๋ , ๋ชจ๋๋ฌ ๋ชจ๋๋ฆฌ์์ ๊ทํ
์ง๋ 10๋ ๊ฐ, ๊ฐ๋ฐ์ ๋ฉด์ ์ด๋ ์์คํ ์ค๊ณ ๋ ผ์์์ ํ์ฅ์ฑ(Scale)์ ๋ํ ์ง๋ฌธ์ด ๋์ค๋ฉด ์ ๋ต์ ๋ ์ ํด์ ธ ์์์ต๋๋ค. **"๋ง์ดํฌ๋ก์๋น์ค(Microservices)"**์์ฃ .
๊ฐ๋ฐ์๊ฐ ๊ณ ์ 3๋ช ์ธ ์ด๊ธฐ ์คํํธ์ ์กฐ์ฐจ๋ ์์ง ์ ์ ํธ๋ํฝ์ ์ปค๋ MVP๋ ์ ๋์๋๋ฐ ์ฟ ๋ฒ๋คํฐ์ค(k8s) ํด๋ฌ์คํฐ๋ถํฐ ์ฌ๋ฆฌ๊ณ ๋ด ๋๋ค. 500์ค์ด๋ฉด ๋๋ ๋น์ฆ๋์ค ๋ก์ง์ 6๊ฐ์ ์๋น์ค๋ก ์ชผ๊ฐ ๋์ต๋๋ค. ์ ํ์ ์ธ **'์ด๋ ฅ์ ์ฃผ๋ ๊ฐ๋ฐ(Resume Driven Development)'**์ด์, ์ค๋ฒ ์์ง๋์ด๋ง์ ์๋์์ต๋๋ค.
ํ์ง๋ง 2025๋ ํ์ฌ, ๋ถ์๊ธฐ๊ฐ ์์ ํ ๋ฌ๋ผ์ก์ต๋๋ค. ์๋ง์กด ํ๋ผ์ ๋น๋์ค(Amazon Prime Video)๊ฐ ๋ง์ดํฌ๋ก์๋น์ค์์ ๋ชจ๋๋ฆฌ์์ผ๋ก ํ๊ทํ๋ฉฐ ์ธํ๋ผ ๋น์ฉ์ 90%๋ ์ ๊ฐํ ์ฌ๋ก๋ ์ ๊ณ์ ํฐ ์ถฉ๊ฒฉ์ ์ฃผ์์ฃ . DHH๋ฅผ ํ๋๋ก ํ '๋ชจ๋๋ฆฌ์์ ์์(Majesty of the Monolith)' ๋ด๋ก ๋ ๋ค์ ํ์ ์ป๊ณ ์์ต๋๋ค.
๊ฐ๋ฐ์๋ค์ ์ด์ ์์ผ ๋ผ์ํ ํ์ค์ ๋ง์ฃผํ๊ณ ์์ต๋๋ค.
"๋ง์ดํฌ๋ก์๋น์ค๋ '๋ณต์ก์ฑ'์ด๋ผ๋ ๊ณ ๊ธ๋ฆฌ ์ฌ์ฑ์ด๋ฉฐ, ๋๋ถ๋ถ์ ํ์ ๊ทธ ์ด์๋ฅผ ๊ฐ๋นํ ๋ฅ๋ ฅ์ด ์๋ค."
์ด ๊ธ์ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๋ฌด์กฐ๊ฑด ๋์๋ค๋ ๊ฒ ์๋๋๋ค. ๋ค๋ง ์ฐ๋ฆฌ๊ฐ ๋งน๋ชฉ์ ์ผ๋ก ์ซ์๋ ๊ทธ ์ ํ์ด ์ ์์ด๊ฐ๊ณ ์๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋์์ธ **'๋ชจ๋๋ฌ ๋ชจ๋๋ฆฌ์(Modular Monolith)'**์ผ๋ก ์ด๋ป๊ฒ ํ์ค์ ์ธ ์์คํ ์ ๊ตฌ์ถํ ์ ์๋์ง ์ด์ผ๊ธฐํด๋ณด๋ ค ํฉ๋๋ค.
'๋ถ๋ฆฌ(Decoupling)'๋ผ๋ ๋ฌ์ฝคํ ํ์
๋ง์ดํฌ๋ก์๋น์ค ์ฐฌ์ฑ๋ก ์๋ค์ ๋ ผ๋ฆฌ๋ ๊ทธ๋ด์ธํ์ต๋๋ค. "์์คํ ์ ์ชผ๊ฐ๋ผ! ํ๊ฐ ์์กด์ฑ์ ์์ ๋ผ! ๋ฐฐํฌ๋ฅผ ์์ ๋กญ๊ฒ ํ๋ผ!"
์ด๋ก ์ ์ผ๋ก๋ ์๋ฒฝํฉ๋๋ค. ์๋น์ค A์ ์๋น์ค B๊ฐ ๊น๋ํ API๋ก๋ง ๋ํํ๋๊น์.
ํ์ง๋ง ํ์ค์ ์ด๋ค๊ฐ์? ์ฐ๋ฆฌ๋ **'๋ถ์ฐ๋ ๋ชจ๋๋ฆฌ์ค(Distributed Monolith)'**๋ผ๋ ๊ดด๋ฌผ์ ๋ง๋ค์์ ๋ฟ์
๋๋ค.
1. ๋ ๋ฆฝ์ฑ์ ์๋ค, ๋คํธ์ํฌ ํธ์ถ๋ง ๋จ์์ ๋ฟ
์๋น์ค A๊ฐ B๋ฅผ ํธ์ถํ๊ณ , B๊ฐ ๋ค์ C๋ฅผ ํธ์ถํ๋ ๊ตฌ์กฐ๋ฅผ ๋ด ์๋ค. ์๋น์ค C์ ์๋ต ํฌ๋งท์ด ๋ฐ๋๋ฉด ์ด๋ป๊ฒ ๋๋์? A, B, C๋ฅผ ๊ด๋ฆฌํ๋ ์ธ ํ์ด ๋ชจ์ฌ์ ํ์๋ฅผ ํ๊ณ , ๋ฐฐํฌ ์์๋ฅผ ์กฐ์จํด์ผ ํฉ๋๋ค.
IDE์์ Refactor > Rename ๋จ์ถํค ํ ๋ฒ์ด๋ฉด ๋๋ ์ผ์ด, 3๊ฐ ๋ ํฌ์งํ ๋ฆฌ์ PR๊ณผ ๋ฐฐํฌ ์ ์์ผ๋ก ๋ณ์ง๋ฉ๋๋ค. ๊ฒฐํฉ๋(Coupling)๋ฅผ ๋ฎ์ถ ๊ฒ ์๋๋ผ, ๊ฒฐํฉ๋ ์ง์ ์ **๊ฐ์ฅ ๋๋ฆฌ๊ณ ๋ถ์์ ํ ๊ตฌ๊ฐ์ธ '๋คํธ์ํฌ'**๋ก ์ฎ๊ฒจ๋ฒ๋ฆฐ ์
์
๋๋ค.
2. ๋ ์ดํด์ ์ธ๊ธ (Latency Tax)
๋ชจ๋๋ฆฌ์์์ ํจ์ ํธ์ถ์ ๋ฉ๋ชจ๋ฆฌ์์์ ๋๋
ธ์ด(ns) ๋จ์๋ก ๋๋ฉ๋๋ค. '๊ณต์ง'๋ ๋ค๋ฆ์์ฃ .
ํ์ง๋ง ๋ง์ดํฌ๋ก์๋น์ค์์๋ ์ด์ผ๊ธฐ๊ฐ ๋ค๋ฆ
๋๋ค.
- JSON ์ง๋ ฌํ (CPU ๋ญ๋น)
- ๋คํธ์ํฌ ์ ์ก (๋ ์ดํด์ ๋ฐ์)
- ๋ก๋ ๋ฐธ๋ฐ์ ํต๊ณผ
- JSON ์ญ์ง๋ ฌํ (CPU ๋ญ๋น)
- ๋ก์ง ์ํ
- ...๋ฐ๋ณต
๋จ์ํ ์ ์ ํ๋กํ ์กฐํ ํ๋ ๋๋ฌธ์ ๋ด๋ถ์ ์ผ๋ก HTTP ์์ฒญ์ด 50๋ฒ์ฉ ์ค๊ฐ๋ ์์คํ ์ ๋ณธ ์ ์ด ์์ต๋๋ค. ์ด๊ฑด N+1 ๋ฌธ์ ๋ฅผ DB๊ฐ ์๋๋ผ ๋คํธ์ํฌ ๋ ๋ฒจ๋ก ํค์ด ๊ผด์ ๋๋ค. ์๋ฌด๋ฆฌ ์บ์๋ฅผ ๋ฐ๋ผ๋ ๊ทผ๋ณธ์ ์ธ ๊ตฌ์กฐ์ ๊ฒฐํจ์ ํด๊ฒฐ๋์ง ์์ต๋๋ค.
์ด์ ์ง์ฅ (Operational Nightmare)
"์ฐ๋ฆฌ ํ์ ๋ทํ๋ฆญ์ค๊ฐ ์๋๋๋ค."
์ด ์ฌ์ค์ ์ธ์ ํด์ผ ํฉ๋๋ค. ์ธํ๋ผ ๊ด๋ฆฌ ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ ์ค์๊ท๋ชจ ํ์๊ฒ ๋ง์ดํฌ๋ก์๋น์ค๋ ์ฌ์์
๋๋ค.
- ๋ก๊ทธ๋ ์ด๋์?: ์์ ์
tail -f๋grep์ด๋ฉด ์ถฉ๋ถํ์ต๋๋ค. ์ด์ ์์ฒญ ํ๋๊ฐ ์ฃฝ์ผ๋ฉด, Jaeger๋ Datadog ๊ฐ์ ๋ถ์ฐ ํธ๋ ์ด์ฑ ํด ์์ด๋ ์์ธ์กฐ์ฐจ ๋ชป ์ฐพ์ต๋๋ค. - ํธ๋์ญ์
์ ์
๋ชฝ:
BEGIN TRANSACTION ... COMMIT์ผ๋ก ๋๋๋ ์์์ฑ(Atomicity)์ด ์ฌ๋ผ์ก์ต๋๋ค. ์ด์ SAGA ํจํด์ด๋ ๋ณด์ ํธ๋์ญ์ ์ด๋ ํ๋ ๋ณต์กํ ๋ก์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค. ๋ฐ์ดํฐ ์ ํฉ์ฑ ๋ง์ถ๋ค๊ฐ ๋ฐค์๋๋ค. - ๊ฐ๋ฐ ํ๊ฒฝ ๊ตฌ์ถ: ์ ๊ท ์ ์ฌ์๊ฐ ๋ก์ปฌ์์ ์๋ฒ ํ๋ฒ ๋์ฐ๋ ค๋ฉด ๋์ปค ์ปจํ ์ด๋ 15๊ฐ๋ฅผ ๋์์ผ ํฉ๋๋ค. ๋งฅ๋ถ ํฌ ์๋ฆฌ์ ์ ์๋ฆฌ ๋๋ฃ ๋ชฉ์๋ฆฌ๊ฐ ์ ๋ค๋ฆด ์ง๊ฒฝ์ด์ฃ .
๋์: ๋ชจ๋๋ฌ ๋ชจ๋๋ฆฌ์ (Modular Monolith)
๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ๋ค์ ๊ฑฐ๋ํ ์คํ๊ฒํฐ ์ฝ๋, GlobalUtils.java๊ฐ ๋๋ฌดํ๋ 10๋
์ ์ผ๋ก ๋์๊ฐ์ผ ํ ๊น์? ์๋๋๋ค.
ํด๋ต์ ๋ชจ๋๋ฌ ๋ชจ๋๋ฆฌ์์ ์์ต๋๋ค.
๋ฌผ๋ฆฌ์ ์ผ๋ก๋ ํ๋์ ๋ฐฐํฌ ๋จ์(Monolith)์ง๋ง, ๋
ผ๋ฆฌ์ ์ผ๋ก๋ ์๋ฒฝํ๊ฒ ๊ฒฉ๋ฆฌ๋ ๋ชจ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ถ๋ ๊ฒ์
๋๋ค.
๋ชจ๋๋ฌ ๋ชจ๋๋ฆฌ์์ ํต์ฌ ์์น
- ๋ฐฐํฌ๋ ํ ๋ฒ์: CI/CD ํ์ดํ๋ผ์ธ์ ํ๋์ ๋๋ค. ์ด์์ด ์๋์ ์ผ๋ก ๋จ์ํฉ๋๋ค.
- ํต์ ์ ํจ์๋ก: ๋ชจ๋ ๊ฐ ํต์ ์ HTTP๊ฐ ์๋๋ผ ๋ฉ์๋ ํธ์ถ์ ๋๋ค. ์ฑ๋ฅ ์ ํ๊ฐ ์์ต๋๋ค.
- ๊ฒฝ๊ณ๋ ์๊ฒฉํ๊ฒ: ์ด๊ฒ ์ ์ผ ์ค์ํฉ๋๋ค.
User๋ชจ๋์ DB ํ ์ด๋ธ์ด๋ ๋ด๋ถ ํด๋์ค๋ฅผOrder๋ชจ๋์์ ๋ง์๋๋ก import ํ ์ ์๊ฒ ๋ง์์ผ ํฉ๋๋ค.
์ด๋ป๊ฒ ๊ตฌํํ๋?
Java Spring์ด๋ผ๋ฉด Maven/Gradle ๋ฉํฐ ๋ชจ๋, Node.js๋ผ๋ฉด Nx๋ Monorepo ํด, ํน์ ๋จ์ํ ESLint ๊ท์น๋ง์ผ๋ก๋ ์ถฉ๋ถํฉ๋๋ค.
src/ modules/ users/ index.ts # (๊ณต๊ฐ) ์ธ๋ถ์์ ์ธ ์ ์๋ ์ธํฐํ์ด์ค๋ง export api/ # (๋น๊ณต๊ฐ) DTO, Service Interface core/ # (๋น๊ณต๊ฐ) ๋๋ฉ์ธ ๋ก์ง db/ # (๋น๊ณต๊ฐ) Repository orders/ ... shared/ # (์ต์ํ) ๋ก๊น , ์ ํธ ๋ฑ app.ts # ๋ชจ๋ ์กฐ๋ฆฝ
orders ๋ชจ๋์์ ../users/db/UserRepository๋ฅผ ์ง์ import ํ๋ ค๊ณ ํ๋ฉด ๋น๋ ์๋ฌ๋ฅผ ๋ด๋ฟ๊ฒ ๋ง๋์ธ์. ์ํคํ
์ฒ๋ ๋ฌธ์๊ฐ ์๋๋ผ ์ฝ๋๋ก ๊ฐ์ ํด์ผ ํฉ๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค๋ ์ธ์ ํ์ํ๊ฐ?
๋ง์ดํฌ๋ก์๋น์ค ์์ฒด๊ฐ ๋์ ๊ธฐ์ ์ ์๋๋๋ค. ๋ค๋ง **'๊ธฐ๋ณธ๊ฐ(Default)'**์ด ๋์ด์๋ ์ ๋๋ค๋ ๊ฒ๋๋ค.
๋ค์ ์กฐ๊ฑด์ ๋ถํฉํ ๋๋ง ๊ณ ๋ คํ์ธ์.
- ์กฐ์ง ๊ท๋ชจ: ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ง 100๋ช ์ด ๋์ด๊ฐ์, ๋ฐฐํฌ ํ๋ฒ ํ๋ ค๋ฉด ๊ฒฐ์ฌ๋ฅผ 3๋ฒ ๋ฐ์์ผ ํ๊ณ ๋จธ์ง ์ถฉ๋ ๋๋ฌธ์ ํ๋ฃจ๋ฅผ ๋ค ๋ ๋ฆด ๋. ์ด๋๋ ๊ธฐ์ ์ ๋น์ฉ์ ์ง๋ถํ๊ณ ์กฐ์ง์ ํจ์จ์ ์ฌ๋ ๊ฒ๋๋ค.
- ๋ฌผ๋ฆฌ์ ์ ์ฝ: ์ด๋ฏธ์ง ์ฒ๋ฆฌ ๋ชจ๋์ GPU๊ฐ ํ์ํ๊ณ (Python), ์ฃผ๋ฌธ ์ฒ๋ฆฌ๋ ๊ณ ์ฑ๋ฅ I/O๊ฐ ํ์ํ ๋(Golang/Node).
- ๊ฒฉ๋ฆฌ ํ์์ฑ: ํน์ ๊ธฐ๋ฅ(์: ์ค์๊ฐ ์ฑํ )์๋ง ํธ๋ํฝ์ด ํญ์ฃผํด์ ์ ์ฒด ์๋ฒ๋ฅผ ๋ค์ด์ํฌ ์ํ์ด ์์ ๋, ๊ทธ ๋ ์๋ง ๋ผ์ด๋ด๋ ์ ๋ต.
๊ฒฐ๋ก : ์ ํ ๋์ ์ค๋ฆฌ๋ฅผ
์์คํ
์ค๊ณ๋ ํธ๋ ์ด๋์คํ์ ์์ ์
๋๋ค.
95%์ ๊ธฐ์
, 99%์ ํ๋ก์ ํธ์์ ๋ง์ดํฌ๋ก์๋น์ค๋ "๋จ์ํ ํจ์ ํธ์ถ์ ๋ณต์กํ ๋ถ์ฐ ์ฒ๋ฆฌ๋ก ๋ฐ๊พธ๋" ๋ฉ์ฒญํ ๊ฑฐ๋์
๋๋ค.
2025๋
, ์ฌ๋ฌ๋ถ์ด ๋ณด์ฌ์ค ์ ์๋ ์ต๊ณ ์ ๊ธฐ์ ์ ํต์ฐฐ๋ ฅ์ **"๊ตณ์ด ์ชผ๊ฐ์ง ์๋ ์ฉ๊ธฐ"**์
๋๋ค.
๋ชจ๋๋ฌ ๋ชจ๋๋ฆฌ์์ผ๋ก ์์ํ์ธ์. ๊ฒฝ๊ณ๋ฅผ ์ ์งํค๋ฉฐ ์ฝ๋๋ฅผ ์ง์ธ์. ๊ทธ๋ฆฌ๊ณ ์ ๋ง๋ก ํ์ํ ๋, ๊ทธ๋ ๋ผ์ด๋ด๋ ๋ฆ์ง ์์ต๋๋ค.
๊ฐ์ฅ ์ง๋ฃจํ(Boring) ๊ธฐ์ ์ด ๊ฐ์ฅ ๋์ ์ ๋ฒ์ด๋ค ์ค๋ค๋ ์ฌ์ค, ์์ง ๋ง์ธ์.