๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ”„๋ก ํŠธ์—”๋“œ/React

useEffect์™€ useMemo

by alswlfl 2022. 11. 23.

useEffect ํ•จ์ˆ˜

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ ๋งˆ๋‹ค ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Hook

component๊ฐ€ mount ๋˜์—ˆ์„ ๋•Œ[์ฒ˜์Œ ๋‚˜ํƒ€๋‚ฌ์„ ๋•Œ], component๊ฐ€ unmount๋˜์—ˆ์„ ๋•Œ[์‚ฌ๋ผ์งˆ ๋•Œ], component๊ฐ€ update๋˜์—ˆ์„ ๋•Œ[ํŠน์ • props๊ฐ€ ๋ฐ”๋€” ๋•Œ]

๊ธฐ๋ณธ ํ˜•ํƒœ

useEffect(function, deps)

  • function: ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์ž‘์—…[ํ•จ์ˆ˜]
  • deps: ๋ฐฐ์—ด ํ˜•ํƒœ, ๋ฐฐ์—ด ์•ˆ์—๋Š” ๊ฒ€์‚ฌํ•˜๊ณ ์ž ํ•˜๋Š” ํŠน์ • ๊ฐ’ ํ˜น์€ ๋นˆ ๋ฐฐ์—ด[์˜์กด๋˜๋Š” ๊ฐ’๋“ค]
    • cleanup ํ•จ์ˆ˜: ํ•จ์ˆ˜ ๋ฐ˜ํ™˜, deps๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ํ˜ธ์ถœ๋จ
  • ์˜์กด๋˜๋Š” ๊ฐ’์˜ ๋ฐฐ์—ด์ด ๋น„์–ด ์žˆ์œผ๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ์—๋งŒ ์ž‘์—…์ด ์‹คํ–‰๋˜๊ณ , ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์งˆ ๋•Œ๋Š” returnํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
useEffect(()=>{
	//mount
    console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚จ');
    
    return()=>{
    //unmount
        console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์ง');
    }
}, [])

mount/unmount

mount ์‹œ์— ํ•˜๋Š” ์ž‘์—…

  • props๋กœ ๋ฐ›์€ ๊ฐ’์„ ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ์ปฌ ์ƒํƒœ๋กœ ์„ค์ • → ๋ฐ›์•„์˜จ props๋ฅผ ๊ฐ์ฒด์˜ state๋กœ ์„ค์ •
  • ์™ธ๋ถ€ API ์š”์ฒญ(REST API ๋“ฑ)
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ(D3, Video.js ๋“ฑ)
  • setInterval์„ ํ†ตํ•œ ๋ฐ˜๋ณต ์ž‘์—… ํ˜น์€ setTimeout์„ ํ†ตํ•œ ์ž‘์—… ์˜ˆ์•ฝ

unmount ์‹œ์— ํ•˜๋Š” ์ž‘์—…

  • ๋’ท ์ •๋ฆฌ ํ•จ์ˆ˜
  • setInterval, setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ ๋“ฑ๋กํ•œ ์ž‘์—…๋“ค clearํ•˜๊ธฐ(clearInterval, clearTimeout)
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ธ์Šคํ„ด์Šค ์ œ๊ฑฐ

deps์— ํŠน์ • ๊ฐ’ ๋„ฃ๊ธฐ

์˜์กด์„ฑ์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ๊ทธ ๊ฐ’์˜ ํŠน์ • ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๊ฐ’์˜ ๊ฐ์ฒด ์ถœ๋ ฅ

  • deps์— ํŠน์ • ๊ฐ’์„ ๋„ฃ๊ฒŒ ๋œ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋งˆ์šดํŠธ ๋  ๋•Œ์—๋„ ํ˜ธ์ถœ์ด ๋˜๊ณ , ์ง€์ •ํ•œ ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋„ ํ˜ธ์ถœ ๋จ
  • deps์•ˆ์— ํŠน์ • ๊ฐ’์ด ์žˆ์œผ๋ฉด ์–ธ๋งˆ์šดํŠธ์‹œ์—๋„ ํ˜ธ์ถœ์ด ๋˜๊ณ , ๊ฐ’์ด ๋ฐ”๋€Œ๊ธฐ ์ง์ „์—๋„ ํ˜ธ์ถœ์ด ๋จ
  • useEffect ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ๋‚˜, props๊ฐ€ ์žˆ๋‹ค๋ฉด, useEffect์˜ deps์— ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•จ
  • ๋งŒ์•ฝ, ๋„ฃ์ง€ ์•Š๋Š”๋‹ค๋ฉด useEffect์— ๋“ฑ๋กํ•œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰ ๋  ๋•Œ ์ตœ์‹  props ํ˜น์€ ์ƒํƒœ๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์Œ → ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ

useMemo

๋ฆฌ๋ Œ๋”๋ง ์‹œ ๋ณ€๊ฒฝํ•˜๊ณ ์ž ํ•˜๋Š” state์— ํ•ด๋‹น๋˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋“ค๋„ ๊ฐ™์ด ์‹คํ–‰๋˜๋ฏ€๋กœ ๋น„ํšจ์œจ์ ์ž„

์„ฑ๋Šฅ ์ตœ์ ํ™”(๋ฆฌ๋ Œ๋”๋ง ์ตœ์†Œํ™”)๋ฅผ ์œ„ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

  • Memo๋Š” “memoized”๋ฅผ ์˜๋ฏธ(์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ์žฌ์‚ฌ์šฉ)

memoization(๋ฉ”๋ชจ์ด์ œ์ด์…˜)์€ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•  ๋•Œ, ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋™์ผํ•œ ๊ณ„์‚ฐ์˜ ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ์ œ๊ฑฐํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•˜๋Š” ๊ธฐ์ˆ 

๊ธฐ๋ณธ ๊ตฌ์กฐ

import React, { useRef, useState, useMemo } from "react";

function countActiveUsers(users) {
  console.log("ํ™œ์„ฑ ์‚ฌ์šฉ์ž ์ˆ˜๋ฅผ ์„ธ๋Š” ์ค‘...");
  return users.filter((user) => user.active).length;
}

const count = useMemo(() => countActiveUsers(users), [users]);

์ฒซ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ: ์–ด๋–ป๊ฒŒ ์—ฐ์‚ฐํ• ์ง€ ์ •์˜ํ•˜๋Š” ํ•จ์ˆ˜

๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ: deps๋ฐฐ์—ด (๋ฐฐ์—ด ์•ˆ์— ๋„ฃ์€ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋“ฑ๋กํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœํ•˜์—ฌ ๊ฐ’์„ ์—ฐ์‚ฐ, ๋‚ด์šฉ์ด ๋ฐ”๋€Œ์ง€ ์•Š์œผ๋ฉด ์ด์ „์— ์—ฐ์‚ฐํ•œ ๊ฐ’ ์žฌ์‚ฌ์šฉ)