React - useEffect

TH_velogยท2023๋…„ 10์›” 12์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
10/16
post-thumbnail
post-custom-banner

๐Ÿ–‹๏ธ๊ธฐ๋ก์šฉ Velogโœ…
โ€ป ์ž์„ธํ•œ ์„ค๋ช…์€ ๊ตฌ๊ธ€๋ง ๋‹ค๋ฅธ ๋ถ„๋“ค ์ฐธ๊ณ  โœ”๏ธ

๐Ÿ“Œ useEffect

๐Ÿ“ useEffect๋ž€?

โœ”๏ธ React Hook
โœ”๏ธ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ผ์ดํ”„ ์‚ฌ์ดํด์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ useEffect๋ฅผ ํ†ตํ•ด ๋ผ์ดํ”„ ์‚ฌ์ดํด(๋งˆ์šดํŠธ,์—…๋ฐ์ดํŠธ,์–ธ๋งˆ์šดํŠธ) ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
โœ”๏ธ ๋งˆ์šดํŠธ-์ฒ˜์Œ ๋ Œ๋”๋ง ์‹œ, ์—…๋ฐ์ดํŠธ- ํŠน์ • ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ, ์–ธ๋งˆ์šดํŠธ-์‚ฌ์ž์งˆ๋•Œ/์ปดํฌ๋„ŒํŠธ๋ฅผ ๋– ๋‚  ๋•Œ
โœ”๏ธ useEffect๋Š” html ๋ Œ๋”๋ง ํ›„ ์‹คํ–‰
โœ”๏ธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง, ๋ฆฌ๋ Œ๋”๋ง, ๋‘ ๋ฒˆ์งธ ์ธ์ž []์— ์„ ์–ธ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
โœ”๏ธ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋ฐ ์ด ๋ฐฐ์—ด์„ Dependency Array๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  • dependency๋Š” useEffect, useCallback ๋“ฑ Hook์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฐ์—ด
  • ๋‘ ๋ฒˆ์งธ ์ธ์ž์— ์ž…๋ ฅ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
  • ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€
  • [] ๋นˆ ๊ฐ’์ผ ๊ฒฝ์šฐ ์ฒซ ๋ Œ๋”๋ง์— 1ํšŒ๋งŒ ์‹คํ–‰.

โœ”๏ธ useEffect ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ side Effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“ useEffect ์‚ฌ์šฉ ๋ชฉ์ 

โœ”๏ธ useEffect๋Š” HTML ๋ Œ๋”๋ง ํ›„ ์‹คํ–‰์„ ํ•˜๊ธฐ์— ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ํ•˜์—ฌ ์ง€์—ฐ์ด ๋˜๋Š” ๊ฒฝ์šฐ html์ด ๋ณด์ด์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด.
โœ”๏ธ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ
โœ”๏ธ ํŠน์ • ๊ฐ’ ๋ณ€๊ฒฝ ์‹œ ๋™์ž‘
โœ”๏ธ ์ตœ์ดˆ ๋ Œ๋”๋ง ์‹œ์—๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก, ๋ฆฌ๋ Œ๋”๋ง ์‹œ ๋™์ž‘โŒ

๐Ÿ“ useEffect ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

๐ŸŽˆ useEffect import

import {useEffect} from "react";

๐ŸŽˆ useEffect ์ž…๋ ฅ

1. ์ดˆ๊ธฐ ๋ Œ๋”๋ง, ์žฌ๋ Œ๋”๋ง ์‹œ ์‹คํ–‰ ๐Ÿ‘‡
useEffect(() => {
  //์‹คํ–‰ ํ•จ์ˆ˜
  console.log("useEffect");
});

2. dependency arry : ๋นˆ ๋ฐฐ์—ด ์ฒซ ๋ Œ๋”๋ง์—๋งŒ(mount) ์‹คํ–‰ ๐Ÿ‘‡
useEffect(() => {
  //์‹คํ–‰ ํ•จ์ˆ˜
  console.log("useEffect");
},[]);

