๐Ÿ‘ฉโ€๐Ÿ’ป
Megaptera Frontend
  • ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
    • megaptera-front
    • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 2. TypeScript
      • 3. React
      • 4. Testing Library
      • 5. Parcel & ESLint
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 2. JSX
      • 1. JSX
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 3. React๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ
      • 1. React Component
      • 2. React State
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 4. React Hooks
      • 1. Express
      • 2. Fetch API & CORS
      • 3. React์˜ Hook
      • 4. useRef & Custom Hook
      • 5. usehooks-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 5. ํ…Œ์ŠคํŠธ
      • 1. TDD
      • 2. React Testing Library
      • 3. MSW
      • 4. Playwright
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 6. External Store
      • 1. External Store
      • 2. TSyringe
      • 3. Redux ๋”ฐ๋ผํ•˜๊ธฐ
      • 4. usestore-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 7. React Router
      • 1. Routing
      • 2. Routes
      • 3. Router
      • 4. Navigation
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 8. CSS in JS
      • 1. Design System
      • 2. Style Basics
      • 3. CSS in JS
      • 4. styled-components
      • 5. props์™€ attrs
      • 6. Global Style & Theme
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 9. ์‡ผํ•‘๋ชฐ ๋ชฉ๋ก, ์ƒํ’ˆ ํŽ˜์ด์ง€
      • 1. ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ์ค€๋น„
      • 2. ๋ชฉ๋ก ๋ณด๊ธฐ
      • 3. ์ƒํ’ˆ ์ƒ์„ธ ๋ณด๊ธฐ
      • 4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณด๊ธฐ
      • 5. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ๋‹ด๊ธฐ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 10. ์‚ฌ์šฉ์ž ์ธ์ฆ, ์ธ๊ฐ€
      • 1. ๋กœ๊ทธ์ธ
      • 2. ๋กœ๊ทธ์•„์›ƒ
      • 3. ํšŒ์›๊ฐ€์ž…
      • 4. ์ฃผ๋ฌธ ๋ชฉ๋ก & ์ฃผ๋ฌธ ์ƒ์„ธ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 11. ์ฃผ๋ฌธ, ๊ฒฐ์ œ
      • 1. ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅ
      • 2. ํฌํŠธ์› ๊ฒฐ์ œ ์š”์ฒญ
      • 3. ๋ฐฐ์†ก ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ „๋‹ฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 12. ์–ด๋“œ๋ฏผ
      • 1. ๊ด€๋ฆฌ์ž ์›น ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์‹œ์ž‘
      • 2. ๋กœ๊ทธ์ธ, ์‚ฌ์šฉ์ž ๋ชฉ๋ก
      • 3. ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ
      • 4. ์ฃผ๋ฌธ ๊ด€๋ฆฌ
      • 5. ์ƒํ’ˆ ๊ด€๋ฆฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
Powered by GitBook
On this page
  • 1. TSyringe
  • ํŠน์ง•
  • Props Drilling
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  • ์ƒํƒœ ๋ณ€๊ฒฝ ์•Œ๋ฆผ
  • 2. ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)
  • ์žฅ์ 
  • 3. reflect-metadata
  • TypeScript Decorators
  • 4. Singleton (์‹ฑ๊ธ€ํ†ค)
  • ์žฅ์ 
  • ๋‹จ์ 
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 6. External Store

2. TSyringe

Previous1. External StoreNext3. Redux ๋”ฐ๋ผํ•˜๊ธฐ

Last updated 2 years ago

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

React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ(๐Ÿ‘จโ€๐Ÿ‘ฉโ€๋ถ€๋ชจ -> ๐Ÿ‘ง์ž์‹) props๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ props๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์˜ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์— ์ „ํ•ด์ค˜์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

  1. ๋„ˆ๋ฌด ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ํ•จ

  2. ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ props๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์•„๋„ ๋„˜๊ฒจ์ค˜์•ผ ํ•จ

  3. ํ˜•์ œ ๊ด€๊ณ„์˜ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ props ์ „๋‹ฌ์ด ๋ณต์žก

