Effect Hook
๐ React์ ํจ์ ์ปดํฌ๋ํธ
์ฌํ๊น์ง ํ์ตํ React์ ํจ์ ์ปดํฌ๋ํธ๋, props๊ฐ ์ ๋ ฅ์ผ๋ก, JSX Element๊ฐ ์ถ๋ ฅ์ผ๋ก ๋๊ฐ๋ค. ์ฌ๊ธฐ์๋ ๊ทธ ์ด๋ค Side Effect๋ ์์ผ๋ฉฐ, ์์ ํจ์๋ก ์๋ํ๋ค.
function Singletweet({ writer, body, createdAt }) {
return (
<div>
<div>{writer}</div>
<div>{createdAt}</div>
<div>{body}</div>
</div>
);
}
ํ์ง๋ง ๋ณดํต React ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ๋์๋, AJAX ์์ฒญ์ด ํ์ํ๊ฑฐ๋ LocalStorage ๋๋ ํ์ด๋จธ์ ๊ฐ์ React์ ์๊ด ์๋ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ React์ ์ ์ฅ์์๋ ์ ๋ถ Side Effect์ด๋ค. React๋ Side Effect๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ Hook์ธ Effect Hook์ ์ ๊ณตํ๋ค.
โถ๏ธ React ์ปดํฌ๋ํธ์์์ Side Effect
- ํ์ด๋จธ ์ฌ์ฉ (setTimeout)
- ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ (fetch API,localStorage)
๐ Effect Hook
useEffect
๋ ์ปดํฌ๋ํธ ๋ด์์ Side Effect๋ฅผ ์คํํ ์ ์๊ฒ ํ๋ Hook์ด๋ค.
import React, { useState, useEffect } from "react";
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
// ๋ธ๋ผ์ฐ์ API๋ฅผ ์ด์ฉํ์ฌ ๋ฌธ์ ํ์ดํ์ ์
๋ฐ์ดํธ
document.title = `You cliked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>Click me</button>
</div>
);
}
์์ ์ฝ๋๋ useEffect
๋ฅผ ์ฌ์ฉํด ๋ฌธ์์ ํ์ดํ์ ํด๋ฆญ ํ์๊ฐ ํฌํจ๋ ๋ฌธ์ฅ์ผ๋ก ํํํ ์ ์๋๋ก ํ๋ค.
๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ๊ตฌ๋ (subscription) ์ค์ ํ๊ธฐ, ์๋์ผ๋ก React ์ปดํฌ๋ํธ์ DOM์ ์์ ํ๋ ๊ฒ ๊น์ง ์ด ๋ชจ๋ ๊ฒ์ด side effect์ด๋ค.
โถ๏ธ ์ธ์ ์คํ๋ ๊น?
- ์ปดํฌ๋ํธ ์์ฑ ํ ์ฒ์ ํ๋ฉด์ ๋ ๋๋ง(ํ์)
- ์ปดํฌ๋ํธ์ ์๋ก์ด props๊ฐ ์ ๋ฌ๋๋ฉฐ ๋ ๋๋ง
- ์ปดํฌ๋ํธ์ ์ํ(state)๊ฐ ๋ฐ๋๋ฉฐ ๋ ๋๋ง
์ด์ ๊ฐ์ด ๋งค๋ฒ ์๋กญ๊ฒ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ Effect Hook์ด ์คํ๋๋ค.
โถ๏ธ Hook์ ์ธ ๋ ์ฃผ์ํ ์
-
์ต์์์์๋ง Hook์ ํธ์ถํด์ผ ํ๋ค.
๋ฐ๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ํน์ ์ค์ฒฉ๋ ํจ์ ๋ด์์ Hook์ ํธ์ถํด์ ์๋๋ค. early return์ด ์คํ๋๊ธฐ ์ ์ ํญ์ React ํจ์์ ์ต์์์์ Hook์ ํธ์ถํด์ผ ํ๋ค. ์ด ๊ท์น์ ๋ฐ๋ฅด๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ ๋ง๋ค ํญ์ ๋์ผํ ์์๋ก Hook์ด ํธ์ถ๋๋ ๊ฒ์ด ๋ณด์ฅ๋๋ค. ์ด๋ฌํ ์ ์ React๊ฐ
useState
์useEffect
๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋๋ ์ค์๋ Hook์ ์ํ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์งํ ์ ์๋๋ก ํด์ค๋ค. -
์ค์ง React ํจ์ ๋ด์์ Hook์ ํธ์ถํด์ผ ํ๋ค.
Hook์ ์ผ๋ฐ์ ์ธ JavaScript ํจ์ ๋ด์์ ํธ์ถํด์๋ ์๋๋ค. ๋์ ์๋์ ๊ฐ์ด ํธ์ถํ ์ ์๋ค.
- React ํจ์ ์ปดํฌ๋ํธ์์ Hook์ ํธ์ถ
- Custom Hook์์ Hook์ ํธ์ถ
์ด ๊ท์น์ ์งํค๋ฉด ์ปดํฌ๋ํธ์ ๋ชจ๋ ์ํ ๊ด๋ จ ๋ก์ง์ ์์ค์ฝ๋์์ ๋ช ํํ๊ฒ ๋ณด์ด๋๋ก ํ ์ ์๋ค.
๐ ์กฐ๊ฑด๋ถ effect ๋ฐ์ (dependency array)
useEffect
์ ๋๋ฒ์งธ ์ธ์๋ ๋ฐฐ์ด์ด๋ค. ์ด ๋ฐฐ์ด์ ์กฐ๊ฑด์ ๋ด๊ณ ์๋๋ฐ, ์ด๋ ์กฐ๊ฑด์ boolean
ํํ์ ํํ์์ด ์๋ ์ด๋ค ๊ฐ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋ผ์, ํด๋น ๋ฐฐ์ด์ ์ด๋ค ๊ฐ์ ๋ชฉ๋ก์ด ๋ค์ด๊ฐ๋ค. ์ด ๋ฐฐ์ด์ ํน๋ณํ ์ข
์์ฑ ๋ฐฐ์ด (dependency array)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
useEffect
๋ ํ๋ฉด์ ์ฒซ ๋ ๋๋ง ๋ ๋, ๊ทธ๋ฆฌ๊ณ ์ข
์์ฑ ๋ฐฐ์ด์ value ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์คํ๋๋ค.
์์
import { useEffect, useState } from "react";
import { getProverbs } from "./storageUtil";
export default function App() {
const [proverbs, setProverbs] = useState([]);
const [filter, setFilter] = useState("");
const [count, setCount] = useState(0);
useEffect(() => {
console.log("์ธ์ effect ํจ์๊ฐ ๋ถ๋ฆด๊น?");
const result = getProverbs(filter);
setProvervs(result);
}, [filter]);
const handleChange = (e) => {
setFilter(e.target.value);
};
const handleCounterClick = () => {
setCount(count + 1);
};
return (
<div className="App">
ํํฐ
<input type="text" value={filter} onChange={handleChange} />
<ul>
{provervs.map((prvb, i) => (
<Proverb saying={prvb} key={i} />
))}
</ul>
</div>
);
}
function Proverb({ saying }) {
return <li>{saying}</li>;
}
์ ์์ ์๋ ๋ค์๊ณผ ๊ฐ์ ์ธ ์ํ๊ฐ ์กด์ฌํ๋ค.
- ๋ช
์ธ ๋ชฉ๋ก (
proverbs
) - ํํฐ๋งํ ๋ฌธ์์ด (
filter
) - ์นด์ดํธ (
count
)
์ ์์ ๋ filter
๊ฐ ๋ณํ ๋์๋ง effect ํจ์๊ฐ ์คํ๋๋ค.
์นด์ดํธ๋ฅผ ์ฌ๋ฆฌ๋ ๋ฒํผ์ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ฐ๋๊ณ ์
๋ฐ์ดํธ ๋์ง๋ง, ์๋ฌด๋ฆฌ ๋ฒํผ์ ๋๋ฌ๋ effect ํจ์๋ ์คํ๋์ง ์๋๋ค. ์๋ํ๋ฉด, ์ข
์์ฑ ๋ฐฐ์ด์๋ filter
๋ง ์กด์ฌํ๊ณ count
๋ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
โ ์นด์ดํธ ๋ฒํผ์ ๋๋ ์ ๋์๋ effect ํจ์๋ฅผ ์คํ์ํค๋ ๋ฐฉ๋ฒ
useEffect(() => {
console.log("์ธ์ effect ํจ์๊ฐ ๋ถ๋ฆด๊น?");
const result = getProverbs(filter);
setProvervs(result);
}, [filter, count]);
useEffect์ ์ข
์์ฑ ๋ฐฐ์ด (dependency array)์ count
๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด filter
๋ฟ๋ง ์๋๋ผ count
๊ฐ ๋ณ๊ฒฝ๋ ๋์๋ useEffect ํจ์๊ฐ ์คํ๋๋ค.
๐ ๋จ ํ ๋ฒ๋ง ์คํ๋๋ Effect ํจ์
์ข
์์ฑ ๋ชฉ๋ก์ ์๋ฌด๋ฐ ์ข
์์ฑ๋ ์๋ค๋ฉด, ์ฆ ๋๋ฒ์งธ ์ธ์์ธ ์ข
์์ฑ ๋ฐฐ์ด์ ๋น ๋ฐฐ์ด ([]
)๋ก ๋ ๊ฒฝ์ฐ์๋ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋ ๋๋ง effect ํจ์๊ฐ ์คํ๋๋ค.
์ด ๊ฒฝ์ฐ๋ ๋๋ฒ์งธ ์ธ์๋ฅผ ์์ ๋๊ธฐ์ง ์๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ ๋์ํ๋ค. ๋๋ฒ์งธ ์ธ์๋ฅผ ์์ ๋๊ธฐ์ง ์์ ๊ฒฝ์ฐ์๋ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋๊ฑฐ๋, props๊ฐ ์ ๋ฐ์ดํธ ๋๊ฑฐ๋, state(์ํ)๊ฐ ์ ๋ฐ์ดํธ ๋ ๋ effect ํจ์๊ฐ ์คํ๋๋ค.
์์
useEffect(() => {
console.log(๋ช ๋ฒ ํธ์ถ๋ ๊น์?)
})
โณ โ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋๊ฑฐ๋, state๊ฐ ์
๋ฐ์ดํธ ๋ ๋๋ง๋ค ์คํ๋๋ค.
useEffect(() => {
console.log(๋ช ๋ฒ ํธ์ถ๋ ๊น์?)
}, [dep])
โณ โ dep
์ด ์
๋ฐ์ดํธ ๋ ๋๋ง๋ค ์คํ๋๋ค.
useEffect(() => {
console.log(๋ช ๋ฒ ํธ์ถ๋ ๊น์?)
}, [])
โณ โ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ์์ฑ๋ ๋๋ง ํจ์๊ฐ ์คํ๋๋ค.
Leave a comment