2.Tsyringe

TSyringe

TSyringe๋Š” ์ธ๊ธฐ ์žˆ๋Š” TypeScript์šฉ DI(์˜์กด์„ฑ ์ฃผ์ž…) ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ œ์–ด ์—ญ์ „(IoC) ๋ฐ DI ์›์น™์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ž˜์Šค ๋˜๋Š” ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ ๋ฐ ๊ฒ€์ƒ‰์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์—ฌ ๋ชจ๋“ˆ์‹ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ด‰์ง„ํ•œ๋‹ค.

TSyringe์˜ ์ฃผ์š” ๊ธฐ๋Šฅ ๋ฐ ๊ฐœ๋…

  1. ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection): TSyringe๋Š” ์˜์กด์„ฑ ์ฃผ์ž… ํŒจํ„ด์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ํด๋ž˜์Šค์˜ ์˜์กด์„ฑ์€ ํด๋ž˜์Šค ์ž์ฒด ๋‚ด์—์„œ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ์™ธ๋ถ€์—์„œ ์ œ๊ณต๋œ๋‹ค. ์ด๋Š” ๋Š์Šจํ•œ ๊ฒฐํ•ฉ, ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ๋ชจ๋“ˆ์„ฑ์„ ์ด‰์ง„ํ•œ๋‹ค.

  2. ์ปจํ…Œ์ด๋„ˆ(Container): Container ํด๋ž˜์Šค๋Š” TSyringe์˜ ํ•ต์‹ฌ์ด๋‹ค. ์˜์กด์„ฑ์˜ Registration ๋ฐ ํ•ด๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” DI Container ์—ญํ• ์„ ํ•œ๋‹ค. ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค์™€ ํ•ด๋‹น ๊ตฌํ˜„ ๊ฐ„์˜ ๋งคํ•‘์„ ์œ ์ง€ํ•œ๋‹ค.

  3. ๋“ฑ๋ก(Registration): TSyringe๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์˜์กด์„ฑ์„ Container์— Registrationํ•ด์•ผ ํ•œ๋‹ค. Registration์€ ํ† ํฐ(ํด๋ž˜์Šค ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค)์„ ๊ตฌํ˜„๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” register ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ํ•ด๊ฒฐ(Resolution): TSyringe๋Š” resolve ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•œ๋‹ค. ํ† ํฐ์„ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด๋‹น ๊ตฌํ˜„์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. TSyringe๋Š” ์ž๋™์œผ๋กœ ์˜์กด์„ฑ์„ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ ํ•„์š”ํ•œ ๋ชจ๋“  ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค.

  5. ์‹ฑ๊ธ€ํ†ค(Singletons): TSyringe๋Š” Singletons ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์›ํ•œ๋‹ค. registerSingleton ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ™•์ธ๋  ๋•Œ๋งˆ๋‹ค ๊ณต์œ ๋œ๋‹ค.

  6. ๋ฒ”์œ„ ์ง€์ • ์ธ์Šคํ„ด์Šค(Scoped Instances): TSyringe๋Š” ๊ฐœ์ฒด์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก Scoped Instances๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋ฒ”์œ„๋Š” 'createScope' ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฒ”์œ„ ๋‚ด์— Registration๋œ ์ธ์Šคํ„ด์Šค๋Š” ํ•ด๋‹น ๋ฒ”์œ„์— ์—ฐ๊ฒฐ๋œ๋‹ค. ๋ฒ”์œ„๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋ฒ”์œ„ ๋‚ด์˜ ์ธ์Šคํ„ด์Šค๋„ ์‚ญ์ œ๋œ๋‹ค.

  7. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorators): TSyringe๋Š” ์˜์กด์„ฑ์˜ Registration ๋ฐ ํ•ด๊ฒฐ์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” Decorators๋ฅผ ์ œ๊ณตํ•œ๋‹ค. @injectable Decorators๋Š” ํด๋ž˜์Šค๋ฅผ ์ฃผ์ž… ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด @inject Decorators๋Š” ํด๋ž˜์Šค ์†์„ฑ ๋˜๋Š” ์ƒ์„ฑ์ž ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

  8. ์ปค์Šคํ…€ ๋ฆฌ์กธ๋ฒ„(Custom Resolvers): TSyringe๋Š” Custom Resolvers์„ ๊ตฌํ˜„ํ•˜์—ฌ ํ•ด๊ฒฐ ๊ณผ์ •์„ ๋งž์ถคํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ํ•ด์„๊ธฐ๋Š” Container์— Registrationํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํŠน์ • ์œ ํ˜•์˜ ํ•ด์„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

