๐ŸชuseEffect()

์ง€์€ยท2022๋…„ 10์›” 15์ผ
0

โš›๏ธ React

๋ชฉ๋ก ๋ณด๊ธฐ
7/23
post-custom-banner

๐Ÿซง Pure Function (์ˆœ์ˆ˜ ํ•จ์ˆ˜)

: ์˜ค์ง ํ•จ์ˆ˜์˜ ์ž…๋ ฅ(๋งค๊ฐœ๋ณ€์ˆ˜)๋งŒ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ•จ์ˆ˜

  • ๋‹ค์‹œ ๋งํ•˜๋ฉด, ํ•จ์ˆ˜์˜ ์ž…๋ ฅ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ, ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
function upper(str) {
  return str.toUpperCase(); // (immutable)
};

upper('hello'); // HELLO
// toUpperCase ๋ฉ”์†Œ๋“œ๋Š” ์›๋ณธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ธฐ ๋–„๋ฌธ์— ํ•จ์ˆ˜ upper()์€ ์ˆœ์ˆ˜ํ•จ์ˆ˜์ด๋‹ค.
  • ์ˆœ์ˆ˜ ํ•จ์ˆ˜์—๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๊ฐ™์€ Side Effect๊ฐ€ ์—†๋‹ค.
  • ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ์ „๋‹ฌ ์ธ์ž์— ๋Œ€ํ•ด ํ•ญ์ƒ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ผํ•œ ๋ฆฌํ„ด๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

โšก๏ธ Side Effect (๋ถ€์ˆ˜ ํšจ๊ณผ)

: ํ•จ์ˆ˜ ๋‚ด์—์„œ์˜ ์–ด๋–ค ๊ตฌํ˜„์ด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ํ•จ์ˆ˜๋Š” Side Effect๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.
(ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป)

let greeting = 'Hello!';

function func() {
  greeting = 'Bye..';
};

func(); 
// ํ•จ์ˆ˜ func()์€ ํ•จ์ˆ˜ ์™ธ๋ถ€์˜ ๋ณ€์ˆ˜ greeting์„ ๋ณ€๊ฒฝ์‹œ์ผฐ๋‹ค. -> Side Effect!

โšก๏ธ React์—์„œ์˜ Side Effect

React์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ fetch()๋ฅผ ์‚ฌ์šฉํ•ด API๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜, ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•  ๋•Œ Side Effect๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๋งํ•œ๋‹ค.

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

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

// ํ•จ์ˆ˜์˜ ์ž…๋ ฅ(props)๋งŒ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ค€๋‹ค.
function Tweet({ writer, content, createdAt }) {
  return <div>
    <div>{writer}</div>  
    <div>{createdAt}</div>
    <div>{body}</div>
  </div>
};

ํ•˜์ง€๋งŒ ๋ณดํ†ต React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ๋Š”, AJAX ์š”์ฒญ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜, LocalStroage ๋˜๋Š” ํƒ€์ด๋จธ์™€ ๊ฐ™์€ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

โžก๏ธ ์ด๋Š” React์˜ ์ž…์žฅ์—์„œ ์ „๋ถ€ โšก๏ธSide Effect์ด๋‹ค.
(๋„คํŠธ์›Œํฌ ์š”์ฒญ์œผ๋กœ ์ธํ•ด ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ์— Side Effect๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ)

React ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ Side Effect

  • ํƒ€์ด๋จธ ์‚ฌ์šฉ (setTimeout)
  • ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ / ๋„คํŠธ์›Œํฌ ์š”์ฒญ (fetchAPI, localStorage)

๋”ฐ๋ผ์„œ, React์—์„œ๋Š” Side Effect๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ Hook์ธ Effect Hook์„ ์ œ๊ณตํ•œ๋‹ค.


Effect Hook

: Effect Hook์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ Side Effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Effect Hook์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” React์—์„œ useEffect๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•œ๋‹ค.

import { useEffect } from "react";

Effect Hook ์‚ฌ์šฉํ•˜๊ธฐ

useEffect()

useEffect(ํ•จ์ˆ˜, [์ข…์†์„ฑ, ์ข…์†์„ฑ2, ...]) : ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ํ•จ์ˆ˜, ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ข…์†์„ฑ ๋ฐฐ์—ด(dependency array)์„ ๊ฐ–๋Š”๋‹ค.

1. ํ•จ์ˆ˜

useEffect()์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ•จ์ˆ˜๋กœ, ์ด ํ•จ์ˆ˜ ์•ˆ์—์„œ Side Effect๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

useEffect(() => {
  // ์—ฌ๊ธฐ์„œ Effect๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
}, deps);

2. ์ข…์†์„ฑ ๋ฐฐ์—ด(dependency array)

useEffect()์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ข…์†์„ฑ ๋ฐฐ์—ด๋กœ, ๊ฐ’์„ ๋„ฃ๊ฑฐ๋‚˜ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ข…์†์„ฑ ๋ฐฐ์—ด์€ Effect Hook์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ์กฐ๊ฑด์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

1) ์•„๋ฌด ๊ฒƒ๋„ ๋„ฃ์ง€ ์•Š์„ ๊ฒฝ์šฐ (์ƒ๋žตํ•  ๊ฒฝ์šฐ)

useEffect(() => {
// ...
});

deps ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ƒ๋žตํ•˜๋Š” ๊ฒฝ์šฐ, useEffect()๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ๋œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋˜์–ด ํ™”๋ฉด์— ๋ Œ๋”๋ง๋  ๋•Œ
  • ์ปดํฌ๋„ŒํŠธ์— props๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด ๋ Œ๋”๋ง๋  ๋•Œ
  • ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(state)๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด ๋ Œ๋”๋ง๋  ๋•Œ

2) ๋นˆ ๋ฐฐ์—ด []์„ ๋„ฃ์„ ๊ฒฝ์šฐ

useEffect(() => {
// ...
}, []);

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋˜์–ด ํ™”๋ฉด์— ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ํ˜ธ์ถœ๋œ๋‹ค.
ex) ์ฒ˜์Œ ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์™ธ๋ถ€ API๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›์•„์˜ค๊ณ , ๋” ์ด์ƒ API ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ

3) ํŠน์ • ๊ฐ’์„ ๋„ฃ์„ ๊ฒฝ์šฐ

useEffect(() => {
// ...
}, [filter]); // filter ๊ฐ’์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

ํŠน์ • ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

profile
๋ธ”๋กœ๊ทธ ์ด์ „ -> https://janechun.tistory.com
post-custom-banner

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