[React] ๐Ÿช„Side Effect, ๐Ÿช„Effect Hook

TATAยท2023๋…„ 2์›” 2์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
7/32

โ–ท Side Effect

๐Ÿช„Side Effect๋ž€?

Side Effect๋ž€ ํ•จ์ˆ˜ ๋‚ด์—์„œ ์–ด๋–ค ๊ตฌํ˜„์ด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.

// ์ „์—ญ ๋ณ€์ˆ˜ foo๋ฅผ bar๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ˆ˜์ •ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.
let foo = 'hello';

function bar() {
  foo = 'world';
}

bar(); // bar๋Š” Side Effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค!

โ“React ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ Side Effect๋Š”?
โœ“ ํƒ€์ด๋จธ ์‚ฌ์šฉ(setTimeout)
โœ“ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ(fetch API, localStorage)


๐Ÿช„์ˆœ์ˆ˜ ํ•จ์ˆ˜(Pure Function)

์ˆœ์ˆ˜ํ•จ์ˆ˜๋ž€ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ,
์˜ค์ง ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๋งŒ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.

์ˆœ์ˆ˜ ํ•จ์ˆ˜์—๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๊ฐ™์€ Side Effect๊ฐ€ ์—†๋‹ค.
ํ•ญ์ƒ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ๋ฆฌํ„ด๋จ์„ ๋ณด์žฅํ•˜๊ธฐ์— ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์ด๋‹ค.

Math.sqrt()๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜์ด๋‹ค.
// ์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ

Math.random()๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
// ์˜ˆ์ธก์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ
์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ fetch API๋ฅผ ์ด์šฉํ•ด AJAX์š”์ฒญ์„ ํ•œ๋‹ค๋ฉด ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
// ๋„คํŠธ์›Œํฌ ์ƒํ™ฉ, ์„œ๋ฒ„ ์ƒํƒœ์— ๋”ฐ๋ผ ์‘๋‹ต ์ฝ”๋“œ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ์— ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ

๐Ÿช„React์˜ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ

React์˜ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” props๊ฐ€ ์ž…๋ ฅ์œผ๋กœ,
๊ทธ ์–ด๋–ค Side Effect๋„ ์—†์œผ๋ฉฐ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ž‘๋™ํ•œ๋‹ค.

AJAX ์š”์ฒญ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜, LocalStorage ๋˜๋Š” ํƒ€์ด๋จธ์™€ ๊ฐ™์€
React์™€ ์ƒ๊ด€์—†๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ „๋ถ€ Side Effect๋ผ๊ณ  ์—ฌ๊ธด๋‹ค.
๊ทธ๋ž˜์„œ React๋Š” Side Effect๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ Hook์ธ Effect Hook์„ ์ œ๊ณตํ•œ๋‹ค.


โ–ท Effect Hook

๐Ÿช„useEffect

useEffect๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ Side effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Hook์ด๋‹ค.

useEffect์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž ๐Ÿ‘‰ ํ•จ์ˆ˜(ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ side effect๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋จ.)
useEffect์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž ๐Ÿ‘‰ ๋ฐฐ์—ด(์กฐ๊ฑด์„ ๋‹ด๊ณ  ์žˆ์Œ. ์–ด๋–ค ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ๋ฅผ ์˜๋ฏธ)

// ๋‘ ๋ฒˆ์งธ ์ธ์ž ๋ฐฐ์—ด์—” ์–ด๋–ค ๊ฐ’์˜ ๋ชฉ๋ก์ด ๋“ค์–ด๊ฐ„๋‹ค.(์ด ๋ฐฐ์—ด์„ ์ข…์†์„ฑ ๋ฐฐ์—ด์ด๋ผ๊ณ  ํ•จ)
// ๋ฐฐ์—ด ๋‚ด์˜ ์–ด๋–ค ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ์—๋งŒ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
useEffect(ํ•จ์ˆ˜, [์ข…์†์„ฑ1, ์ข…์†์„ฑ2, ...])

โ—๏ธ์ฐธ๊ณ ) ์ตœ์ƒ์œ„์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋ฉฐ, Reactํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
โ—๏ธ์ฐธ๊ณ ) ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ํ˜น์€ ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

๋‘ ๋ฒˆ์งธ ์ธ์ž๊ฐ€ ์—†์„ ๋•Œ, ๋นˆ ๋ฐฐ์—ด์ผ ๋•Œ, ๊ฐ’์ด ์žˆ์„ ๋•Œ ์˜ˆ์‹œ

useEffect(() => {
	console.log(๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋ ๊นŒ?)
})
// ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜, props๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ฑฐ๋‚˜,
// state๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

-----
useEffect(() => {
	console.log(๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋ ๊นŒ?)
}, [])
// ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ๋งŒ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
// ์–ธ์ œ ํ•„์š”? ๋Œ€ํ‘œ์ ์œผ๋กœ ์ฒ˜์Œ ๋‹จ ํ•œ ๋ฒˆ, ์™ธ๋ถ€ API๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›์•„์˜ค๊ณ  
// ๋” ์ด์ƒ API ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

-----

useEffect(() => {
	console.log(๋ช‡ ๋ฒˆ ํ˜ธ์ถœ๋ ๊นŒ?)
}, [dep])
// dep์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

useEffect ์‚ฌ์šฉ ์˜ˆ์ œ

// ์ด ์ปดํฌ๋„ŒํŠธ์—์„œ ์‹คํ–‰ํ•˜๋Š” Side effect๋Š”
// ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์ด์šฉํ•˜์—ฌ ํƒ€์ดํ‹€์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
// ๋ช…์–ธ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ณด์—ฌ์ฃผ๊ณ , ๊ทธ ์ˆœ์„œ์— ๋งž๊ฒŒ ํƒ€์ดํ‹€์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
import { useEffect, useState } from "react";

export default function App() {
  const proverbs = [
    "์ขŒ์ ˆ๊ฐ์œผ๋กœ ๋ฐฐ์›€์„ ๋Šฆ์ถ”์ง€ ๋งˆ๋ผ",
    "Stay hungry, Stay foolish",
    "Memento Mori",
    "Carpe diem",
    "๋ฐฐ์›€์—๋Š” ๋์ด ์—†๋‹ค"
  ];
  const [idx, setIdx] = useState(0);

  const handleClick = () => {
    setIdx(idx === proverbs.length - 1 ? 0 : idx + 1);
  };

  return (
    <div className="App">
      <button onClick={handleClick}>๋ช…์–ธ ์ œ์กฐ</button>
      <Proverb saying={proverbs[idx]} />
    </div>
  );
}

function Proverb({ saying }) {
  useEffect(() => {
    document.title = saying;
  });
  return (
    <div>
      <h3>์˜ค๋Š˜์˜ ๋ช…์–ธ</h3>
      <div>{saying}</div>
    </div>
  );
}

๐Ÿ‘‰ AJAX ์‚ฌ์šฉ๋ฒ• ๋ณด๋Ÿฌ๊ฐ€๊ธฐ
๐Ÿ‘‰ (๊ณต์‹๋ฌธ์„œ)Hook์˜ ๊ทœ์น™ - Hook์„ ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ์œ„์—์„œ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ์ด์œ 
๐Ÿ‘‰ (๊ณต์‹๋ฌธ์„œ)Hooks API Reference
๐Ÿ‘‰ (๊ณต์‹๋ฌธ์„œ)ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ Class Components

profile
๐Ÿพ

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