memoized function์ ๋ฐํ ํด์ฃผ๋ hook์ด์์!
๊ฐ์ด ์๋ function์ ๋ฐํํด์ฃผ๋๊ฑฐ์์!
ํ๋ฒ decalre( ์ด ํ '์ ์ธ' ) ๋์๋ ํจ์๋ฅผ ์ฌ์ฐจ declare ์ํด๋ ๋๋ค๋ ๊ฑฐ์์. ^^
memoized!!
์๋๋๋ค!
dependency์ ๋ฃ์ด์ค ๊ฐ์ด ๋ณ๊ฒฝ์ ํ ์์, ์ฌ์ฐจ ์ ์ธ์ ํด์ค์!!
**์ฐธ์กฐ ํต์ผ์ฑ(Referencial equality)**์ ์ฐธ๊ณ ํ์๋ฉด, ๊ฐ์ ๋ณ๊ฒฝ์ด ์ธ์ ์ผ์ด๋๋์ง ํ์ธ ํ ์ค ์ ์์ด์!
/* Primitive Values */
true === true // true
false === false // true
1 === 1 // true
'a' === 'a' // true
/* Reference Values */
{} === {} // false
[] === [] // false
() => {} === () => {} // false
const z = {}
z === z // trueโ ์! ๊ทธ๋ผ ์ปดํฌ๋ํธ์ ์ ์ธ๋๋ ํจ์๋ค์ ๋งค๋ฒ useCallback์ผ๋ก ๊ฐ์ธ์ค์ผ๊ฒ ๋ค์!
์๋๋๋ค!!
๊ฐ๋ฒผ์ด ํจ์๋ค์ ์ ์ฉ์ ์ํด๋ ๋ฉ๋๋ค.
์ต์ ํ๋ฅผ ํ ๋ ค๋ค, ์ต์ ํ๊ฐ ๋์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ธฐ ๋๋ฌธ์ ๋๋ค.
โ ์? ์ต์ ํ๋ฅผ ์ํ ์ฝ๋์ธ๋ฐ, ๋๋ ค ์ต์ ํ๊ฐ ์๋๋ค๋๊ฒ ๋ฌด์จ ๐ถ์๋ฆฌ์์?
์ต์ ํ๋ผ๋๊ฑด ๊ฒฐ๊ตญ trade-off(๋ฑ๊ฐ๊ตํ)์์.
Every line of code which is executed comes with a cost.
๋๊ฐ ์๋ ์ฝ๋๋ ์์ด์!
// #1
const hello = () => {}
// #2
const hello = useCallback(() => {}, [])
์ฒซ๋ฒ ์จฐ ์ฝ๋์ ๋๋ฒ ์งธ ์ฝ๋๋ฅผ ์ฑ๋ฅ์ ๋น๊ตํ๋ฉด ์ด๋ค๊ฒ ๋ ์ข์๊น์?
1๋ฒ ์ ๋๋ค. ๐คฆโโ๏ธ
์ดํดํ๊ธฐ ์ฝ๋๋ก, 2๋ฒ์ ํ์ด๋ณด๋ฉด
// refactored #2
const hello = () => {}
const helloCallback = useCallback(hello, []);hello๋ ์ ์ธ ํด์ค์ผ ๋๋ฉด์, ๐คฆโโ๏ธ
useCallback ํจ์์ property ์ธํ
๊ณผ ์์ ๊ธฐํ ๋ก์ง๋ ๋์๊ฐ๊ณ ... ๐คฆโโ๏ธ
dependency๋ฅผ ์ก์์ฃผ๋ [] ๋ฐฐ์ด์์๋ ๋ฌด์์ด ๋ค์ด๊ฐ์๋์ง๋ ํ์ธํด์ผ ๋๋ค์....๐คฆโโ๏ธ
(TMI)
๋๊ตฐ๋ค๋, 1๋ฒ ์ฝ๋์ hello ํจ์๋ garbage collected๊ฐ ๋๋ ๋ฐ๋ฉด!
2๋ฒ ์ฝ๋์์ hello ํจ์๋ garbage collected๊ฐ ๋์ง ์์ต๋๋ค.
โป garbage collected๊ฐ ๋ฌด์์ธ์ง ๊ถ๊ธํ์๋ฉด ํ๋จ ์ถ์ฒ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
๋ค์ ์์ ์ผ๋ก ๋์๊ฐ์,
"์ปดํฌ๋ํธ์ ์ ์ธ๋๋ ํจ์๋ค์ ๋งค๋ฒ useCallback์ผ๋ก ๊ฐ์ธ์ค์ผ๊ฒ ๋ค์!"
NO NO NO
๊ฐ๋จํ ์์
์กฐ์ฐจ ์ต์ ํ๋ฅผ ์งํํ๋ฉด,
๋ฉ๋ชจ๋ฆฌ์ ๋ ๋ฌด๋ฆฌ๋ฅผ ์ฃผ๋ ํ๋์ผ๋ก ์ด์ด์ง๋๋ค.
"๊ณผ์ ๋ถ๊ธ"
๋ฌผ๋ก ,
๋ธ๋ผ์ฐ์ ๋ ๋๋ํ๊ณ ,
๋ฆฌ์กํธ๋ ๋๋ํ๊ธฐ์,
์์ ์ธ๊ธํ ์ฌ์ํ ์ผ์ด์ค๋ ๋ณ ๋ค๋ฅธ impact๋ฅผ ์ฃผ์ง ์์์.
ํฌ๊ฒ, ๋๊ฐ์ ์ค์ ์ผ๋ก ๋ณด์๋ฉด ๋ฉ๋๋ค.
- ์ฐธ์กฐ ํต์ผ์ฑ์ ํ๊ณ ์ถ์ ๋
- ๊ณ์ฐ ๋น์ฉ์ด ๋น์ผ ๋๋ ํน์ ๋ณต์กํ ๋ก์ง์ด ์์ ๋
์ค๋ ์ค๋นํ ์ฝ๋๋ถํฐ ๋ณด์์ฃ .
(๋ผ์ด๋ธ ์ฝ๋ฉ ์ค๋ช ์งํ)
See Also: