Study_Develop/ํฌ์Šค์ฝ” X ์ฝ”๋”ฉ์˜จ ๋ถ€ํŠธ์บ ํ”„

ํฌ์Šค์ฝ” X ์ฝ”๋”ฉ์˜จ 7๊ธฐ 9์ฃผ์ฐจ ch3. React (Hooks - useMemo, useCallback)

hiijihyun 2023. 6. 26. 00:52
๋ฐ˜์‘ํ˜•

- react state์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์„ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜

(ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ๊ฐ€๋Šฅํ–ˆ๋˜

state(์ƒํƒœ๊ด€๋ฆฌ) ์™€ lifecycle(๋ผ์ดํ”„์‚ฌ์ดํด)์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋•๋Š” ๊ธฐ๋Šฅ)

 

- class ์•ˆ์—์„œ๋Š” ๋™์ž‘X

๋Œ€์‹ , class์—†์ด react๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ

 

- ํ•˜์ง€๋งŒ, ์ด๋ฏธ ์งœ๋†“์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ 

๋ชจ์กฐ๋ฆฌ ์žฌ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅ X

 

- ์ตœ์ƒ์œ„ ๋‹จ๊ณ„์—์„œ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ

(์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ X,

๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ!)

 

- Hook์€ ์˜ค๋กœ์ง€ Reactํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ๋งŒ

ํ˜ธ์ถœ ๊ฐ€๋Šฅ

 

์ข…๋ฅ˜

- useState()

: ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ

: ๋™์  ์ƒํƒœ ๊ด€๋ฆฌ

: ํด๋ž˜์Šค ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ state

 

- useEffect()

sideEffect๋ฅผ ์ˆ˜ํ–‰ (mount, unmount, update)

: ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์˜ componentDidMount์™€

componentDidUpdate๊ฐ€ ํ•ฉ์ณ์ง„ ํ˜•ํƒœ

: ์ปดํฌ๋„ŒํŠธ๊ฐ€ rendering๋  ๋•Œ๋งˆ๋‹ค ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰

: Mount(์ตœ์ดˆ rendering) ๋  ๋•Œ๋งŒ ์‹คํ–‰

 

useEffect(()=>{
    console.log("์ฒ˜์Œ ๋ Œ๋”๋ง ๋  ๋•Œ๋งŒ ์‹คํ–‰๋จ!");
 }, []);

: ๋นˆ ๋ฐฐ์—ด์ด ์žˆ์œผ๋ฉด ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ๋งŒ๋‹ค๋Š” ๋œป!

 

useEffect(()=>{
   console.log(name);
 }, [name]);

: ํŠน์ • ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งŒ ์‹คํ–‰ํ•œ๋‹ค๋Š” ๋œป

 

useEffect(()=>{
   console.log("effect");
   console.log(name);
   
   return ()=>{
      console.log("cleanup");
      console.log(name);
      };
 });

: ์ปดํฌ๋„ŒํŠธ๊ฐ€ update๋˜๊ธฐ ์ง์ „์— ์ž‘์—…์„ ์ˆ˜ํ–‰

-> cleanup(๋’ท์ •๋ฆฌ ํ•จ์ˆ˜) ์ด์šฉ

 

 

- useRef()

: ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ref๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” Hook

: useRef()๋Š” ์ธ์ž๋กœ ๋ฐ›์€ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ

๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ref๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

: ref.current ๋กœ ํ˜„์žฌ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด์— ์ ‘๊ทผ ๊ฐ€๋Šฅ

 


useMemo, callback

useMemo๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”

๋Œ€ํ‘œ์ ์ธ react hooks ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

 

useMemo์—์„œ memo๋Š” Memoization์„ ๋œปํ•œ๋‹ค.

๊ธฐ์กด์— ์ˆ˜ํ–‰ํ•œ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•ด ๋‘๊ณ 

๋™์ผํ•œ ์ž…๋ ฅ์ด ๋“ค์–ด์˜ค๋ฉด ์žฌํ™œ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

 

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ž€?

 

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ๋ƒฅ ํ•จ์ˆ˜์ž„.

 

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ ํ•จ์ˆ˜(์ปดํฌ๋„ŒํŠธ)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋งํ•จ

ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋‚ด๋ถ€์— ์„ ์–ธ๋˜์–ด ์žˆ๋˜ ํ‘œํ˜„์‹(๋ณ€์ˆ˜, ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜ ๋“ฑ) ๋„ 

๋งค๋ฒˆ ๋‹ค์‹œ ์„ ์–ธ๋˜์–ด ์‚ฌ์šฉ๋จ

 

์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ state๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜,

๋ถ€๋ชจ์—๊ฒŒ์„œ ๋ฐ›๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งˆ๋‹ค

๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค.

์‹ฌ์ง€์–ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์ตœ์ ํ™” ์„ค์ •์„ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด

๋ถ€๋ชจ์—๊ฒŒ์„œ ๋ฐ›๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋”๋ผ๋„

๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š”๊ฒŒ ๊ธฐ๋ณธ!

 

์—ฌ๊ธฐ์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ!

 

์˜ˆ๋ฅผ ๋“ค์–ด state, props๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ผ๋ฉด?

๊ทธ ์—ฌ๋Ÿฌ๊ฐ€์ง€ state, props๊ฐ€ ์ „๋ถ€ ์žฌ ๋žœ๋”๋ง ๋œ๋‹ค๋ฉด?

 

๊ต‰์žฅํžˆ ๋น„ ํšจ์œจ์ ์ด๋‹ค!

 

 

useMeomo๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด?

 

์ฒ˜์Œ์— ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•ด์„œ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ Œ๋”๋ง์ด ๋˜์–ด๋„ ๊ณ„์† calculate๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ 

์ด์ „์— ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊บผ๋‚ด์™€์„œ 

์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.

 

๊ทธ๋ž˜์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ, ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ์„

ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค!

 

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

: ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์— ๋‚˜์˜จ ๊ฒƒ!

 

 //๋žœ๋”๋ง ๊ณผ์ •์—์„œ list๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์‹คํ–‰
  const avg = useMemo(() => {
    return avgFunc(list);
  }, [list]);

์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉ!

 

 

useCallback ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด?

 

const memoizedCallback = useCallback(
  () => {
    doSomething(a, b);
  },
  [a, b],
);

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š”

useCallback์˜ˆ์‹œ์ฝ”๋“œ!

 

//useCallback()
  //๋ฐ˜๋ณตํ•ด์„œ ์ƒ์„ฑ๋˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ useCallback์œผ๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด
  //ํ•จ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋žœ๋”๋ง๋˜๋„ ๊ธฐ์กด์˜ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋Š”
  //๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
  const withCallback = useCallback(() => {
    console.log("withCallback", count);
    setCount(count + 1);
  }, [count]);

์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉ!

 

 

๊ทธ๋ ‡๋‹ค๋ฉด useCallback๊ณผ useMemo์˜ ์ฐจ์ด์ ์€??

๊ณตํ†ต์  : ์„ฑ๋Šฅ ์ตœ์ ํ™”

์ฐจ์ด์  :

useMemo : '๊ฐ’'์„ ์žฌ์‚ฌ์šฉ

: ๊ฐ’์˜ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ

useCallback : 'ํ•จ์ˆ˜'๋ฅผ ์žฌ์‚ฌ์šฉ

: ํ•จ์ˆ˜์˜ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ „๋‹ฌ๋œ 'ํ•จ์ˆ˜ ์ž์ฒด'๋ฅผ ์ €์žฅ