TSyringe๋ฅผ ์‚ฌ์šฉ ์‹œ ์ด์ 

  • ๋ชจ๋“ˆํ™” ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ(Modularity and Maintainability): TSyringe๋Š” ์˜์กด์„ฑ ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜์—ฌ ๋ชจ๋“ˆ์‹ ์„ค๊ณ„๋ฅผ ์ด‰์ง„ํ•œ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๊ตฌํ˜„์„ ๊ตํ™˜ํ•˜๊ณ  ์˜์กด์„ฑ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฌ์›Œ์ง„๋‹ค.

  • ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ(Testability): TSyringe๋Š” ์˜์กด์„ฑ์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์‰ฝ๊ฒŒ ๋ชจ๋ฐฉํ•˜๊ฑฐ๋‚˜ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์ฝ”๋“œ์˜ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋ชจ์˜ ์˜์กด์„ฑ์ด ๊ฐ„๋‹จํ•ด์ ธ์„œ ๋” ํšจ๊ณผ์ ์ธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

  • ์ฝ”๋“œ ๊ตฌ์„ฑ(Code Organization): TSyringe๋Š” ์˜์กด์„ฑ Registration์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ  ์ค‘์•™ ์ง‘์ค‘ํ™”ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์˜์กด์„ฑ์„ ์‰ฝ๊ฒŒ ์ฐพ๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํƒ€์ž… ์•ˆ์ „์„ฑ(Type Safety): TSyringe๋Š” TypeScript์šฉ์œผ๋กœ ํŠน๋ณ„ํžˆ ์„ค๊ณ„๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ํ˜• ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค ์ค‘์— ์œ ํ˜• ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. TypeScript์˜ ์œ ํ˜• ๊ฒ€์‚ฌ๋Š” ์˜์กด์„ฑ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ Registration๋˜๊ณ  ์‚ฝ์ž…๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)