โ‡’ โš ๏ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์•„์ง€๊ณ , ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ๋งŽ์ด ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์ด ๋‚ฎ์•„์งˆ ์ˆ˜ ์žˆ์Œ

๐Ÿšง Context API

React์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ API Context๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กญ์Šค ๋“œ๋ฆด๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, Context๋Š” ์ „์ฒด๋ฅผ ๋ฐ”๊พธ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ธ ์ธก๋ฉด์ด ์กด์žฌ Redux๋„ Context๋กœ ์Šคํ† ์–ด๋ฅผ ๋‚ด๋ ค์คŒ context ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ „์ฒด๊ฐ€ ๊ฐ•์ œ๋กœ ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

1. ์˜์กด์„ฑ ์„ค์น˜

npm i tsyringe reflect-metadata

(์ฐธ๊ณ ) 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 'reflect-metadata';

import ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ์—๋Ÿฌ ๋ฐœ์ƒ

๐Ÿšจ Error: tsyringe requires a reflect polyfill. Please add 'import "reflect-metadata"' to the top of your entry point.

jest.config.js์— ์„ค์ • ์ถ”๊ฐ€

setupFilesAfterEnv: [
  '@testing-library/jest-dom/extend-expect', 
  '<rootDir>/src/setupTests.ts',	
]

3. tsconfig.json ํŒŒ์ผ์— decorator ์„ค์ • ์ฃผ์„ ํ•ด์ œ

"experimentalDecorators": true,    
"emitDecoratorMetadata": true,  

decorator : @์‚ฌ์šฉํ•˜๊ธฐ

4. Store ํด๋ž˜์Šค ์ƒ์„ฑ

์‹ฑ๊ธ€ํ†ค์œผ๋กœ ๊ด€๋ฆฌํ•  CounterStore ํด๋ž˜์Šค๋ฅผ ์ค€๋น„

import { singleton } from 'tsyringe';

@singleton()
export default class CounterStore {
    // โ€ฆ(์ค‘๋žต)...
}

5. ์‹ฑ๊ธ€ํ†ค Store ๊ฐ์ฒด ์‚ฌ์šฉ

์‹ฑ๊ธ€ํ†ค CounterStore ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉ

import { container } from 'tsyringe';

const counterStore = container.resolve(CounterStore);
  • ์ „์—ญ์—์„œ ํ•˜๋‚˜๋งŒ ์กด์žฌ

  • IoC Container๊ฐ€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์•Œ์•„์„œ ํ•ด์คŒ

  • ์•Œ์•„์„œ ์กฐ๋ฆฝํ•ด์ฃผ๋Š” factory ๊ธฐ๋Šฅ ํƒ‘์žฌ

6. ํ…Œ์ŠคํŠธ์—์„œ ์ดˆ๊ธฐํ™”ํ•˜๊ธฐ

ํ…Œ์ŠคํŠธ์—์„œ TSyringe์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Œ

beforeEach(() => {
    container.clearInstances();
});

์ƒํƒœ ๋ณ€๊ฒฝ ์•Œ๋ฆผ

Store๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  action์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์—ฐ๊ฒฐ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ forceUpdate ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ด๋‹น Store์—์„œ ์ƒํƒœ๋ฅผ ์–ป์–ด์„œ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์„ ์–ธํ˜• UI๊ฐ€ ์–ผ๋งˆ๋‚˜ ํŽธํ•œ์ง€ ์ ˆ์‹คํžˆ ๋А๋‚„ ์ˆ˜ ์žˆ๋Š” ํฌ์ธํŠธ

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

๋ญ”๊ฐ€๋ฅผ ์“ฐ๊ณ  ์‹ถ์„ ๋•Œ, ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์–ป๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ œ๋Œ€๋กœ๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ป์–ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉ ์˜์กด์„ฑ ์ฃผ์ž…(dependency injection)์€ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์˜์กด์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ํ…Œํฌ๋‹‰

