# [[Microservices Architecture]] ## ๐Ÿ“Œ Brief ๋‹จ๊ธฐ Summary Microservices Architecture๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋น„์ฆˆ๋‹ˆ์Šค ๊ธฐ๋Šฅ(Business Capabilities)์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋…๋ฆฝ์ ์ด๊ณ  ๋ถ„์‚ฐ๋œ ์„œ๋น„์Šค๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๊ตฌ์ถ•ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ด๋‹ค. [1] ์ด๋Š” ๋Œ€๊ทœ๋ชจ ํŒ€์˜ ๊ฐœ๋ฐœ ํ™•์žฅ์„ฑ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ  ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋…๋ฆฝ์ ์ธ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ์กฐ์ง์˜ ๊ธฐ๋ฏผ์„ฑ์„ ๋†’์ธ๋‹ค. [2, 3] ํ•˜์ง€๋งŒ ์‹œ์Šคํ…œ ๋‚ด๋ถ€์˜ ๋ณต์žก์„ฑ์„ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  ๋ณต์žก์„ฑ์œผ๋กœ ์ „์ด์‹œํ‚ค๋ฏ€๋กœ, ์„ค๊ณ„ ์‹œ ๊ณ ๋„์˜ ์ž๋™ํ™”์™€ ์‹คํŒจ๋ฅผ ๊ณ ๋ คํ•œ ๋ฐฉ์–ด์  ์„ค๊ณ„(Design for failure)๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. [1, 3, 4] ## ๐Ÿ“– Core Content * **์ฒ ํ•™ ๋ฐ ๊ธฐ๋ณธ ํŠน์„ฑ:** ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” "ํ•œ ๊ฐ€์ง€ ์ผ์„ ์ž˜ ์ˆ˜ํ–‰ํ•œ๋‹ค(Do one thing and do it well)"๋Š” ์œ ๋‹‰์Šค ์ฒ ํ•™์„ ๋”ฐ๋ฅธ๋‹ค. [1] ์ค‘์•™ ์ง‘์ค‘ํ™”๋œ ๊ฑฐ๋ฒ„๋„Œ์Šค์™€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ํƒˆํ”ผํ•˜๊ณ , ๋ถ„์‚ฐ๋œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐ ์Šค๋งˆํŠธ ์—”๋“œํฌ์ธํŠธ์™€ ๋‹จ์ˆœํ•œ ํŒŒ์ดํ”„(Smart endpoints and dumb pipes)๋ฅผ ์ง€ํ–ฅํ•˜์—ฌ ์ง„ํ™”ํ•˜๋Š” ์„ค๊ณ„(Evolutionary design)๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. [1] * **ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ์‹ค์ „ ์ ‘๊ทผ ํŒจํ„ด:** * **Spring Boot ๋ฐ Spring Cloud:** ๋Œ€๊ทœ๋ชจ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์„ ์œ„ํ•œ ์ด์ƒ์ ์ธ ๋„๊ตฌ๋กœ ํ‰๊ฐ€๋ฐ›๋Š”๋‹ค. [5] ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ(Eureka), ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค(Hystrix), ์ง€๋Šฅํ˜• ๋ผ์šฐํŒ…(Zuul), ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ(Ribbon)๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์„ ์‹ ์†ํ•˜๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. [5, 6] ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ƒํƒœ๊ณ„๋ฅผ ์„ ๋„ํ–ˆ๋˜ Netflix ์—ญ์‹œ ์ž์ฒด ์†”๋ฃจ์…˜์„ Spring Boot ํ”„๋ ˆ์ž„์›Œํฌ ์—์ฝ”์‹œ์Šคํ…œ์— ํ†ตํ•ฉํ•˜๋ฉฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ‘œ์ค€์„ ์ ๊ทน ์ˆ˜์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์‹ค์ „ ํŒจํ„ด์„ ์ •๋ฆฝํ–ˆ๋‹ค. [6-8] * **NestJS:** Node.js ์ง„์˜์—์„œ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์ „ํ™˜์— ๊ฐ•๋ ฅํ•œ ๊ฐ•์ ์„ ์ง€๋‹Œ๋‹ค. [9, 10] ๊ธฐ๋ณธ์ ์œผ๋กœ TCP, Redis, NATS, RabbitMQ, Kafka, gRPC ๋“ฑ ๋‹ค์–‘ํ•œ ํŠธ๋žœ์ŠคํฌํŠธ ๋ ˆ์ด์–ด ํ†ต์‹ ์„ ๋‚ด์žฅํ•˜์—ฌ ์ง€์›ํ•œ๋‹ค. [9] ๋˜ํ•œ, ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๊ตฌ์กฐ ์ž์ฒด๊ฐ€ ๋ชจ๋†€๋ฆฌ์Šค๋ฅผ ๋ถ„ํ•ดํ•  ๋•Œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ๊ฒฝ๊ณ„๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งคํ•‘๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ์ด์ ์„ ์ œ๊ณตํ•œ๋‹ค. [9] * **๋ชจ๋†€๋ฆฌ์Šค ์„ ํ–‰ ์›์น™ (Monolith-First):** ์‹ค์ „ ์†Œํ”„ํŠธ์›จ์–ด ์•„ํ‚คํ…์ฒ˜์˜ ๋Œ€๊ฐ€ ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ(Martin Fowler)์˜ ์กฐ์–ธ์— ๋”ฐ๋ฅด๋ฉด, ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. [11] ๋Œ€์‹  ๋ชจ๋†€๋ฆฌ์‹ ์•„ํ‚คํ…์ฒ˜๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“ˆ์„ฑ์„ ์—„๊ฒฉํ•˜๊ฒŒ ์œ ์ง€ํ•˜๊ณ , ๊ธฐ์กด ๋ชจ๋†€๋ฆฌ์Šค ๊ตฌ์กฐ๊ฐ€ ํ™•์žฅ์„ฑ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š” ์‹œ์ ์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ ๋น„๋กœ์†Œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์ ์ง„์  ํŒจํ„ด์ด ์‹ค๋ฌด์—์„œ ์„ฑ๊ณต ํ™•๋ฅ ์„ ๋†’์ธ๋‹ค. [11] ## โš–๏ธ Trade-offs & Caveats * **๋ถ„์‚ฐ ๋ชจ๋†€๋ฆฌ์Šค(Distributed Monolith)์˜ ์œ„ํ—˜์„ฑ:** ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”ํ‹ฐํ‹ฐ(Entity)๋ฅผ ์ง์ ‘ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ๋ชจ๋“ˆ ๊ฒฝ๊ณ„๋ฅผ ์ž˜๋ชป ์„ค์ •ํ•˜๋ฉด, ๋…๋ฆฝ์  ๋ฐฐํฌ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ '๋ถ„์‚ฐ ๋ชจ๋†€๋ฆฌ์Šค' ํ˜•ํƒœ๊ฐ€ ๋˜์–ด ์•„ํ‚คํ…์ฒ˜์˜ ์žฅ์ ์„ ๋ชจ๋‘ ์žƒ๊ฒŒ ๋œ๋‹ค. [12] * **๋ณต์žก์„ฑ์˜ ์ด๋™๊ณผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ถ€๋‹ด:** ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ์˜ ์ „ํ™˜์€ ๋ณต์žก์„ฑ์„ ์ค„์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹จ์ผ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ณต์žก์„ฑ์„ ๋ถ„์‚ฐ๋œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ์—ฐ๊ฒฐ ๋ณต์žก์„ฑ์œผ๋กœ ์ „๊ฐ€(Shifting)ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. [3, 4] ๋”ฐ๋ผ์„œ ๋ฐฐํฌ, ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€๋ฅผ ์œ„ํ•œ ์ž๋™ํ™”์™€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์ธํ”„๋ผ ๊ตฌ์ถ• ๋น„์šฉ์ด ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. [3, 13] * **๋„คํŠธ์›Œํฌ ํ†ต์‹  ๋ณ‘๋ชฉ ๋ฐ ํ”„๋กœํ† ์ฝœ ์ œ์•ฝ:** ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์€ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ HTTP์™€ ๊ฐ™์€ ๋™๊ธฐ์‹(Synchronous) ํ”„๋กœํ† ์ฝœ์€ ์‹œ์Šคํ…œ ์ฒ˜๋ฆฌ๋Ÿ‰์˜ ํ•œ๊ณ„ ์š”์ธ์ด ๋  ์ˆ˜ ์žˆ๋‹ค. [14] ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ ๋ฐฑํ”„๋ ˆ์…”(Back pressure)๋ฅผ ์ง€์›ํ•˜๋Š” ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ ๋„์ž…์ด ํ•„์ˆ˜์ ์œผ๋กœ ์š”๊ตฌ๋œ๋‹ค. [14] * **ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(Cross-Cutting Concerns) ๊ด€๋ฆฌ์˜ ๋‚œํ•ดํ•จ:** ๋‹จ์ผ ์•ฑ์— ๋น„ํ•ด ๋กœ๊น…, ์ธ์ฆ, ์—๋Ÿฌ ํ•ธ๋“ค๋ง, ์บ์‹ฑ ๋“ฑ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ฅผ ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์™€ ๋…ธ๋“œ์— ๊ฑธ์ณ ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•˜๊ณ  ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊นŒ๋‹ค๋กญ๋‹ค. [15] ์ด๋ฅผ ์œ„ํ•ด Netflix์˜ Vector๋‚˜ Mogul ๊ฐ™์€ ์ •๊ตํ•œ ๊ณ ํ•ด์ƒ๋„ ์‹œ์Šคํ…œ ๋ถ„์‚ฐ ์ถ”์  ๋ชจ๋‹ˆํ„ฐ๋ง ํˆด์ด ํ•„์š”ํ•˜๋‹ค. [16, 17] ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [๊ด€๊ณ„ ์œ ํ˜• A (์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ )] * [[Monolithic Architecture]] * ์—ฐ๊ฒฐ ์ด์œ : ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜๊ธฐ ์ „์— ์„ ํ–‰๋˜์–ด์•ผ ํ•  ์ดˆ๊ธฐ ๊ตฌ์กฐ์ด์ž ์ƒ๋ฐ˜๋˜๋Š” ์•„ํ‚คํ…์ฒ˜ ๊ฐœ๋…์ด๋‹ค. * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๋„์ž…์˜ ์ ์ ˆํ•œ ์‹œ์ ๊ณผ ์‹œ์Šคํ…œ์„ ์ชผ๊ฐœ๊ธฐ ์ „ ๋ชจ๋“ˆ ๊ฒฝ๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๊ธฐ์ดˆ ๋ฐฉ๋ฒ•๋ก ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. [11] * [[Cross-Cutting Concerns]] * ์—ฐ๊ฒฐ ์ด์œ : ๋ถ„์‚ฐ๋œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ ๋ฐ˜๋“œ์‹œ ์ค‘์•™์ง‘์ค‘์‹/ํ‘œ์ค€ํ™” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ํ•ต์‹ฌ ๊ณผ์ œ์ด๋‹ค. * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋กœ๊น…, ๋ณด์•ˆ, ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋“ฑ์˜ ๋น„๊ธฐ๋Šฅ์  ์š”๊ตฌ์‚ฌํ•ญ์ด ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ์— ๊ฑธ์ณ ์–ด๋–ป๊ฒŒ ์ผ๊ด€๋˜๊ฒŒ ์ฃผ์ž…๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. [15, 18, 19] #### [๊ด€๊ณ„ ์œ ํ˜• B (๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ)] * [[Spring Cloud]] * ์—ฐ๊ฒฐ ์ด์œ : Java/Spring Boot ์ƒํƒœ๊ณ„์—์„œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์˜ ์—ฌ๋Ÿฌ ๋ณต์žกํ•œ ํŒจํ„ด์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๋„๊ตฌ ๋ชจ์Œ์ด๋‹ค. * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ, ๋ผ์šฐํŒ…, ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ๋“ฑ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ํ‘œ์ค€ ํŒจํ„ด๋“ค์ด ์‹ค์ œ ์ฝ”๋“œ ์ˆ˜์ค€์—์„œ ์–ด๋–ป๊ฒŒ ์ž๋™ํ™”๋˜๊ณ  ๊ตฌํ˜„๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. [5, 6] * [[NestJS Microservices]] * ์—ฐ๊ฒฐ ์ด์œ : TypeScript ์ƒํƒœ๊ณ„์—์„œ ๋ฐฑ์—”๋“œ๋ฅผ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๋ถ„ํ• ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ๋„ํ™”๋œ ์ „์†ก ๊ณ„์ธต ๋ฐ ๋ฉ”์‹œ์ง• ํ†ต์‹  ๊ตฌํ˜„์ฒด์ด๋‹ค. * ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: gRPC, Kafka, Redis ๋“ฑ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๊ฐ€ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  ํŒจํ„ด์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋ฉฐ ์ฝ”๋“œ ์ƒ์—์„œ ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉ๋˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. [9] ### Deeper Research Questions * ๋Œ€๊ทœ๋ชจ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐ์‹ HTTP ๋ฐฉ์‹์ด ๊ฐ–๋Š” ์„ฑ๋Šฅ์  ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง• ๊ตฌ์กฐ(Event-Driven Messaging)๋Š” ์–ด๋–ป๊ฒŒ ์„ค๊ณ„๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? * ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌ๋œ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์—์„œ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(๋ณด์•ˆ, ๋ชจ๋‹ˆํ„ฐ๋ง)๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, API Gateway ํŒจํ„ด ๋˜๋Š” Service Mesh ์ธํ”„๋ผ๋Š” ์–ด๋–ค ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š”๊ฐ€? * ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„์‚ฐ ์„œ๋น„์Šค ๊ฐ„์— ํŠธ๋žœ์žญ์…˜์˜ ์›์ž์„ฑ(Atomicity)๊ณผ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ(Consistency)์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ํŒจํ„ด(์˜ˆ: Two-phase commit)์€ ๋ฌด์—‡์ธ๊ฐ€? * ๋ชจ๋†€๋ฆฌ์Šค ์‹œ์Šคํ…œ์˜ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๋ฅผ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)๋ฅผ ํ†ตํ•ด ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ์ด๋ฅผ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฒฝ๊ณ„๋กœ ๋งคํ•‘ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์‹ค๋ฌด ์ ˆ์ฐจ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€? * ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์žฅ์• ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด Netflix์˜ ์‚ฌ๋ก€์ฒ˜๋Ÿผ ๋งคํฌ๋กœ์—์„œ ๋งˆ์ดํฌ๋กœ ์ˆ˜์ค€๊นŒ์ง€ ์ง€์›ํ•˜๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์ถ”์  ๋ฐ ๊ณ ํ•ด์ƒ๋„ ์ง€ํ‘œ ๋ชจ๋‹ˆํ„ฐ๋ง ํ™˜๊ฒฝ์„ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ๊ฒƒ์ธ๊ฐ€? ### Practical Application Contexts * **Implementation:** Spring Boot ํ™˜๊ฒฝ์—์„œ๋Š” `@EnableDiscoveryClient` ๋ฐ Feign ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๊ธฐ๋ฐ˜ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•˜๊ณ , NestJS์—์„œ๋Š” `@nestjs/microservices`๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Kafka/gRPC ์ „์†ก ๊ณ„์ธต์„ ์„ค์ •ํ•œ๋‹ค. [9, 20, 21] * **System Design:** ๋ชจ๋“ˆํ™”๋œ ๋ชจ๋†€๋ฆฌ์Šค ์‹œ์Šคํ…œ์„ ์šด์˜ํ•˜๋‹ค๊ฐ€, ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด๋‚˜ ํŒ€ ๊ทœ๋ชจ ํ™•์žฅ์— ์˜ํ•œ ๋ฐฐํฌ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๋Š” ๋„๋ฉ”์ธ(์˜ˆ: ์ธ์ฆ, ๊ฒฐ์ œ, ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ)์„ ์„ ๋ณ„ํ•ด ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„ํ• ๋œ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ ์žฌ๊ตฌ์„ฑํ•œ๋‹ค. [3, 11] * **Operation / Maintenance:** ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌ๋œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋“ค์˜ ์•ˆ์ •์ ์ธ ํ†ตํ•ฉ ๋ฐฐํฌ ๋ฐ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด Docker ์ปจํ…Œ์ด๋„ˆํ™” ๋ฐ Kubernetes, Cloud Foundry ๊ฐ™์€ ์ธํ”„๋ผ ๊ด€๋ฆฌ ๋„๊ตฌ ์ฒด๊ณ„๋ฅผ ์šด์˜ํ•œ๋‹ค. [5, 22] * **Learning Path:** ๋‹จ์ผ ์•ฑ ๋‚ด์˜ ๋ชจ๋“ˆ/๋ ˆ์ด์–ด ๋ถ„๋ฆฌ ํ•™์Šต(ํ—ฅ์‚ฌ๊ณ ๋‚ /ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ๋“ฑ) โ†’ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ (HTTP, RPC, ๋ฉ”์‹œ์ง€ ํ) ๋ฐ ์žฅ์•  ๋Œ€์‘(Circuit Breaker) ํ•™์Šต โ†’ ๋„์ปค ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ๋ฐ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์ˆ™๋‹ฌ์˜ ํ๋ฆ„์œผ๋กœ ์ง„ํ–‰ํ•œ๋‹ค. [5, 11, 14] * **My Project Relevance:** ํ˜„์žฌ ์ง„ํ–‰ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ(Spring Boot ํ˜น์€ NestJS)์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹น์žฅ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ํ•„์š”๋กœ ํ•  ์ •๋„์˜ ๊ทœ๋ชจ์ธ์ง€ ํ‰๊ฐ€ํ•˜๊ณ , ๋งŒ์•ฝ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ผ๋ฉด ์ฒ ์ €ํ•˜๊ฒŒ ๋ชจ๋†€๋ฆฌ์‹ ๋ชจ๋“ˆ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋˜ ๊ฐ ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์‹ค์ „ ํŒจํ„ด์„ ์„ค๊ณ„ํ•˜๋Š” ์ง€์นจ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ### Adjacent Topics * [[Event-Driven Architecture]] * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋“ค์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹œ์Šคํ…œ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ(Kafka, RabbitMQ ๋“ฑ)์„ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ํ•™์Šต์„ ํ™•์žฅํ•œ๋‹ค. * [[Domain-Driven Design (DDD)]] * ํ™•์žฅ ๋ฐฉํ–ฅ: ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์†์—์„œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๋ถ„ํ• ํ•˜๊ธฐ ์œ„ํ•œ ์ •ํ™•ํ•œ ๊ฒฝ๊ณ„(Bounded Context)๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ์„ ๋„์ถœํ•ด๋‚ด๋Š” ํ•ต์‹ฌ ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ๊ธฐ๋ฒ•์œผ๋กœ ํ™•์žฅํ•œ๋‹ค. --- *Last updated: 2026-05-03*