Side Effect๋ ํจ์ ๋ด์์ ์ด๋ค ๊ตฌํ์ด ํจ์ ์ธ๋ถ์ ์ํฅ์ ๋ผ์น๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค.
// ์ ์ญ ๋ณ์ foo๋ฅผ bar๋ผ๋ ํจ์๊ฐ ์์ ํ๋ ์์ ์ด๋ค.
let foo = 'hello';
function bar() {
foo = 'world';
}
bar(); // bar๋ Side Effect๋ฅผ ๋ฐ์์ํต๋๋ค!
โReact ์ปดํฌ๋ํธ์์์ Side Effect๋?
โ ํ์ด๋จธ ์ฌ์ฉ(setTimeout)
โ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ(fetch API, localStorage)
์์ํจ์๋ ์
๋ ฅ์ผ๋ก ์ ๋ฌ๋ ๊ฐ์ ์์ ํ์ง ์๊ณ ,
์ค์ง ํจ์์ ์
๋ ฅ๋ง์ด ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ํจ์๋ฅผ ๋งํ๋ค.
์์ ํจ์์๋ ๋คํธ์ํฌ ์์ฒญ๊ณผ ๊ฐ์ Side Effect๊ฐ ์๋ค.
ํญ์ ๋๊ฐ์ ๊ฐ์ด ๋ฆฌํด๋จ์ ๋ณด์ฅํ๊ธฐ์ ์์ธก ๊ฐ๋ฅํ ํจ์์ด๋ค.
Math.sqrt()๋ ์์ ํจ์์ด๋ค.
// ์์ธก์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ
Math.random()๋ ์์ ํจ์๊ฐ ์๋๋ค.
// ์์ธก์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ
์ด๋ค ํจ์๊ฐ fetch API๋ฅผ ์ด์ฉํด AJAX์์ฒญ์ ํ๋ค๋ฉด ์์ ํจ์๊ฐ ์๋๋ค.
// ๋คํธ์ํฌ ์ํฉ, ์๋ฒ ์ํ์ ๋ฐ๋ผ ์๋ต ์ฝ๋๊ฐ ๋ฌ๋ผ์ง๊ธฐ์ ์์ธก ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ
React์ ํจ์ ์ปดํฌ๋ํธ๋ props๊ฐ ์
๋ ฅ์ผ๋ก,
๊ทธ ์ด๋ค Side Effect๋ ์์ผ๋ฉฐ ์์ ํจ์๋ก ์๋ํ๋ค.
AJAX ์์ฒญ์ด ํ์ํ๊ฑฐ๋, LocalStorage ๋๋ ํ์ด๋จธ์ ๊ฐ์
React์ ์๊ด์๋ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ ๋ถ Side Effect๋ผ๊ณ ์ฌ๊ธด๋ค.
๊ทธ๋์ React๋ Side Effect๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ Hook์ธ Effect Hook์ ์ ๊ณตํ๋ค.
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