์žฅ์ 

  • ๋ชจ๋“ˆ ๊ฐ„ ๊ฒฐํ•ฉ์„ ๋А์Šจํ•˜๊ฒŒ ๋งŒ๋“ฆ

  • ๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ์˜ ๊ด€์‹ฌ์‚ฌ ๋ถ„๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ฐ€๋…์„ฑ๊ณผ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ ๋†’์ž„

    • ๊ฐ๊ฐ์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ด๋„ ๋จ

  • ์˜์กด๊ด€๊ณ„ ์—ญ์ „ ์›์น™๊ณผ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ๋”ฐ๋ฅด๋„๋ก ํด๋ผ์ด์–ธํŠธ์˜ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์‚ฌ์šฉ์ž์˜ ํ–‰์œ„๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌ

  • ๋ชจ์˜ ๊ฐ์ฒด(๋ชจํ‚น) ๋“ฑ์„ ์ด์šฉํ•œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์˜ ํŽธ์˜์„ฑ์„ ๋†’์—ฌ์คŒ

3. reflect-metadata

TSyringe๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋””์ž์ธํ•˜๊ธฐ ์œ„ํ•ด TypeScript์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€ reflect-metadata๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค, ํด๋ž˜์Šค ํ•„๋“œ ๋“ฑ์— ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ : ์‹ค์ œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด

TypeScript Decorators

TypeScript ๋ฐ ES6์— ํด๋ž˜์Šค๊ฐ€ ๋„์ž…๋˜๋ฉด์„œ, ํด๋ž˜์Šค ๋ฐ ํด๋ž˜์Šค ๋ฉค๋ฒ„์— ์ฃผ์„์„ ๋‹ฌ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ด์ง ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” ํด๋ž˜์Šค ์„ ์–ธ ๋ฐ ๋ฉค๋ฒ„์— ๋Œ€ํ•œ ์ฃผ์„๊ณผ ๋ฉ”ํƒ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ตฌ๋ฌธ์„ ๋ชจ๋‘ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋Š” JavaScript์˜ 2๋‹จ๊ณ„ ์ œ์•ˆ์ด์ž, TypeScript์˜ ์‹คํ—˜์  ๊ธฐ๋Šฅ

import { singleton } from 'tsyringe';

@singleton()
export default class CounterStore {
  // ๋‚ด์šฉ
}

4. Singleton (์‹ฑ๊ธ€ํ†ค)

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์ง€๋Š” ํŒจํ„ด ์ „์—ญ์—์„œ ํ•˜๋‚˜

์žฅ์ 

  • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์— ์žฅ์ 

  • ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋น„์šฉ์ด ์ค„์–ด๋“ฆ

  • I/O ๋ฐ”์šด๋“œ ์ž‘์—…์— ๋งŽ์ด ์‚ฌ์šฉ

    • ๋„คํŠธ์›Œํฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์š”์ฒญํ•˜๋Š” ๊ฒƒ

    • ๊ณ„์‚ฐ์„ ์™„๋ฃŒํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์ฃผ๋กœ ์ž…๋ ฅ/์ถœ๋ ฅ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ ๊ธฐ๊ฐ„์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ์กฐ๊ฑด

    • ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ์†Œ์š”

    • ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋น„์šฉ์ด ๋งŽ์ด๋“ฆ

๋‹จ์ 

  • ์˜์กด์„ฑ์ด ๋†’์•„์ง

  • TDD์— ๋‹จ์  (Test Driven Development ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ)

    • TDD๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ฃผ๋กœ ํ•จ

    • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์„œ๋กœ ๋…๋ฆฝ์ ์ด์–ด์•ผ ํ•จ

    • ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋–ค ์ˆœ์„œ๋กœ๋“  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

    • ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋œ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํŒจํ„ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ ํ…Œ์ŠคํŠธ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์–ด๋ ค์›€

TSyringe
The problem with passing props
๐Ÿ”— ์‹ค์Šต ๋งํฌ
reflect-metadata
core-js (core-js/es7/reflect)
reflection
์˜์กด์„ฑ ์ฃผ์ž…
reflect-metadata
Introduction to โ€œreflect-metadataโ€ package
Decorators
Singleton ํŒจํ„ด