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