์˜์กด์„ฑ ์ฃผ์ž…(DI)์€ ์˜์กด์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์—์„œ ์˜์กด์„ฑ์˜ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋Š์Šจํ•œ ๊ฒฐํ•ฉ ๋ฐ ๋ชจ๋“ˆ์‹ ์ฝ”๋“œ๋ฅผ ์ด‰์ง„ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. DI์—์„œ๋Š” ํด๋ž˜์Šค๊ฐ€ ์˜์กด์„ฑ์„ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์„ฑ์ž ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋˜๋Š” ์†์„ฑ ์„ค์ •์ž๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€์—์„œ ์˜์กด์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ž˜์Šค๋Š” ์˜์กด์„ฑ์ด ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ ์ข…์† ํ•ญ๋ชฉ์˜ ์ถœ์ฒ˜์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์˜ ์ฃผ์š” ๋ชฉํ‘œ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์œ ์ง€ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ์„ฑ, ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ ๋ฐ ์œ ์—ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ํด๋ž˜์Šค ๊ฐ„ ๊ฒฐํ•ฉ์„ ์ค„์—ฌ ์ฝ”๋“œ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์†Œ๋น„ํ•˜๋Š” ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์˜์กด์„ฑ์„ ๋” ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๊ฐœ๋ณ„ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฉ๋ฆฌ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ชจ์˜ ๋˜๋Š” ์Šคํ… ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜์—ฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค. ๋˜ํ•œ DI๋Š” ์˜์กด์„ฑ์„ ํ†ตํ•ด ํด๋ž˜์Šค ๊ตฌ์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋ชจ๋“ˆ์„ฑ์„ ์ด‰์ง„ํ•˜์—ฌ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋” ์‰ฝ๊ฒŒ ์กฐ๋ฆฝํ•˜๊ณ  ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž…์—๋Š” ์„ธ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ์œ ํ˜•

  1. ์ƒ์„ฑ์ž ์ฃผ์ž…(Constructor Injection): Constructor๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์ด ํด๋ž˜์Šค์— ์ „๋‹ฌ๋œ๋‹ค. ํด๋ž˜์Šค๋Š” ์˜์กด์„ฑ์„ Constructor ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๊ณ  ์˜์กด์„ฑ์€ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ์ œ๊ณต๋œ๋‹ค. Constructor Injection์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์˜์กด์„ฑ์ด ์ถฉ์กฑ๋˜๋„๋ก ํ•œ๋‹ค.

  2. Setter ์ฃผ์ž…(Setter Injection): ์˜์กด์„ฑ์€ setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์— ์„ค์ •๋œ๋‹ค. ํด๋ž˜์Šค๋Š” ๊ฐ ์˜์กด์„ฑ์— ๋Œ€ํ•œ setter ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์˜์กด์„ฑ์€ ํด๋ž˜์Šค๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋œ ํ›„์— ์„ค์ •๋œ๋‹ค. Setter Injection์€ ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋œ ํ›„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ์„ ํƒ์  ๋˜๋Š” ๋™์  ์˜์กด์„ฑ์„ ํ—ˆ์šฉํ•œ๋‹ค.

  3. ๋ฉ”์†Œ๋“œ ์ฃผ์ž…(Method Injection): ๋ฉ”์„œ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์— ์˜์กด์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค. ํด๋ž˜์Šค๋Š” ํŠน์ • ์˜์กด์„ฑ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์˜์กด์„ฑ์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ฉ”์„œ๋“œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋œ๋‹ค. ๋ฉ”์„œ๋“œ ์ฃผ์ž…์€ ํด๋ž˜์Šค์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ณ ์œ ํ•œ ์˜์กด์„ฑ์ด ์žˆ๋Š” ํŠน์ • ๋ฉ”์„œ๋“œ์— ์œ ์šฉํ•œ๋‹ค.

์˜์กด์„ฑ ์ฃผ์ž… ์‚ฌ์šฉ ์‹œ ์ด์ 

  • ๋Š์Šจํ•œ ๊ฒฐํ•ฉ(Loose Coupling): DI๋Š” ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ง์ ‘์ ์ธ ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜์—ฌ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ์„ ์ค„์ธ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์†Œ๋น„ํ•˜๋Š” ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์˜์กด์„ฑ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์›Œ์ง„๋‹ค.

  • ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ(Testability): DI๋Š” ํ…Œ์ŠคํŠธ ์ค‘์— ๋ชจ์˜ ๋˜๋Š” ์Šคํ… ์˜์กด์„ฑ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ํšจ๊ณผ์ ์ด๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฒฉ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ชจ๋“ˆํ™” ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ(Modularity and Reusability): DI๋Š” ์˜์กด์„ฑ์„ ํ†ตํ•ด ํด๋ž˜์Šค ๊ตฌ์„ฑ์„ ์žฅ๋ คํ•˜์—ฌ ๋ชจ๋“ˆํ™”๋ฅผ ์ด‰์ง„ํ•œ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์‰ฝ๊ฒŒ ์–ด์…ˆ๋ธ”ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์˜์กด์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • ๊ตฌ์„ฑ ์œ ์—ฐ์„ฑ(Configuration Flexibility): ๊ตฌ์„ฑ์„ ์™ธ๋ถ€ํ™”ํ•˜๊ณ  ์˜์กด์„ฑ์„ ์ƒ์„ฑํ•จ์œผ๋กœ์จ DI๋Š” ์œ ์—ฐํ•œ ๊ตฌ์„ฑ ์˜ต์…˜์„ ํ—ˆ์šฉํ•œ๋‹ค. ์˜์กด์„ฑ์„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•˜๊ณ  ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๋™์ž‘ ๋˜๋Š” ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(Single Responsibility Principle): DI๋Š” ์˜์กด์„ฑ ์ƒ์„ฑ ๋ฐ ์˜์กด์„ฑ ์‚ฌ์šฉ ๋ฌธ์ œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์ค€์ˆ˜ํ•˜๋„๋ก ๋•๋‹ค. ํด๋ž˜์Šค๋Š” ํ•ต์‹ฌ ์ฑ…์ž„์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๋ฐ˜๋ฉด ์˜์กด์„ฑ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ๋Š” ๋ณ„๋„์˜ ๊ตฌ์„ฑ ์š”์†Œ์— ์œ„์ž„๋œ๋‹ค.

