--- id: P-REINFORCE-AUTO-9C0823 category: "10_Wiki/๐Ÿ’ก Topics/Software Engineering" confidence_score: 0.95 tags: [auto-reinforced] last_reinforced: 2026-05-03 github_commit: "[P-Reinforce] Continuous Worker - Dependency Injection (DI)" --- # [[Dependency Injection (DI)|Dependency Injection (DI)]] ## ๐Ÿ“Œ Brief ๋‹จ๊ธฐ Summary Dependency Injection(์˜์กด์„ฑ ์ฃผ์ž…)์€ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด์„ฑ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ œ๊ณต(์ฃผ์ž…)ํ•˜๋„๋ก ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค [1, 2]. ์ด ํŒจํ„ด์€ ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(Dependency Inversion Principle)์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์ฒด์— ์ง์ ‘ ์˜์กดํ•˜๋Š” ๋Œ€์‹  ์ƒ์„ฑ์ž ๋“ฑ์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›์Œ์œผ๋กœ์จ ๋А์Šจํ•œ ๊ฒฐํ•ฉ(Loose Coupling)์„ ์ด‰์ง„ํ•ฉ๋‹ˆ๋‹ค [3]. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฝ”๋“œ๋Š” ๋” ์œ ์—ฐํ•ด์ง€๊ณ , ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด์„ฑ์ด ๋ช…ํ™•ํ•ด์ง€๋ฉฐ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‹œ ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๋ชจ์˜(Mock) ๊ฐ์ฒด๋กœ ์‰ฝ๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค [2, 3]. ## ๐Ÿ“– ๊ตฌ์กฐํ™”๋œ ์ง€์‹ (Synthesized Content) * **์ž‘๋™ ์›๋ฆฌ ๋ฐ ์ฒ ํ•™** DI๋Š” ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์œ ์—ฐ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค [3]. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง์ ‘ ์˜์กด์„ฑ์„ ์ธ์Šคํ„ด์Šคํ™”(`new Service()`)ํ•˜๋Š” ๋Œ€์‹ , ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ œ์–ด ์—ญ์ „(IoC) ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค [1, 4]. ์ด๋ฅผ ํ†ตํ•ด ๋„๋ฉ”์ธ ๋กœ์ง์„ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜์˜ ์„ธ๋ถ€ ๊ตฌํ˜„์œผ๋กœ๋ถ€ํ„ฐ ๊ฒฉ๋ฆฌํ•˜๋Š” ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜(Hexagonal Architecture) ๋“ฑ์˜ ๊ตฌํ˜„์ด ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค [3, 5]. * **Spring Boot์˜ DI ๊ตฌํ˜„ (Java)** Spring Boot๋Š” **์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜์˜ IoC ์ปจํ…Œ์ด๋„ˆ**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DI๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค [4]. `@Service`, `@Repository` ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•˜๋ฉด, ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ถ„์„ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ ๋นˆ(Bean)์„ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค [4]. ํ˜„๋Œ€ Spring Boot์—์„œ๋Š” ๋ณ„๋„์˜ ์ž๋™ ์—ฐ๊ฒฐ(wiring) ์„ค์ • ์—†์ด **์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection)** ๋ฐฉ์‹์„ ์„ ํ˜ธํ•˜๋ฉฐ, ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค [6]. * **NestJS์˜ DI ๊ตฌํ˜„ (TypeScript)** NestJS๋Š” Angular์˜ ์•„ํ‚คํ…์ฒ˜์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ TypeScript ์ƒํƒœ๊ณ„์— ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ DI ํŒจํ„ด์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค [7, 8]. **๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ DI ์ปจํ…Œ์ด๋„ˆ**๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, `@Injectable()` ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ํ”„๋กœ๋ฐ”์ด๋”(Provider)๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค [8, 9]. ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์–ด๋–ค ํ”„๋กœ๋ฐ”์ด๋”๊ฐ€ ์–ด๋””์— ์ฃผ์ž…๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์—„๊ฒฉํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค [10]. * **ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์˜ ๊ทน๋Œ€ํ™” (Testability)** DI์˜ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ์ด์  ์ค‘ ํ•˜๋‚˜๋Š” **๋‹จ์œ„ ํ…Œ์ŠคํŠธ(Unit Testing)** ํ™˜๊ฒฝ์˜ ๊ฐœ์„ ์ž…๋‹ˆ๋‹ค [2]. NestJS์™€ Spring Boot ๋ชจ๋‘ ์˜์กด์„ฑ ์ฃผ์ž… ๊ตฌ์กฐ ๋•๋ถ„์—, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์™ธ๋ถ€ API ์„œ๋น„์Šค ๋“ฑ์„ ๋ชจ์˜ ๊ฐ์ฒด(Mock)๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2, 11]. * **๋ฏธ๋‹ˆ๋ฉ€ ํ”„๋ ˆ์ž„์›Œํฌ์™€์˜ ๋น„๊ต** Express.js์™€ ๊ฐ™์ด DI๊ฐ€ ๋‚ด์žฅ๋˜์ง€ ์•Š์€ ๋ฏธ๋‹ˆ๋ฉ€ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜์กด์„ฑ์„ ์ง์ ‘ ์ž„ํฌํŠธํ•˜๊ณ  ์—ฐ๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [11, 12]. ์ด๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ฒฐํ•ฉ๋„๋ฅผ ๋†’์ด๊ณ  ๋Ÿฐํƒ€์ž„ ์ถ”์ ์„ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ํ…Œ์ŠคํŠธ ์‹œ `proxyquire`์™€ ๊ฐ™์€ ๋„๊ตฌ๋‚˜ ํ•ดํ‚ค(hacky)ํ•œ ์ˆ˜๋™ ์˜์กด์„ฑ ์ฃผ์ž… ํŒจํ„ด์„ ๊ฐ•์ œํ•˜๊ฒŒ ๋˜์–ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ์•…์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค [2]. ## โš ๏ธ ๋ชจ์ˆœ ๋ฐ ์—…๋ฐ์ดํŠธ (Contradictions & RL Update) * **ํ•™์Šต ๊ณก์„ (Learning Curve) ๋ฐ ์ดˆ๊ธฐ ์„ค์ •:** DI ์ปจํ…Œ์ด๋„ˆ, ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ/์–ด๋…ธํ…Œ์ด์…˜, ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๋“ฑ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ Express์™€ ๊ฐ™์€ ๋ฏธ๋‹ˆ๋ฉ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋น„ํ•ด ํ•™์Šต ๊ณก์„ ์ด ๊ฐ€ํŒŒ๋ฅด๊ณ  ์ดˆ๊ธฐ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค [8, 13]. * **ํ”„๋ ˆ์ž„์›Œํฌ ์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ:** ํด๋ž˜์Šค๋ฅผ ์Šค์บ”ํ•˜๊ณ  ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์ด ์ถ”๊ฐ€๋˜๋ฏ€๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹œ์ž‘ ์‹œ๊ฐ„(Startup Time)์ด ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค [14]. ๋Ÿฐํƒ€์ž„ ์ธก๋ฉด์—์„œ๋„ ์ˆœ์ˆ˜ Express์— ๋น„ํ•ด NestJS๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ DI ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ธํ•ด ์•ฝ 10~15% ์ •๋„์˜ ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ฐ์†Œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (Fastify ์ „ํ™˜์œผ๋กœ ์ƒ์‡„ ๊ฐ€๋Šฅ) [15]. * **DI ์›์น™ ์œ„๋ฐ˜ ์‹œ ์œ„ํ—˜:** DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์šฐํšŒํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ(์˜ˆ: `new UsersService()`)ํ•  ๊ฒฝ์šฐ, ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ ์ด์ ์„ ์™„์ „ํžˆ ์ƒ์‹คํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค [1]. * **์ „์—ญ ์ฃผ์ž… ๋‚จ์šฉ ๋ฌธ์ œ:** NestJS ๋“ฑ์—์„œ `@Global()`์„ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์˜์กด์„ฑ์„ ์ „์—ญ์œผ๋กœ ๊ฐœ๋ฐฉํ•˜๋ฉด, ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์ด ์˜๋„ํ•œ '๋ช…ํ™•ํ•œ ์˜์กด์„ฑ ๊ฒฝ๊ณ„'๊ฐ€ ํ—ˆ๋ฌผ์–ด์ ธ ์‹œ์Šคํ…œ ๊ตฌ์กฐ๊ฐ€ ๋‹ค์‹œ ๋ณต์žกํ•ด์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค [10]. * **์ˆœํ™˜ ์ฐธ์กฐ(Circular Dependency) ์ œ์•ฝ:** ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋ชจ๋“ˆ์ด๋‚˜ ์„œ๋น„์Šค๊ฐ€ ์„œ๋กœ๋ฅผ ์ฃผ์ž…๋ฐ›์œผ๋ ค ํ•  ๋•Œ ์ˆœํ™˜ ์ฐธ์กฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” `forwardRef()` ๋“ฑ์œผ๋กœ ์ž„์‹œ ํšŒํ”ผํ•  ์ˆ˜๋Š” ์žˆ์œผ๋‚˜, ๊ทผ๋ณธ์ ์œผ๋กœ ๊ตฌ์กฐ์  ๊ฒฐํ•จ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์•„ํ‚คํ…์ฒ˜ ์ž์ฒด๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1]. ## ๐Ÿ”— ์ง€์‹ ์—ฐ๊ฒฐ (Graph) ### Related Concepts #### [์•„ํ‚คํ…์ฒ˜/๊ธฐ๋ฐ˜ ๊ธฐ์ˆ ] - [[Inversion of Control (IoC)]] - ์—ฐ๊ฒฐ ์ด์œ : DI๋Š” ์ œ์–ด์˜ ์—ญ์ „(IoC)์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์ฒด์ ์ธ ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค [4]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ ˆ์ž„์›Œํฌ(Spring Boot, NestJS)๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ์ฒด ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์‹คํ–‰ ํ๋ฆ„์„ ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœ์ž ๋Œ€์‹  ํ†ต์ œํ•˜๋Š”์ง€ ๊ทผ๋ณธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[Dependency Inversion Principle]] - ์—ฐ๊ฒฐ ์ด์œ : SOLID ์›์น™ ์ค‘ ํ•˜๋‚˜๋กœ, DI ์‹œ์Šคํ…œ์ด ์„ค๊ณ„๋œ ์ด๋ก ์  ๋ฐ”ํƒ•์ด ๋ฉ๋‹ˆ๋‹ค [3]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์™œ ๊ตฌ์ฒด ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ ์ธํ„ฐํŽ˜์ด์Šค(ํฌํŠธ)์— ์˜์กดํ•ด์•ผ ์‹œ์Šคํ…œ์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ณ  ๊ต์ฒด ๊ฐ€๋Šฅํ•ด์ง€๋Š”์ง€ ์•„ํ‚คํ…์ฒ˜์  ๋‹น์œ„์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. #### [๊ตฌํ˜„/ํ™œ์šฉ ๋„๊ตฌ] - [[Constructor Injection]] - ์—ฐ๊ฒฐ ์ด์œ : ํ˜„๋Œ€์ ์ธ DI ํ”„๋ ˆ์ž„์›Œํฌ(Spring Boot, NestJS)์—์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์‹ค์ „ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค [3, 6]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ•„๋“œ ์ฃผ์ž…์ด๋‚˜ ์„ธํ„ฐ ์ฃผ์ž… ๋Œ€๋น„ ์ƒ์„ฑ์ž ์ฃผ์ž…์ด ๊ฐ€์ง€๋Š” ๋ถˆ๋ณ€์„ฑ(Immutability) ๋ณด์žฅ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์˜ ์ด์ ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[Mocking Framework]] - ์—ฐ๊ฒฐ ์ด์œ : DI๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•œ ํ›„, ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ ์‹ค์ œ ๋กœ์ง ๋Œ€์‹  ์ฃผ์ž…๋˜๋Š” ๊ฐ€์งœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค [2]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์˜์กด์„ฑ ์ฃผ์ž…์ด ์‹ค์ œ ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ์‹œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Service)์˜ ๊ณ ๋ฆฝ์„ ์–ด๋–ป๊ฒŒ ์™„๋ฒฝํ•˜๊ฒŒ ๋ณด์žฅํ•˜๋Š”์ง€ ๊ตฌ์ฒด์  ์ ์šฉ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### Deeper Research Questions - ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(TypeScript)์™€ ์–ด๋…ธํ…Œ์ด์…˜(Java)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” DI ์ปจํ…Œ์ด๋„ˆ์˜ ์ปดํŒŒ์ผ ํƒ€์ž„ ๋ฐ ๋Ÿฐํƒ€์ž„ ๊ฐ์ฒด ํ•ด์„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? - Express.js์™€ ๊ฐ™์ด DI ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‚ด์žฅ๋˜์ง€ ์•Š์€ ๋ฏธ๋‹ˆ๋ฉ€ ํ”„๋ ˆ์ž„์›Œํฌ ํ™˜๊ฒฝ์—์„œ ๋†’์€ ์‘์ง‘๋„๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ DI๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์ „ ๋””์ž์ธ ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€? - ๋Œ€๊ทœ๋ชจ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ๋ชจ๋“ˆ ๊ฐ„์˜ ์ˆœํ™˜ ์ฐธ์กฐ(Circular Dependency)๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด `forwardRef()`๋ฅผ ์šฐํšŒํ•˜๋Š” ๋„๋ฉ”์ธ ๊ฒฝ๊ณ„ ์žฌ์„ค๊ณ„ ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - DI ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ดˆ๊ธฐ ๊ตฌ๋™ ์‹œ๊ฐ„(Cold Start)์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading) ๋ฐ ๋„ค์ดํ‹ฐ๋ธŒ ์ปดํŒŒ์ผ(GraalVM ๋“ฑ) ์ตœ์ ํ™” ๊ธฐ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€? - ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜ ๋‚ด์—์„œ ํฌํŠธ(Port)์™€ ์–ด๋Œ‘ํ„ฐ(Adapter)๋ฅผ DI ์ปจํ…Œ์ด๋„ˆ์™€ ์—ฐ๊ฒฐํ•  ๋•Œ, ๋„๋ฉ”์ธ ๋ ˆ์ด์–ด์˜ ์ˆœ์ˆ˜์„ฑ์„ ํ•ด์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ๊ตฌ์„ฑ ๊ทœ์น™์€ ์–ด๋–ป๊ฒŒ ์ •์˜๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€? ### Practical Application Contexts - **Implementation:** ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด๋ฅผ ์ง์ ‘ `new` ํ‚ค์›Œ๋“œ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•„์š”ํ•œ ํƒ€์ž…๋งŒ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ํด๋ž˜์Šค์— `@Injectable()`(NestJS)์ด๋‚˜ `@Service`(Spring Boot)๋ฅผ ๋ถ€์ฐฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šคํ™”์™€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ „๋ฉด ์œ„์ž„ํ•ฉ๋‹ˆ๋‹ค [6, 8]. - **System Design:** ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ๋กœ ๋ถ„ํ• ํ•˜๊ณ , ๊ฐ ๋ชจ๋“ˆ์ด ์™ธ๋ถ€๋กœ ์ œ๊ณตํ•  ํ”„๋กœ๋ฐ”์ด๋”(Provider)์™€ ๋‚ด๋ถ€์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด์„ฑ(Imports)์„ ๋ช…ํ™•ํžˆ ์„ ์–ธํ•จ์œผ๋กœ์จ ๊ฑฐ๋Œ€ํ•œ ๋ชจ๋…ธ๋ฆฌ์Šค ํ™˜๊ฒฝ์—์„œ๋„ ๋„๋ฉ”์ธ ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ๊ฒŒ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [10]. - **Operation / Maintenance:** ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ์ˆ ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์™ธ๋ถ€ API ์ œ๊ณต์ž๋ฅผ ๊ต์ฒดํ•  ๋•Œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฝ”๋“œ๋ฅผ ์ „ํ˜€ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์–ด๋Œ‘ํ„ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด DI ์ปจํ…Œ์ด๋„ˆ์— ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…ํ•˜๋„๋ก ์„ค์ •๋งŒ ๋ณ€๊ฒฝํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•ฉ๋‹ˆ๋‹ค [5]. - **Learning Path:** Express๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๋ผ์šฐํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ•œ ํ›„, NestJS๋‚˜ Spring Boot๋กœ ๋„˜์–ด๊ฐ€ ์˜์กด์„ฑ ์—ญ์ „ ๋ฐ ์ฃผ์ž… ๊ฐœ๋…์„ ํ•™์Šตํ•˜๋ฉฐ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์˜ ๊ธฐ์ดˆ๋ฅผ ๋‹ค์ง‘๋‹ˆ๋‹ค [2, 12]. - **My Project Relevance:** ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ํฌํ•จ๋œ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ๊ฐ์ฒด(Repository)๋‚˜ ์™ธ๋ถ€ HTTP ํด๋ผ์ด์–ธํŠธ ๋“ฑ์„ ์ƒ์„ฑ์ž๋กœ ์ฃผ์ž…๋ฐ›๊ฒŒ ํ•จ์œผ๋กœ์จ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์‹œ ํ•ด๋‹น ์ธํ”„๋ผ๋ฅผ ๋ชฉ(Mock) ๋ฐ์ดํ„ฐ๋กœ ์‰ฝ๊ฒŒ ์น˜ํ™˜ํ•˜์—ฌ ๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2]. ### Adjacent Topics - [[Hexagonal Architecture (Ports and Adapters)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: DI ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ•ต์‹ฌ ์›๋™๋ ฅ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ํ•ต์‹ฌ ๋„๋ฉ”์ธ ๋กœ์ง์ด ์™ธ๋ถ€ ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜(์–ด๋Œ‘ํ„ฐ)์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค(ํฌํŠธ)๋ฅผ ํ†ตํ•ด ์†Œํ†ตํ•˜๋„๋ก ๊ฒฉ๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [3, 16]. - [[Cross-Cutting Concerns (AOP)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: DI ์ปจํ…Œ์ด๋„ˆ์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด(Bean/Provider)๋“ค์„ ๋ฐ”ํƒ•์œผ๋กœ, ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ(๋กœ๊น…, ์ธ์ฆ, ์—๋Ÿฌ ์ฒ˜๋ฆฌ)๋ฅผ ์ธํ„ฐ์…‰ํ„ฐ๋‚˜ ๊ฐ€๋“œ, Aspect๋กœ ๋™์ ์œผ๋กœ ์ฃผ์ž…ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ณ ๊ธ‰ ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด์œผ๋กœ์˜ ํ™•์žฅ์„ ๋„๋ชจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [10, 17]. --- *Last updated: 2026-05-03* --- *Last updated: 2026-05-03* - Raw Source: 00_Raw/2026-05-03/Dependency Injection (DI).md ---