2.Tsyringe
TSyringe
TSyringeλ μΈκΈ° μλ TypeScriptμ© DI(μμ‘΄μ± μ£Όμ ) 컨ν μ΄λ λΌμ΄λΈλ¬λ¦¬μ΄λ€. μ΄λ₯Ό ν΅ν΄ κ°λ°μλ μ μ΄ μμ (IoC) λ° DI μμΉμ λ°λΌ μ ν리μΌμ΄μ λ΄μμ μμ‘΄μ±μ κ΄λ¦¬νκ³ ν΄κ²°ν μ μλ€. ν΄λμ€ λλ μλΉμ€ μΈμ€ν΄μ€μ μμ± λ° κ²μμ μ²λ¦¬νλ κ°λ¨νκ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡νμ¬ λͺ¨λμ λ° μ μ§ κ΄λ¦¬ κ°λ₯ν μ½λλ₯Ό μ΄μ§νλ€.
TSyringeμ μ£Όμ κΈ°λ₯ λ° κ°λ
μμ‘΄μ± μ£Όμ (Dependency Injection): TSyringeλ μμ‘΄μ± μ£Όμ ν¨ν΄μ ꡬννλ λ° λμμ΄ λλ€. μ¬κΈ°μ ν΄λμ€μ μμ‘΄μ±μ ν΄λμ€ μ체 λ΄μμ μμ±λμ§ μκ³ μΈλΆμμ μ 곡λλ€. μ΄λ λμ¨ν κ²°ν©, ν μ€νΈ κ°λ₯μ± λ° λͺ¨λμ±μ μ΄μ§νλ€.
컨ν μ΄λ(Container): Container ν΄λμ€λ TSyringeμ ν΅μ¬μ΄λ€. μμ‘΄μ±μ Registration λ° ν΄κ²°μ κ΄λ¦¬νλ DI Container μν μ νλ€. ν΄λμ€/μΈν°νμ΄μ€μ ν΄λΉ ꡬν κ°μ λ§€νμ μ μ§νλ€.
λ±λ‘(Registration): TSyringeλ₯Ό μ¬μ©νλ €λ©΄ μμ‘΄μ±μ Containerμ Registrationν΄μΌ νλ€. Registrationμ ν ν°(ν΄λμ€ λλ μΈν°νμ΄μ€)μ ꡬνκ³Ό μ°κ²°νλ register λ©μλλ₯Ό μ¬μ©νμ¬ μνν μ μλ€.
ν΄κ²°(Resolution): TSyringeλ resolve λ©μλλ₯Ό μ¬μ©νμ¬ μμ‘΄μ±μ ν΄κ²°νλ€. ν ν°μ μΈμλ‘ μ¬μ©νκ³ ν΄λΉ ꡬνμ μΈμ€ν΄μ€λ₯Ό λ°ννλ€. TSyringeλ μλμΌλ‘ μμ‘΄μ±μ μ¬κ·μ μΌλ‘ ν΄κ²°νμ¬ νμν λͺ¨λ μμ‘΄μ±μ μ£Όμ νλ€.
μ±κΈν€(Singletons): TSyringeλ Singletons μΈμ€ν΄μ€λ₯Ό μ§μνλ€. registerSingleton λ©μλλ₯Ό μ¬μ©νμ¬ ν΄λμ€μ λ¨μΌ μΈμ€ν΄μ€κ° μμ±λκ³ νμΈλ λλ§λ€ 곡μ λλ€.
λ²μ μ§μ μΈμ€ν΄μ€(Scoped Instances): TSyringeλ κ°μ²΄μ μλͺ μ£ΌκΈ°λ₯Ό μ μ΄ν μ μλλ‘ Scoped Instancesλ₯Ό μ§μνλ€. λ²μλ 'createScope' λ©μλλ₯Ό μ¬μ©νμ¬ λ§λ€ μ μμΌλ©° λ²μ λ΄μ Registrationλ μΈμ€ν΄μ€λ ν΄λΉ λ²μμ μ°κ²°λλ€. λ²μκ° μμ λλ©΄ λ²μ λ΄μ μΈμ€ν΄μ€λ μμ λλ€.
λ°μ½λ μ΄ν°(Decorators): TSyringeλ μμ‘΄μ±μ Registration λ° ν΄κ²°μ λ¨μννλ Decoratorsλ₯Ό μ 곡νλ€. @injectable Decoratorsλ ν΄λμ€λ₯Ό μ£Όμ κ°λ₯ν κ²μΌλ‘ νμνλ λ° μ¬μ©λλ λ°λ©΄ @inject Decoratorsλ ν΄λμ€ μμ± λλ μμ±μ λ§€κ° λ³μμ μμ‘΄μ±μ μ£Όμ νλ λ° μ¬μ©λλ€.
컀μ€ν 리쑸λ²(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λ μμ‘΄μ±μ ν΅ν΄ ν΄λμ€ κ΅¬μ±μ νμ±ννμ¬ λͺ¨λμ±μ μ΄μ§νμ¬ μμ© νλ‘κ·Έλ¨μ λ μ½κ² 쑰립νκ³ κ΅¬μ±ν μ μλλ‘ νλ€.
μμ‘΄μ± μ£Όμ μλ μΈ κ°μ§ μΌλ°μ μΈ μ ν
μμ±μ μ£Όμ (Constructor Injection): Constructorλ₯Ό ν΅ν΄ μμ‘΄μ±μ΄ ν΄λμ€μ μ λ¬λλ€. ν΄λμ€λ μμ‘΄μ±μ Constructor λ§€κ° λ³μλ‘ μ μΈνκ³ μμ‘΄μ±μ ν΄λμ€κ° μΈμ€ν΄μ€νλ λ μ 곡λλ€. Constructor Injectionμ ν΄λμ€λ₯Ό μ¬μ©νκΈ° μ μ μμ‘΄μ±μ΄ μΆ©μ‘±λλλ‘ νλ€.
Setter μ£Όμ (Setter Injection): μμ‘΄μ±μ setter λ©μλλ₯Ό ν΅ν΄ ν΄λμ€μ μ€μ λλ€. ν΄λμ€λ κ° μμ‘΄μ±μ λν setter λ©μλλ₯Ό μ 곡νλ©° μμ‘΄μ±μ ν΄λμ€κ° μΈμ€ν΄μ€νλ νμ μ€μ λλ€. Setter Injectionμ ν΄λμ€κ° μμ±λ ν λ³κ²½ν μ μλ μ νμ λλ λμ μμ‘΄μ±μ νμ©νλ€.
λ©μλ μ£Όμ (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μ μ£Όμ κ°λ λ° κΈ°λ₯
λ©νλ°μ΄ν°(Metadata): λ©νλ°μ΄ν°λ μ½λ μμμ 첨λΆν μ μλ μΆκ° μ 보 λλ μ£Όμμ΄λ€. reflect-metadataλ₯Ό μ¬μ©νλ©΄ λ°μ½λ μ΄ν°λ₯Ό μ¬μ©νκ±°λ Reflect APIλ₯Ό μ¬μ©νμ¬ μλμΌλ‘ λ©νλ°μ΄ν°λ₯Ό μ€μ νμ¬ ν΄λμ€, μμ±, λ©μλ λ° λ§€κ° λ³μμ λ©νλ°μ΄ν°λ₯Ό μΆκ°ν μ μλ€.
λ°μ½λ μ΄ν°(Decorators): λ°μ½λ μ΄ν°λ ν΄λΉ μμμ λμμ μμ νκ±°λ μΆκ°νκΈ° μν΄ ν΄λμ€, μμ±, λ©μλ λλ λ§€κ° λ³μμ 첨λΆν μ μλ νΉμ μ μΈμ΄λ€. reflect-metadataλ λ°μ½λ μ΄ν°μ ν¨κ» μλνμ¬ μ₯μλ μμμ κ΄λ ¨λ λ©νλ°μ΄ν°λ₯Ό μ μ₯νκ³ κ²μνλ€.
Reflect API: reflect-metadata λΌμ΄λΈλ¬λ¦¬λ λ©νλ°μ΄ν°μ μ‘μΈμ€νκΈ° μν μΌλ ¨μ λ°μ¬ λ©μλλ₯Ό μ 곡νλ Reflect APIλ₯Ό νμ©νλ€. μ΄λ¬ν λ©μλμλ Reflect.defineMetadata, Reflect.hasMetadata, Reflect.getMetadata, Reflect.getOwnMetadata λ±μ΄ ν¬ν¨λλ€. μ΄λ¬ν λ©μλλ₯Ό μ¬μ©νλ©΄ μ½λ μμμ μ°κ²°λ λ©νλ°μ΄ν°λ₯Ό μ€μ νκ³ κ²μν μ μλ€.
μ¬μ©λ²(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 ν¨ν΄μ μ£Όμ νΉμ§ λ° κ°λ
λ¨μΌ μΈμ€ν΄μ€(Single Instance): Singleton ν¨ν΄μ μ£Όμ΄μ§ μκ°μ ν΄λμ€μ μΈμ€ν΄μ€κ° νλλ§ μμ±λκ³ μ ν리μΌμ΄μ μ μ‘΄μ¬νλλ‘ λ³΄μ₯νλ€.
κΈλ‘λ² μ‘μΈμ€(Global Access): Singletonμ μΈμ€ν΄μ€μ λν κΈλ‘λ² μ‘μΈμ€ μ§μ μ μ 곡νμ¬ λ€λ₯Έ κ°μ²΄ λλ κ΅¬μ± μμκ° μ½κ² μ‘μΈμ€νκ³ μ¬μ©ν μ μλλ‘ νλ€.
λΉκ³΅κ° μμ±μ(Private Constructor): μΈλΆ μΈμ€ν΄μ€νλ₯Ό λ°©μ§νκΈ° μν΄ Singleton ν΄λμ€μλ μΌλ°μ μΌλ‘ λΉκ³΅κ° μμ±μκ° μλ€. μ΄λ κ² νλ©΄ new ν€μλλ₯Ό μ¬μ©νμ¬ ν΄λμ€λ₯Ό μ§μ μΈμ€ν΄μ€νν μ μλ€.
μ μ μΈμ€ν΄μ€(Static Instance): Singleton ν΄λμ€λ μΌλ°μ μΌλ‘ ν΄λμ€μ λ¨μΌ μΈμ€ν΄μ€λ₯Ό 보μ νλ μ μ λ©€λ² λ³μλ₯Ό ν¬ν¨νλ€. μ΄ λ©€λ²λ μ μ λ©μλ λλ μμ±μ ν΅ν΄ μ‘μΈμ€λλ€.
μ΄κΈ°ν μ§μ°(Lazy Initialization): Singleton μΈμ€ν΄μ€λ μ’ μ’ λ리κ², μ¦ μ²μ μμ²λ λλ§ μμ±λλ€. μ΄ μ κ·Ό λ°©μμ μ€μ λ‘ νμν λκΉμ§ μΈμ€ν΄μ€νλ₯Ό μ°κΈ°νμ¬ λ¦¬μμ€ μ¬μ©μ μ΅μ ννλ€.
μ€λ λ μμ μ±(Thread Safety): λ€μ€ μ€λ λ νκ²½μμλ μ€λ λ μμ μ±μ 보μ₯νκΈ° μν΄ νΉλ³ν μ£Όμλ₯Ό κΈ°μΈμ¬μΌ νλ€. λκΈ°ν λ©μ»€λμ¦ λλ μ€λ λλ‘λΆν° μμ ν μ΄κΈ°ν κΈ°μ μ μ¬μ©νμ¬ λμ μλ리μ€μμλ νλμ μΈμ€ν΄μ€λ§ μμ±λλλ‘ ν΄μΌ νλ€.
Singleton ν¨ν΄μ μ΄μ λ° μ¬μ© μ¬λ‘
μ μ μ‘μΈμ€(Global Access): μ±κΈν€ ν¨ν΄μ μ ν리μΌμ΄μ μ΄λμμλ ν΄λμ€μ λ¨μΌ μΈμ€ν΄μ€μ μ‘μΈμ€ν μ μλ νΈλ¦¬ν λ°©λ²μ μ 곡νλ€. μ΄λ κ΅¬μ± κ΄λ¦¬μ, λ‘κΉ μλΉμ€ λλ λ°μ΄ν°λ² μ΄μ€ μ°κ²°κ³Ό κ°μ νΉμ κΈ°λ₯μ λ΄λΉνλ κ°μ²΄κ° νλλ§ μμ΄μΌ νλ κ²½μ°μ μ μ©ν μ μλ€.
μμ κ΄λ¦¬(Resource Management): λ¨μΌ μΈμ€ν΄μ€λ₯Ό 보μ₯ν¨μΌλ‘μ¨ Singleton ν¨ν΄μ μ νμ μ΄κ±°λ κ°λΉμΌ μμμ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ λ° λμμ΄ λλ€. μλ₯Ό λ€μ΄ μμ± λΉμ©μ΄ λ§μ΄ λλ λ°μ΄ν°λ² μ΄μ€ μ°κ²°μ ν λ² μΈμ€ν΄μ€ννμ¬ μ ν리μΌμ΄μ μ 체μμ μ¬μ¬μ©ν μ μλ€.
μΌκ΄μ± λ° μ μ΄(Consistency and Control): μ±κΈν€ ν¨ν΄μ κ°μ²΄μ μν λ° λμμ λν μΌκ΄μ±κ³Ό μ μ΄λ₯Ό μ μ§νλ λ° λμμ΄ λλ€. μΈμ€ν΄μ€κ° νλλΏμ΄λ―λ‘ κ°μ²΄μ λν λ³κ²½ μ¬νμ κ°μ²΄μ μ‘μΈμ€νλ λͺ¨λ κ΅¬μ± μμμμ μ¦μ λ³Ό μ μλ€.
μμ‘΄μ± μ£Όμ (Dependency Injection): μμ‘΄μ± μ£Όμ νλ μμν¬μμ μ±κΈν€μ μ¬μ©νμ¬ μΈμ€ν΄μ€λ₯Ό λͺ μμ μΌλ‘ μ λ¬νμ§ μκ³ μ¬λ¬ μλΉμμκ² ν΄λμ€μ λ¨μΌ μΈμ€ν΄μ€λ₯Ό μ 곡ν μ μλ€.
Singleton ν¨ν΄μ μ μ¬μ μΈ λ¨μ κ³Ό μ£Όμ μ¬ν
κΈλ‘λ² μν(Global State): μ±κΈν€μ μ¬μ©νλ©΄ κΈλ‘λ² μνκ° λμ λμ΄ μ½λλ₯Ό ν μ€νΈ, μ΄ν΄ λ° μ μ§ κ΄λ¦¬νκΈ°κ° λ μ΄λ €μμ§ μ μλ€. κΈ΄λ°ν κ²°ν©μΌλ‘ μ΄μ΄μ§κ³ μ ν리μΌμ΄μ μ νμ₯μ±κ³Ό λͺ¨λμ±μ λ°©ν΄ν μ μλ€.
μ€μ© κ°λ₯μ±(Potential Misuse): μ±κΈν€ μ¬μ©μ μ€μ© λ° λ¨μ©λ μ μμΌλ―λ‘ μ μ€νκ² κ³ λ €ν΄μΌ νλ€. ν΄λμ€μ μ€μ λ‘ λ¨μΌ μΈμ€ν΄μ€κ° νμνμ§ μ¬λΆμ μμ‘΄μ± μ£Όμ λλ ν©ν 리μ κ°μ λ체 ν¨ν΄μ΄ λ μ ν©νμ§ μ¬λΆλ₯Ό νκ°νλ κ²μ΄ μ€μνλ€.
ν μ€νΈ κ³Όμ (Testing Challenges): μ±κΈν€ μΈμ€ν΄μ€λ λ체νκ±°λ λͺ¨μνκΈ° μ΄λ €μΈ μ μλ μμ‘΄μ±μ λμ νλ―λ‘ λ¨μ ν μ€νΈλ₯Ό λμ± μ΄λ ΅κ² λ§λ€ μ μλ€. Singleton μμ‘΄μ± μ£Όλ³μμ ν μ€νΈ κ°λ₯ν μ½λλ₯Ό μ€κ³νλ €λ©΄ μ£Όμλ₯Ό κΈ°μΈμ¬μΌ νλ€.
λμμ± κ³ λ € μ¬ν(Concurrency Considerations): λ€μ€ μ€λ λ νκ²½μμ Singleton μΈμ€ν΄μ€λ λμ μ‘μΈμ€λ₯Ό μ μ νκ² μ²λ¦¬νλλ‘ μ€κ³λμ΄μΌ νλ€. κ²½μ 쑰건μ νΌνκ³ μ€λ λ μμ μ 보μ₯νλ €λ©΄ λκΈ°ν λ©μ»€λμ¦ λλ μ§μ° μ΄κΈ°ν κΈ°μ μ μ¬μ©ν΄μΌ νλ€.
Last updated