reflect-metadata

reflect-metadata๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฆฌํ”Œ๋ ‰์…˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” TypeScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํด๋ž˜์Šค, ์†์„ฑ, ๋ฉ”์„œ๋“œ ๋ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„ ์ค‘์— ํ•ด๋‹น ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ECMAScript 6์— ๋„์ž…๋œ ๋‚ด์žฅ JavaScript API์ธ Reflect API๋ฅผ ํ™œ์šฉํ•œ๋‹ค.

๋ฆฌํ”Œ๋ ‰์…˜์€ ํ”„๋กœ๊ทธ๋žจ์ด ๋Ÿฐํƒ€์ž„์— ์ž์ฒด ๊ตฌ์กฐ์™€ ๋™์ž‘์„ ๊ฒ€์‚ฌ, ๊ฒ€์‚ฌ ๋ฐ ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งํ•œ๋‹ค. ํด๋ž˜์Šค, ์†์„ฑ, ๋ฉ”์„œ๋“œ ๋ฐ ํ•จ์ˆ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์ฝ”๋“œ ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๊ฒ€์‚ฌํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” reflect-metadata๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์ฃผ์„์„ ๋‹ฌ๊ณ  ๊ฒ€์ƒ‰ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

reflect-metadata์˜ ์ฃผ์š” ๊ฐœ๋… ๋ฐ ๊ธฐ๋Šฅ

  1. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(Metadata): ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์ฝ”๋“œ ์š”์†Œ์— ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ์ถ”๊ฐ€ ์ •๋ณด ๋˜๋Š” ์ฃผ์„์ด๋‹ค. reflect-metadata๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Reflect API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋™์œผ๋กœ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜์—ฌ ํด๋ž˜์Šค, ์†์„ฑ, ๋ฉ”์„œ๋“œ ๋ฐ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ(Decorators): ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํ•ด๋‹น ์š”์†Œ์— ๋™์ž‘์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํด๋ž˜์Šค, ์†์„ฑ, ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ˆ˜ ์„ ์–ธ์ด๋‹ค. reflect-metadata๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ์žฅ์‹๋œ ์š”์†Œ์™€ ๊ด€๋ จ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•œ๋‹ค.

  3. Reflect API: reflect-metadata ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ์ผ๋ จ์˜ ๋ฐ˜์‚ฌ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋Š” Reflect API๋ฅผ ํ™œ์šฉํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ์—๋Š” Reflect.defineMetadata, Reflect.hasMetadata, Reflect.getMetadata, Reflect.getOwnMetadata ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ์š”์†Œ์™€ ์—ฐ๊ฒฐ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. ์‚ฌ์šฉ๋ฒ•(Usage): reflect-metadata๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด npm ๋˜๋Š” yarn์„ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  TypeScript ํ”„๋กœ์ ํŠธ๋กœ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํด๋ž˜์Šค, ์†์„ฑ, ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์ ์šฉํ•˜๊ณ  Reflect API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์ค‘์— ์—ฐ๊ฒฐ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