3. dependency arry : ์ตœ์ดˆ ๋ Œ๋”๋ง 1ํšŒ ๋ฐ val ๊ฐ’์ด ๋ณ€๊ฒฝ ์‹œ ์‹คํ–‰ ๐Ÿ‘‡
useEffect(() => {
  //์‹คํ–‰ ํ•จ์ˆ˜
  console.log("useEffect");
},[val])

4. clean up : unmount ์‹œ ์‹คํ–‰(์ปดํฌ๋„ŒํŠธ ์‚ญ์ œ ๋ฐ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ์ด๋™) ๐Ÿ‘‡
useEffect(() => {
  //์‹คํ–‰ ํ•จ์ˆ˜
  console.log("useEffect");
  return () => {
  	console.log("clean up function");
  };
});

๐Ÿ“ useEffect ํ…Œ์ŠคํŠธ

๐ŸŽˆ์ดˆ๊ธฐ ๋ Œ๋”๋ง, ์žฌ๋ Œ๋”๋ง ์‹œ ์‹คํ–‰

useEffect(()=>{
  console.log("useEffect");
})

โœ”๏ธ ์ดˆ๊ธฐ ๋ Œ๋”๋ง ๋ฐ ์žฌ๋ Œ๋”๋ง ์‹œ ์‹คํ–‰์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด
Count ์ƒํƒœ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ ๋ฆฌ๋ Œ๋”๋ง!!

๐Ÿ‘‡ ๊ฒฐ๊ณผ

โœ”๏ธ count ๋ณ€๊ฒฝ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฉ๋‹ˆ๋‹ค
๋ฆฌ๋ Œ๋”๋ง์ด ๋  ๋•Œ๋งˆ๋‹ค useEffect๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธ!

โœ”๏ธ useEffect๋Š” html ๋ Œ๋”๋ง ํ›„์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์ˆœ์ฐจ์ ์œผ๋กœ ์œ„์—์„œ console.log("TEST"); ์‹คํ–‰ ํ›„ html ๋ Œ๋”๋ง ํ›„
useEffect๊ฐ€ ์‹คํ–‰ ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๐ŸŽˆdependency arry : ๋นˆ ๋ฐฐ์—ด

 useEffect(()=>{
   console.log("useEffect");
 },[])
โœ”๏ธ [] ๋นˆ ๋ฐฐ์—ด์ด ์ถ”๊ฐ€๋˜์–ด ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์‹œ์—๋งŒ ๋™์ž‘์ด ๋˜๊ณ  ๋ฆฌ๋ Œ๋”๋ง ์‹œ์—๋Š” ์‹คํ–‰์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‡๊ฒฐ๊ณผ

โœ”๏ธ useEffect๋Š” ์ดˆ๊ธฐ ๋ Œ๋”๋ง 1ํšŒ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ๊ทธ ์ดํ›„ count ๋ณ€๊ฒฝ๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง ์‹œ ์žฌ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!

๐ŸŽˆdependency arry : ํŠน์ • ๊ฐ’

useEffect(()=>{
  console.log("useEffect");
},[ํŠน์ • ๊ฐ’])

โœ”๏ธ number๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ useEffect์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž ๋ฐฐ์—ด์— number๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ number ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ useEffect๊ฐ€ ์‹คํ–‰ ํ…Œ์ŠคํŠธ
โœ”๏ธ ํ™•์ธ์„ ์ข€ ๋” ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด count,number ํด๋ฆญ์‹œ console์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

๐Ÿ‘‡๊ฒฐ๊ณผ

๋นจ๊ฐ„์ƒ‰: ์ดˆ๊ธฐ ๋ Œ๋”๋ง : useEffect ์‹คํ–‰โญ•

ํŒŒ๋ž€์ƒ‰: Count ๋ณ€๊ฒฝ : useEffect ์‹คํ–‰โŒ

๋ผ์ž„์ƒ‰: Number ๋ณ€๊ฒฝ : useEffect ์‹คํ–‰โญ•

