tsyringe
๐ฒ TSyringe
TSyringe๋ ์์กด์ฑ ์ฃผ์ (Dependency Injection)์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๐ ์์กด์ฑ ์ฃผ์
(Dependency Injection)
์ฌ๋ฌ ์ปดํฌ๋ํธ๊ฐ ์์ ๋, ํ๋์ ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฑฐ๋ ์ฐธ์กฐํ ๋, ์์กด์ฑ์ด ์๊ธด๋ค. ์์กด์ฑ ์ฃผ์ ์ ์ด๋ฐ ์์กด์ฑ์ ๋์จํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋์์ธ ํจํด์ด๋ค.
๐ ์์กด์ฑ ์ฃผ์
์ ์ฅ์
์ปดํฌ๋ํธ ๊ฐ์ ์์กด์ฑ์ด ์ค์ด๋ค์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐ์ด ๊ฐ๋ฅํด์ง๋ค.
์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ฌ์์ง๋ค.
๋ชจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ํ ์คํธํ๊ธฐ ์ฌ์์ง๋ค.
๐ reflect-metadata
practice code
// store/Store.ts
import 'reflect-metadata';
@singleton()
export default class Store {
count = 0;
listeners = new set();
update() {
this.listeners.forEach((listeners) => {
listeners();
})
}
addListener(listener) {
this.listeners.add(listener);
}
removeListener(listener) {
this.listeners.delete(listener);
}
}
// component/CountControl.tsx
import { container } from "tsyringe";
import Store from "../store/Store";
export default function CountControl() {
const store = container.resolve(Store);
const handleClickIncrease = () => {
store.count += 1;
store.publish();
}
const handleClickDecrease = () => {
store.count -= 1;
store.publish();
}
return (
<div>
<button onClick={handleClickIncrease}>
Increase
</button>
<button onClick={handleClickDecrease}>
Decrease
</button>
</div>
)
}
// component/Counter.tsx
import { container } from "tsyringe";
import Store from "../store/Store";
export default function Counter() {
const store = container.resolve(Store);
// ๊ฐ์ ๋ฆฌ๋๋๋ง ํด์ฃผ๋ ํจ์
const forceUpdate = useForceUpdate();
store.forceUpdates.add(forceUpdate);
useEffect(() => {
store.addListener(forceUpdate);
return () => {
store.removeListener(forceUpdate);
}
}, [store, forceUpdate])
return (
<div>
<p>{store.count}</p>
</div>
)
}
// App.test.tsx
import { render, screen, fireEvent } from '@testing-library/react';
const context = describe;
describe('APP', () => {
beforeEach(() => {
container.clearInstances();
})
context('when press increase button once', () => {
test('counter', () => {
render(<APP />);
fireEvent.click(screen.getByText('Increase'));
const elements = screen.getAllByText('1');
expect(elements).toHaveLength(1);
})
})
})
๐ singleton (์ฑ๊ธํค)
์ฑ๊ธํค ํจํด์ ์์ฑ์๊ฐ ์ฌ๋ฌ ์ฐจ๋ก ํธ์ถ๋๋๋ผ๋ ์ค์ ๋ก ์์ฑ๋๋ ๊ฐ์ฒด๋ ํ๋์ด๊ณ , ์ต๊ณ ์์ฑ ์ดํ์ ํธ์ถ๋ ์์ฑ์๋ ์ต์ด์ ์์ฑ์๊ฐ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๋ค.
ํ๋์ ๊ฐ์ฒด๋ง ์กด์ฌํ๋ค
ํ๋ก๊ทธ๋จ ๋ด์์ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ณต์ ํด์ ์ฌ์ฉํ๋ค.
โ๏ธ ์ ๋ฆฌ
๊ณต๋ถํ ๋ด์ฉ
๋ ๊ณต๋ถํ ๊ฒ
Last updated