reflect-metadata ์‚ฌ์šฉ ์‹œ ์ด์ 

  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฃผ์„(Metadata Annotations): reflect-metadata๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ์ฝ”๋“œ ์š”์†Œ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฃผ์„์„ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๊ตฌ์„ฑ, ์˜์กด์„ฑ ์ฃผ์ž… ๋˜๋Š” ํด๋ž˜์Šค ๋ฐ ๋ฉ”์„œ๋“œ์˜ ๋Ÿฐํƒ€์ž„ ๋ถ„์„๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋™์  ๋™์ž‘(Dynamic Behavior): ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฆฌํ”Œ๋ ‰์…˜ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์š”์†Œ์™€ ์—ฐ๊ฒฐ๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์  ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ๋‹ค.

  • ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ํ†ตํ•ฉ(Integration with Frameworks and Libraries): Angular, TypeORM ๋˜๋Š” NestJS์™€ ๊ฐ™์€ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” '๋ฐ˜์‚ฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ'๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜์กด์„ฑ ์ฃผ์ž…, ๊ฐœ์ฒด ๊ด€๊ณ„ํ˜• ๋งคํ•‘ ๋˜๋Š” ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค. 'reflect-metadata'๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ํ”„๋ ˆ์ž„์›Œํฌ ์ž‘์—… ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

sington (์‹ฑ๊ธ€ํ†ค)

์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋‹จ์ผ ๊ฐœ์ฒด๋กœ ์ œํ•œํ•˜๋Š” ์ƒ์„ฑ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. ์ „์ฒด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๊ธ€๋กœ๋ฒŒ ์•ก์„ธ์Šค ์ง€์ ์„ ์ œ๊ณตํ•œ๋‹ค.

Singleton ํŒจํ„ด์˜ ์ฃผ์š” ํŠน์ง• ๋ฐ ๊ฐœ๋…

  1. ๋‹จ์ผ ์ธ์Šคํ„ด์Šค(Single Instance): Singleton ํŒจํ„ด์€ ์ฃผ์–ด์ง„ ์‹œ๊ฐ„์— ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์กด์žฌํ•˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

  2. ๊ธ€๋กœ๋ฒŒ ์•ก์„ธ์Šค(Global Access): Singleton์€ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๊ธ€๋กœ๋ฒŒ ์•ก์„ธ์Šค ์ง€์ ์„ ์ œ๊ณตํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐœ์ฒด ๋˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

  3. ๋น„๊ณต๊ฐœ ์ƒ์„ฑ์ž(Private Constructor): ์™ธ๋ถ€ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Singleton ํด๋ž˜์Šค์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋น„๊ณต๊ฐœ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด new ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์—†๋‹ค.

  4. ์ •์  ์ธ์Šคํ„ด์Šค(Static Instance): Singleton ํด๋ž˜์Šค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํด๋ž˜์Šค์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณด์œ ํ•˜๋Š” ์ •์  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ด ๋ฉค๋ฒ„๋Š” ์ •์  ๋ฉ”์„œ๋“œ ๋˜๋Š” ์†์„ฑ์„ ํ†ตํ•ด ์•ก์„ธ์Šค๋œ๋‹ค.

  5. ์ดˆ๊ธฐํ™” ์ง€์—ฐ(Lazy Initialization): Singleton ์ธ์Šคํ„ด์Šค๋Š” ์ข…์ข… ๋Š๋ฆฌ๊ฒŒ, ์ฆ‰ ์ฒ˜์Œ ์š”์ฒญ๋  ๋•Œ๋งŒ ์ƒ์„ฑ๋œ๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์‹ค์ œ๋กœ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์—ฐ๊ธฐํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์„ ์ตœ์ ํ™”ํ•œ๋‹ค.

  6. ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ(Thread Safety): ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ๋Š” ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํŠน๋ณ„ํ•œ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค. ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋˜๋Š” ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•œ ์ดˆ๊ธฐํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์‹œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋„ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์ƒ์„ฑ๋˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

