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