2. TSyringe
1. TSyringe
๋ง์ดํฌ๋ก์ํํธ์์ ๋ง๋ TypeScript์ฉ DI ๋๊ตฌ(IoC Container)
Lightweight dependency injection container for JavaScript/TypeScript ๊ฐ๋ฒผ์ด JavaScript/TypeScript์ฉ ์ข ์์ฑ ์ฃผ์ ์ปจํ ์ด๋
๐ Syringe ์ฃผ์ฌ๊ธฐ
ํน์ง
External Store๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ํ์ฉํ ์ ์์
React ์ปดํฌ๋ํธ ์ ์ฅ์์๋ ์ ์ญ์ฒ๋ผ ์ธ ์๋ ์์
Props Drilling ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋ (React๋ก ํ์ ํ๋ฉด Context๋ ์ฌ์ฉ ๊ฐ๋ฅ)
Props Drilling
The problem with passing props
React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ ์์์ ์๋๋ก(๐จโ๐ฉโ๋ถ๋ชจ -> ๐ง์์) props๋ฅผ ํตํด ์ ๋ฌ props๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์ ์ ํด์ค์ผํ๋ ๊ฒฝ์ฐ์ ๋ฐ์ํ๋ ๋ฌธ์
๋๋ฌด ๋ง์ ์ปดํฌ๋ํธ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํจ
์ค๊ฐ ์ปดํฌ๋ํธ๊ฐ props๋ฅผ ์ด์ฉํ์ง ์์๋ ๋๊ฒจ์ค์ผ ํจ
ํ์ ๊ด๊ณ์ ์ปดํฌ๋ํธ ๊ฐ์ props ์ ๋ฌ์ด ๋ณต์ก
โ โ ๏ธ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๊ณ , ์ปดํฌ๋ํธ๋ฅผ ๋ ๋ง์ด ๊ฑฐ์ณ์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ง ๋ณด์์ฑ์ด ๋ฎ์์ง ์ ์์
๐ง Context API
React์์ ์ ๊ณตํ๋ ๋ด์ฅ API Context๋ฅผ ์ฌ์ฉํด์ ํ๋กญ์ค ๋๋ฆด๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๋ ์์ง๋ง, Context๋ ์ ์ฒด๋ฅผ ๋ฐ๊พธ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ธ ์ธก๋ฉด์ด ์กด์ฌ Redux๋ Context๋ก ์คํ ์ด๋ฅผ ๋ด๋ ค์ค context ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ ์ฒด๊ฐ ๊ฐ์ ๋ก ๋ฆฌ๋ ๋๋ง ๋ฐ์
์ฌ์ฉ ๋ฐฉ๋ฒ
1. ์์กด์ฑ ์ค์น
(์ฐธ๊ณ ) reflect-metadata๊ฐ ์๋ ๋ค๋ฅธ ๊ฒ์ ์ค์นํด๋ ๋จ
Add a polyfill for the Reflect API (examples below use reflect-metadata). You can use:
2. reflect-metadata import
src/main.tsx
ํ์ผ๊ณผ src/setupTests.ts
ํ์ผ์์ reflect-metadata๋ฅผ import
๋ชจ๋ ๊ฒ์ด ์์ํ๋ ๊ณณ์ import
import ํ์ง ์์ ๊ฒฝ์ฐ ์๋ฌ ๋ฐ์
๐จ Error: tsyringe requires a reflect polyfill. Please add 'import "reflect-metadata"' to the top of your entry point.
jest.config.js
์ ์ค์ ์ถ๊ฐ
3. tsconfig.json
ํ์ผ์ decorator ์ค์ ์ฃผ์ ํด์
tsconfig.json
ํ์ผ์ decorator ์ค์ ์ฃผ์ ํด์ decorator : @์ฌ์ฉํ๊ธฐ
4. Store ํด๋์ค ์์ฑ
์ฑ๊ธํค์ผ๋ก ๊ด๋ฆฌํ CounterStore ํด๋์ค๋ฅผ ์ค๋น
5. ์ฑ๊ธํค Store ๊ฐ์ฒด ์ฌ์ฉ
์ฑ๊ธํค CounterStore ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ
์ ์ญ์์ ํ๋๋ง ์กด์ฌ
IoC Container๊ฐ ๊ฐ์ฒด ์์ฑ์ ์์์ ํด์ค
์์์ ์กฐ๋ฆฝํด์ฃผ๋ factory ๊ธฐ๋ฅ ํ์ฌ
6. ํ
์คํธ์์ ์ด๊ธฐํํ๊ธฐ
ํ ์คํธ์์ TSyringe์์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ์ ์์
์ํ ๋ณ๊ฒฝ ์๋ฆผ
Store๋ ์ด๋ค ์์ผ๋ก๋ action์ ์ฒ๋ฆฌํ๊ณ , ์ํ๊ฐ ๋ฐ๋๋ฉด ์ฐ๊ฒฐ๋ ์ปดํฌ๋ํธ๋ฅผ forceUpdate ์ปดํฌ๋ํธ๋ ํด๋น Store์์ ์ํ๋ฅผ ์ป์ด์ UI๋ฅผ ์ ๋ฐ์ดํธํ๊ฒ ๋๋๋ฐ, ์ ์ธํ UI๊ฐ ์ผ๋ง๋ ํธํ์ง ์ ์คํ ๋๋ ์ ์๋ ํฌ์ธํธ
2. ์์กด์ฑ ์ฃผ์
(Dependency Injection)
๋ญ๊ฐ๋ฅผ ์ฐ๊ณ ์ถ์ ๋, ์ ์ญ๋ณ์๋ฅผ ํตํด ์ป๋ ๊ฒ์ด ์๋๋ผ ์ ๋๋ก๋ ๋ฐฉ๋ฒ์ผ๋ก ์ป์ด์ ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉ ์์กด์ฑ ์ฃผ์ (dependency injection)์ ํ๋์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ์์กด์ฑ์ ์ ๊ณตํ๋ ํ ํฌ๋
์ฅ์
๋ชจ๋ ๊ฐ ๊ฒฐํฉ์ ๋์จํ๊ฒ ๋ง๋ฆ
๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฌ์ฉ์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ฅผ ํตํด ๊ฐ๋ ์ฑ๊ณผ ์ฝ๋ ์ฌ์ฌ์ฉ์ ๋์
๊ฐ๊ฐ์ด ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๋์ง ์์ง ๋ชปํด๋ ๋จ
์์กด๊ด๊ณ ์ญ์ ์์น๊ณผ ๋จ์ผ ์ฑ ์ ์์น์ ๋ฐ๋ฅด๋๋ก ํด๋ผ์ด์ธํธ์ ์์ฑ์ ๋ํ ์์กด์ฑ์ ์ฌ์ฉ์์ ํ์๋ก๋ถํฐ ๋ถ๋ฆฌ
๋ชจ์ ๊ฐ์ฒด(๋ชจํน) ๋ฑ์ ์ด์ฉํ ๋จ์ ํ ์คํธ์ ํธ์์ฑ์ ๋์ฌ์ค
3. reflect-metadata
reflect-metadata Introduction to โreflect-metadataโ package
TSyringe๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋์์ธํ๊ธฐ ์ํด TypeScript์์ ์ฌ์ฉํ๋ ํจํค์ง reflect-metadata๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค, ํด๋์ค ํ๋ ๋ฑ์ ์ฌ์ฉ์ ์ง์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ์ ์์
๋ฉํ๋ฐ์ดํฐ : ์ค์ ๋ฐ์ดํฐ์ ๋ํ ์ถ๊ฐ ์ ๋ณด
TypeScript Decorators
TypeScript ๋ฐ ES6์ ํด๋์ค๊ฐ ๋์
๋๋ฉด์, ํด๋์ค ๋ฐ ํด๋์ค ๋ฉค๋ฒ์ ์ฃผ์์ ๋ฌ๊ฑฐ๋ ์์ ํ๋ ๊ฒ์ ์ง์ํ๊ธฐ ์ํด ์ถ๊ฐ ๊ธฐ๋ฅ์ด ํ์ํด์ง
๋ฐ์ฝ๋ ์ดํฐ๋ ํด๋์ค ์ ์ธ
๋ฐ ๋ฉค๋ฒ์ ๋ํ ์ฃผ์๊ณผ ๋ฉํ ํ๋ก๊ทธ๋๋ฐ ๊ตฌ๋ฌธ์ ๋ชจ๋ ์ถ๊ฐ
ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณต
๋ฐ์ฝ๋ ์ดํฐ๋ JavaScript์ 2๋จ๊ณ ์ ์์ด์, TypeScript์ ์คํ์ ๊ธฐ๋ฅ
4. Singleton (์ฑ๊ธํค)
ํ๋์ ํด๋์ค์ ํ๋์ ์ธ์คํด์ค๋ง ๊ฐ์ง๋ ํจํด ์ ์ญ์์ ํ๋
์ฅ์
์ธ์คํด์ค ์์ฑ์ ์ฅ์
ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด๋น ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๋ชจ๋๋ค์ด ๊ณต์ ํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค ์์ฑ ๋น์ฉ์ด ์ค์ด๋ฆ
I/O ๋ฐ์ด๋ ์์ ์ ๋ง์ด ์ฌ์ฉ
๋คํธ์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ์ผ ์์คํ ์ ์์ฒญํ๋ ๊ฒ
๊ณ์ฐ์ ์๋ฃํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์ฃผ๋ก ์ ๋ ฅ/์ถ๋ ฅ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ ๊ธฐ๊ฐ์ ์ํด ๊ฒฐ์ ๋๋ ์กฐ๊ฑด
์๊ฐ์ด ์ค๋ ์์
์ธ์คํด์ค ์์ฑ ๋น์ฉ์ด ๋ง์ด๋ฆ
๋จ์
์์กด์ฑ์ด ๋์์ง
TDD์ ๋จ์ (Test Driven Development ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ)
TDD๋ ๋จ์ ํ ์คํธ๋ฅผ ์ฃผ๋ก ํจ
๋จ์ ํ ์คํธ๋ ํ ์คํธ๊ฐ ์๋ก ๋ ๋ฆฝ์ ์ด์ด์ผ ํจ
ํ ์คํธ๋ฅผ ์ด๋ค ์์๋ก๋ ์คํํ ์ ์์ด์ผ ํจ
์ฑ๊ธํค ํจํด์ ๋ฏธ๋ฆฌ ์์ฑ๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ ํจํด์ด๊ธฐ ๋๋ฌธ์, ๊ฐ ํ ์คํธ๋ง๋ค ๋ ๋ฆฝ์ ์ธ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ค์
Last updated