โœ”๏ธ ์ดˆ๊ธฐ 1ํšŒ ํ˜ธ์ถœ ๋ฐ dependency ๋ฐฐ์—ด์— ์ž…๋ ฅ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๐ŸŽˆclean up

โœ”๏ธ useEffect ์‹คํ–‰ ๋˜๊ธฐ ์ „์— return ์•ˆ์— ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰.
โœ”๏ธ mount ์‹œ ์‹คํ–‰ โŒ / unmount ์‹œ ์‹คํ–‰ โญ•
โœ”๏ธ setTimeout, setInterval, ์ด๋ฒคํŠธ ์ถ”๊ฐ€ ๋“ฑ ์ค‘์ฒฉ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ ๐Ÿ‘‰ ์ฒญ์†Œํ•˜๋“ฏ ๊ธฐ์กด ์—ฐ๊ฒฐ์ด ๋˜์–ด ์žˆ๋‹ค๋ฉด ํ•ด์ œ ์‹œํ‚จ๋‹ค - ์ดˆ๊ธฐํ™”

useEffect(()=>{
  console.log("useEffect!");
  return () => {
    console.log("clean up!!")
  }
},[])
โœ”๏ธclean up ์‚ฌ์šฉ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ

โœ”๏ธ ์•„๋ฌด ์ด๋ฒคํŠธ ์—†๋˜ ๋ฒ„ํŠผ์— number state ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ useEffect๊ฐ€ ์‹คํ–‰๋˜์–ด ์ถ”๊ฐ€๋กœ click ์ด๋ฒคํŠธ๋ฅผ ๊ณ„์† ์ถ”๊ฐ€ํ•˜์—ฌ ์ค‘๋ณต ๋ฐœ์ƒ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‡๊ฒฐ๊ณผ

โœ”๏ธ ์ฒ˜์Œ React 2๋ฒˆ ์‹คํ–‰์œผ๋กœ ๋‘๋ฒˆ click ์ด๋ฒคํŠธ๊ฐ€ ์ถ”๊ฐ€ ๋˜์—ˆ๊ณ 
์ดํ›„ ๋นจ๊ฐ„์ƒ‰ ์ˆซ์ž๋งŒํผ number ๋ณ€๊ฒฝ โžก๏ธ ๋ฆฌ๋ Œ๋”๋ง โžก๏ธuesEffect ์‹คํ–‰

โœ”๏ธ click ๋ฒ„ํŠผ ํ•œ๋ฒˆ๋งŒ ํด๋ฆญํ–ˆ์„ ๋ฟ์ธ๋ฐ click ์ค‘๋ณต์œผ๋กœ ์ถ”๊ฐ€๋˜๋‹ค ๋ณด๋‹ˆ
ํŒŒ๋ž€์ƒ‰ ๋ฐ‘์ค„์ฒ˜๋Ÿผ ์ˆซ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

โœ… clean up ์‹œ ํด๋ฆญ ์ด๋ฒคํŠธ remove!

๐Ÿ‘‡๊ฒฐ๊ณผ

โœ”๏ธ clean up function์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์‚ญ์ œํ•˜์—ฌ ์ดˆ๊ธฐ๋กœ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ๊ธฐ์— ๋ฆฌ๋ Œ๋”๋ง ์‹œ click ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ๋„ ์ค‘๋ณต์‹คํ–‰์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!!

โž• setTimeout์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ ์ถ”์ฒœ๐Ÿ‘

โš ๏ธ useEffect๋ฅผ ๋‚จ์šฉํ•˜๊ฒŒ ๋˜๋ฉด side effect๊ฐ€ ์ปค์ ธ ์œ ์ง€ ๋ณด์ˆ˜ ๋ฐ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ํ™•๋ฅ ์ด ๋†’์•„์ง€๊ธฐ์— ๋‚จ์šฉ์€ ํ•˜์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค!

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ˜

profile
๊ณต๋ถ€&๊ธฐ๋ก
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€