Singleton ํŒจํ„ด์˜ ์ด์  ๋ฐ ์‚ฌ์šฉ ์‚ฌ๋ก€

  1. ์ „์—ญ ์•ก์„ธ์Šค(Global Access): ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์–ด๋””์—์„œ๋‚˜ ํด๋ž˜์Šค์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋Š” ๊ตฌ์„ฑ ๊ด€๋ฆฌ์ž, ๋กœ๊น… ์„œ๋น„์Šค ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์€ ํŠน์ • ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐœ์ฒด๊ฐ€ ํ•˜๋‚˜๋งŒ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ์ž์› ๊ด€๋ฆฌ(Resource Management): ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณด์žฅํ•จ์œผ๋กœ์จ Singleton ํŒจํ„ด์€ ์ œํ•œ์ ์ด๊ฑฐ๋‚˜ ๊ฐ’๋น„์‹ผ ์ž์›์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์„ฑ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ํ•œ ๋ฒˆ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ์ผ๊ด€์„ฑ ๋ฐ ์ œ์–ด(Consistency and Control): ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๊ฐœ์ฒด์˜ ์ƒํƒœ ๋ฐ ๋™์ž‘์— ๋Œ€ํ•œ ์ผ๊ด€์„ฑ๊ณผ ์ œ์–ด๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค. ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•˜๋‚˜๋ฟ์ด๋ฏ€๋กœ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ฐ์ฒด์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ฆ‰์‹œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  4. ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection): ์˜์กด์„ฑ ์ฃผ์ž… ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  ์—ฌ๋Ÿฌ ์†Œ๋น„์ž์—๊ฒŒ ํด๋ž˜์Šค์˜ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

Singleton ํŒจํ„ด์˜ ์ž ์žฌ์ ์ธ ๋‹จ์ ๊ณผ ์ฃผ์˜ ์‚ฌํ•ญ

  1. ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ(Global State): ์‹ฑ๊ธ€ํ†ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ธ€๋กœ๋ฒŒ ์ƒํƒœ๊ฐ€ ๋„์ž…๋˜์–ด ์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธ, ์ดํ•ด ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ธด๋ฐ€ํ•œ ๊ฒฐํ•ฉ์œผ๋กœ ์ด์–ด์ง€๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™•์žฅ์„ฑ๊ณผ ๋ชจ๋“ˆ์„ฑ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ์˜ค์šฉ ๊ฐ€๋Šฅ์„ฑ(Potential Misuse): ์‹ฑ๊ธ€ํ†ค ์‚ฌ์šฉ์€ ์˜ค์šฉ ๋ฐ ๋‚จ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ํด๋ž˜์Šค์— ์‹ค์ œ๋กœ ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•„์š”ํ•œ์ง€ ์—ฌ๋ถ€์™€ ์˜์กด์„ฑ ์ฃผ์ž… ๋˜๋Š” ํŒฉํ† ๋ฆฌ์™€ ๊ฐ™์€ ๋Œ€์ฒด ํŒจํ„ด์ด ๋” ์ ํ•ฉํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ๋‹ค.

  3. ํ…Œ์ŠคํŠธ ๊ณผ์ œ(Testing Challenges): ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋Š” ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ๋ชจ์˜ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š” ์˜์กด์„ฑ์„ ๋„์ž…ํ•˜๋ฏ€๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ๋”์šฑ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. Singleton ์˜์กด์„ฑ ์ฃผ๋ณ€์—์„œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์„ค๊ณ„ํ•˜๋ ค๋ฉด ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผ ํ•œ๋‹ค.

  4. ๋™์‹œ์„ฑ ๊ณ ๋ ค ์‚ฌํ•ญ(Concurrency Considerations): ๋‹ค์ค‘ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ Singleton ์ธ์Šคํ„ด์Šค๋Š” ๋™์‹œ ์•ก์„ธ์Šค๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ฒฝ์Ÿ ์กฐ๊ฑด์„ ํ”ผํ•˜๊ณ  ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ ๋ณด์žฅํ•˜๋ ค๋ฉด ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋˜๋Š” ์ง€์—ฐ ์ดˆ๊ธฐํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

Last updated