์ด ๊ธ์
useCallback
์ ํ์ ์ ํํค์น๋ ๊ณผ์ ์์ ๋์จ ์๋ฌธ์ ์ ํด๊ฒฐํ๋ ๊ณผ์ ์ ๋ค๋ฃฌ ๊ธ์ ๋๋ค.
๋๊ธ์ ์ธ์ ๋ ํ์์ ๋๋ค! ๐ ์ฌ๋ฐ๊ฒ ์ฝ์ด์ฃผ์ธ์! ๐
์ ๋ ์งํํ๊ณ ์๋ ํ๋ก์ ํธ์์ typescript
์ react
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํจ์ ์ปดํฌ๋ํธ์ Hooks
๋ฅผ ์กฐํฉํด์ ๊ฐ๋ฐํ๊ณ ์์์ต๋๋ค. ๊ทธ๋ ๊ฒ ๊ฐ๋ฐํ๋ ์ค์ ์ ๋ ์ ๊ฐ ์์ฃผ ์ฌ์ฉํ๋ useCallback
, useState
์ ๊ฐ์ Hooks
์ฝ๋๋ค์ ์ง์ ์ฐพ์๋ณด๊ฒ ๋์ต๋๋ค.
๋จผ์ react
๋ ํฌ์งํ ๋ฆฌ์ ๋ค์ด๊ฐ์ ํด๋ ๊ตฌ์กฐ๋ฅผ ํ์
ํด๋ดค์ต๋๋ค.
react
์ต์์ ํด๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. (ํด๋๋ฅผ ์ ์ธํ ํ์ผ๋ค์ ํฌํจํ์ง ์์์ต๋๋ค.)
// react Hooks์์ค์ ์์น
๐ฆ react
โโ packages
โโ react
โโ src
โโ ReactHooks.js
์ ๊ฐ ๊ฐ์ฅ ๊ถ๊ธํ๋ useCallback
์ ํ์
์ ์ด๋ ๊ฒ ์ ์๋์ด์์์ต๋๋ค. (์์ค ์ฝ๋)
export function useCallback<T>(
callback: T,
deps: Array<mixed> | void | null,
): T {
const dispatcher = resolveDispatcher();
return dispatcher.useCallback(callback, deps);
}
โน๏ธ ์ ๋ณด
react
๋ ์ ์ ํ์ดํ์ ์ํด์typescript
๊ฐ ์๋flow
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ฝ๋๋ฅผ ๋ณด์๋ง์ ๊ฐ์ฅ ๋จผ์ ๋ณด์๋ ๊ฒ์ ๋งค๊ฐ๋ณ์ deps
์ ํ์
์ด์์ต๋๋ค. ์ ๋ flow
๋ฌธ๋ฒ์ ์ ํ ๋ชจ๋ฅด์ง๋ง ์ฝ๋๋ก๋ง ๋ดค์ ๋ deps
์๋ ๋ฐฐ์ด๊ณผ null
, void
(undefined
๋ก ์ถ์ ๋จ) ํ์
๋ค์ด ํ์ฉ๋๋ ๊ฒ์ผ๋ก ๋ณด์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ ๊ธฐ์ต์ ์ํ๋ฉด ํ๋ก์ ํธ์์ useCallback
์ ๋งค๊ฐ๋ณ์ deps
์ ์ธ์๋ก ๋ฐฐ์ด์ด์ธ์ ๊ฐ์ ๋ฃ์์ ๋ ํ์
์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด ์ ์ด ์ด์ํ๋ค๊ณ ์๊ฐํ๋ ์ ๋ ๋ ๋ชจ๋์ด ์ค์ ๋ก ํ์
์ด ๋ค๋ฅธ์ง ํ์ธํด๋ณด๊ธฐ ์ํด typescript
ํ๋ก์ ํธ์ react
์ ํ์
์ ์ ๊ณตํด์ฃผ๋ @types/react
๋ชจ๋์ด ์๋ ๋ ํฌ์งํ ๋ฆฌ๋ก ์ฐพ์๊ฐ์ต๋๋ค.
@types/react
๋ชจ๋์ ์์ค ์ฝ๋๋ DefinitelyTyped
๋ ํฌ์งํ ๋ฆฌ์ ํฌํจ๋์ด ์๋๋ฐ ์ด ๋ ํฌ์งํ ๋ฆฌ๋ ๋ชจ๋ typescript
ํ์ดํ์ ์ ๊ณตํ๋ ํจํค์ง๋ค์ ์์ ํ๊ณ ์์ต๋๋ค.
์์ค ์ฝ๋๋ฅผ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ, DefinitelyTyped
์์ ์ ์๋ useCallback
ํ์
์ ์๋ ์ค์ ๋ก react
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด๋ถ์์ ์ ์๋ ํ์
๊ณผ ๋ฌ๋์ต๋๋ค. (์์ค ์ฝ๋)
// TODO (TypeScript 3.0): <T extends (...args: never[]) => unknown>
function useCallback<T extends (...args: any[]) => any>(callback: T, deps: DependencyList): T;
/**
DefinetlyTyped
์์ ์ ์ํ useEffect
์ deps
์ ํ์
์ react
์์ ์ ์ํ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ ๋ฐฐ์ด๋ง ํ์ฉํ๋ ํ์
์ ๊ฐ์ง๊ณ ์์์ต๋๋ค.
์ฒ์ ์ด ๋ถ๋ถ์ ๋ฐ๊ฒฌํ์ ๋ flow
๋ก ์์ฑ๋ ํ์
์ typescript
๋ก ์ฎ๊ธฐ๋ฉด์ ๋ฐ์ํ ํด๋จผ ์๋ฌ๋ผ๊ณ ์๊ฐํด์ DefinitelyTyped
์ ์ด์๋ก ์ฌ๋ ธ์ต๋๋ค. ํ์ง๋ง ํด๋น ์ด์์์ ๋ค๋ฅธ ์ปจํธ๋ฆฌ๋ทฐํฐ๋ค๊ณผ ์๊ธฐ๋ฅผ ๋๋ ๋ณธ ๊ฒฐ๊ณผ, ๊ฒฐ๋ก ์ "๋ฌธ์ ์๋ค"๋ก ๋๊ฒ ๋์ต๋๋ค.
์ด์ ๋ DefinetlyTyped
์์ ์ ์๋ useCallback
์ ํ์
์๋จ์ ์ ํ ์ฃผ์์์ ์ ์ ์์์ต๋๋ค.
// I made 'inputs' required here and in useMemo as there's no point to memoizing without the memoization key
// useCallback(X) is identical to just using X, useMemo(() => Y) is identical to just using Y.
/**
* `useCallback` will return a memoized version of the callback that only changes if one of the `inputs`
* has changed.
*
* @version 16.8.0
* @see https://reactjs.org/docs/hooks-reference.html#usecallback
*/
useCallback
๊ณผ useMemo
๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์
ํ์ง ์๊ณ ์ฌ์ฉํ ์ด์ ๋ ์๊ธฐ ๋๋ฌธ์ DefinetlyTyped
์์๋ deps
๋งค๊ฐ๋ณ์์ ํ์
์ ๋ฐฐ์ด๋ก ์ค์ ํ์ต๋๋ค.
DefinetlyTyped
์์ ์ ์๋ ํ์
์ ํ๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์
์ ์ง์ ํด์ฃผ๋ ํธ์๋ฅผ ์ํ ๋ชจ๋์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์
์ ๊ทธ๋๋ก ๋ฐ๋ผ๊ฐ์ผ ํ๋ค๊ณ ์๊ฐํ์์ต๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์์ ์
์ฅ์์ ํ์
์ ์ ์ํ๊ฒ ๋๋ฉด ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ์๋ ํ์
์ ๊ทธ๋๋ก ๋ฐ๋ฅด์ง ์๊ณ ์๋ก์ด ํ์
์ ์ง์ ํ ์ ์์์ ์๊ฒ ๋์ต๋๋ค.
2020๋ 6์ ์ด์ ์๊ฒ ๋๊ณ ์ ๋ฆฌ๋ฅผ ์์ํ๋ ํฌ์คํธ์๋๋ฐ โจ๏ธ
๋ค๋ฅธ ํฌ์คํธ ์ฐ๋ ค๊ณ ๋ค์ด์๋ค๊ฐ ์ด์ ์ผ ๋ง๋ฌด๋ฆฌ,,, ๐คฆโโ๏ธ
๋๋ฌด ์ข์ ๊ธ ์ ์ฝ์์ต๋๋ค!