: ์ค์ง ํจ์์ ์ ๋ ฅ(๋งค๊ฐ๋ณ์)๋ง์ด ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ํจ์
function upper(str) {
return str.toUpperCase(); // (immutable)
};
upper('hello'); // HELLO
// toUpperCase ๋ฉ์๋๋ ์๋ณธ์ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ํจ์ upper()์ ์์ํจ์์ด๋ค.
: ํจ์ ๋ด์์์ ์ด๋ค ๊ตฌํ์ด ํจ์ ์ธ๋ถ์ ์ํฅ์ ๋ผ์น๋ ๊ฒฝ์ฐ, ํด๋น ํจ์๋ Side Effect๊ฐ ์๋ค๊ณ ํ๋ค.
(ํจ์์ ์คํ์ด ์์์น ๋ชปํ ์ํฅ์ ๋ผ์น ์ ์๋ค๋ ๋ป)
let greeting = 'Hello!';
function func() {
greeting = 'Bye..';
};
func();
// ํจ์ func()์ ํจ์ ์ธ๋ถ์ ๋ณ์ greeting์ ๋ณ๊ฒฝ์์ผฐ๋ค. -> Side Effect!
React์์๋ ์ปดํฌ๋ํธ ๋ด์์ fetch()
๋ฅผ ์ฌ์ฉํด API๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ์ด๋ฒคํธ๋ฅผ ํ์ฉํด DOM์ ์ง์ ์กฐ์ํ ๋ Side Effect๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํ๋ค.
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์ ์ฌ์ฉํ๋ฉด, ํจ์ ์ปดํฌ๋ํธ ๋ด์์ Side Effect๋ฅผ ์คํํ ์ ์๋ค.
Effect Hook์ ์ด์ฉํ๊ธฐ ์ํด์๋ React์์ useEffect
๋ฅผ ๋ถ๋ฌ์์ผ ํ๋ค.
import { useEffect } from "react";
useEffect(ํจ์, [์ข
์์ฑ, ์ข
์์ฑ2, ...])
: ์ฒซ ๋ฒ์งธ ์ธ์๋ก ํจ์, ๋ ๋ฒ์งธ ์ธ์๋ก ์ข
์์ฑ ๋ฐฐ์ด(dependency array)์ ๊ฐ๋๋ค.
useEffect()
์ ์ฒซ ๋ฒ์งธ ์ธ์๋ ํจ์๋ก, ์ด ํจ์ ์์์ Side Effect๋ฅผ ์คํํ๋ฉด ๋๋ค.
useEffect(() => {
// ์ฌ๊ธฐ์ Effect๋ฅผ ์คํํ๋ฉด ๋๋ค.
}, deps);
useEffect()
์ ๋ ๋ฒ์งธ ์ธ์๋ ์ข
์์ฑ ๋ฐฐ์ด๋ก, ๊ฐ์ ๋ฃ๊ฑฐ๋ ์๋ตํ ์ ์๋ค.
useEffect(() => {
// ...
});
deps ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ตํ๋ ๊ฒฝ์ฐ, useEffect()
๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ํธ์ถ๋๋ค.
[]
์ ๋ฃ์ ๊ฒฝ์ฐuseEffect(() => {
// ...
}, []);
์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋์ด ํ๋ฉด์ ๋ ๋๋ง๋ ๋๋ง ํธ์ถ๋๋ค.
ex) ์ฒ์ ๋จ ํ ๋ฒ๋ง ์ธ๋ถ API๋ฅผ ํตํด ๋ฆฌ์์ค๋ฅผ ๋ฐ์์ค๊ณ , ๋ ์ด์ API ํธ์ถ์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ
useEffect(() => {
// ...
}, [filter]); // filter ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์คํ๋๋ค.
ํน์ ๊ฐ์ด ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์คํ๋๋ค.