์ ์ฆ ์ดํํธ ์ฌ์ฉ ๋ชฉ์ : ์ปดํฌ๋ํธ๋ฅผ React๊ฐ ์๋ ์์ ฏ, ๋คํธ์ํฌ, ๋๋ ๋ธ๋ผ์ฐ์ DOM๊ณผ ๊ฐ์ ์ธ๋ถ ์์คํ ๊ณผ ๋๊ธฐํ
์ด๋ค ์ฝ๋๊ฐ Effect์ ์์ด์ผ ํ๋์ง ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์์ด์ผ ํ๋์ง ํ์คํ์ง ์์ ๊ฒฝ์ฐ ์ด ์ฝ๋๊ฐ ์คํ๋์ด์ผ ํ๋ ์ด์ ๋ฅผ ์๋ฌธํด ๋ณด์ธ์. ์ปดํฌ๋ํธ๊ฐ ์ฌ์ฉ์์๊ฒ ํ์๋์๊ธฐ ๋๋ฌธ์ ์คํ๋์ด์ผ ํ๋ ์ฝ๋์๋ง Effect๋ฅผ ์ฌ์ฉํ์ธ์.
ํต์ฌ ํจํด:
- ๋ ๋๋ง ๋ก์ง ๋ด์์ ํ์ ์ํ ๊ณ์ฐ:
- ์ด๋ค ์ํ $A๊ฐ ๋ณ๊ฒฝ๋ ๋ $B ์ํ๋ $A์ ๊ธฐ๋ฐํ์ฌ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค๋ฉด, $B๋ฅผ ๋ณ๋์ useState๋ก ๊ด๋ฆฌํ๊ธฐ๋ณด๋ค๋ $A๋ก๋ถํฐ ํ์๋ ๊ฐ์ผ๋ก ๋ ๋๋ง ๋ก์ง ๋ด์์ ์ง์ ๊ณ์ฐํฉ๋๋ค.
- ์ด๊ฒ์ $B๊ฐ $A์ ๋ณํ์ ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์ํ์ฌ ์ฌ๊ณ์ฐ๋์ด์ผ ํ ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ด์์ ์ฌ๋ฌ ์ํ ๋์ ์
๋ฐ์ดํธ:
- ์ฌ์ฉ์ ์ํธ์์ฉ(์: ๋ฒํผ ํด๋ฆญ, ์ ๋ ฅ ํ๋ ๋ณ๊ฒฝ)์ผ๋ก ์ธํด ์ฌ๋ฌ ์ํ๊ฐ ๋์์ ๋ณ๊ฒฝ๋์ด์ผ ํ ๋, ํด๋น ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์ ๋ด์์ set ํจ์๋ค์ ์์ฐจ์ ์ผ๋ก ํธ์ถํ์ฌ ์ ๋ฐ์ดํธํฉ๋๋ค.
- React๋ ์ฌ๋ฌ set ํธ์ถ์ ํ๋์ ๋ ๋๋ง ๋ฐฐ์น(batch)๋ก ๋ฌถ์ด ์ฒ๋ฆฌํ๋ฏ๋ก ํจ์จ์ ์ ๋๋ค.
- ํจ์ํ ์
๋ฐ์ดํธ๋ฅผ ํตํ ์ด์ ์ํ ๊ธฐ๋ฐ ์
๋ฐ์ดํธ:
- ์ด์ ์ํ ๊ฐ์ ๊ธฐ๋ฐํ์ฌ ์๋ก์ด ์ํ ๊ฐ์ ๊ณ์ฐํด์ผ ํ ๋, set ํจ์์ ๊ฐ์ ์ง์ ์ ๋ฌํ๋ ๋์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํ๋ ํจ์ํ ์ ๋ฐ์ดํธ(setCount(prevCount => prevCount + 1))๋ฅผ ์ฌ์ฉํฉ๋๋ค.
1. props ๋๋ ๋ค๋ฅธ ์ํ์ ๊ธฐ๋ฐํ ์ํ ์ ๋ฐ์ดํธ
- ๋ฌธ์ ์ : firstName๊ณผ lastName์ด๋ผ๋ ๋ ๊ฐ์ ์ํ๊ฐ ์์ ๋, ์ด๋ค๋ก๋ถํฐ fullName์ด๋ผ๋ ์๋ก์ด ์ํ๋ฅผ ํ์์์ผ Effect ์์์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ๋๋ค.
- ์ Effect๊ฐ ๋ถํ์ํ๊ฐ: fullName์ firstName๊ณผ lastName์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋จ์ํ ๊ณ์ฐ๋๋ ๊ฐ์ ๋๋ค. Effect๋ฅผ ์ฌ์ฉํ๋ฉด ์ถ๊ฐ์ ์ธ ๋ ๋๋ง์ด ๋ฐ์ํ์ฌ ๋นํจ์จ์ ์ ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: fullName์ ๋ณ๋์ ์ํ๋ก ๊ด๋ฆฌํ์ง ์๊ณ , ๋ ๋๋ง ๋จ๊ณ์์ firstName๊ณผ lastName์ผ๋ก๋ถํฐ ์ง์ ๊ณ์ฐํ์ฌ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๋ ๋น ๋ฅด๊ณ , ๊ฐ๋จํ๋ฉฐ, ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ ์ต๋๋ค. -> ์ฐ์์ ์ธ ์
๋ฐ์ดํธ๋ฅผ ํผํ ์ ์์.
function ProfileEditor() { const [firstName, setFirstName] = useState('John'); const [lastName, setLastName] = useState('Doe'); // ๋ ๋๋ง ์์ ์ ์ง์ ๊ณ์ฐ const fullName = `${firstName} ${lastName}`; // ... JSX์์ fullName ์ฌ์ฉ }
2. ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ณ์ฐ ์บ์ฑ
- ๋ฌธ์ ์ : todos ๋ชฉ๋ก์ filter ๊ฐ์ ๋ฐ๋ผ ํํฐ๋งํ์ฌ visibleTodos๋ฅผ ๋ง๋๋ ์ํฉ์์, visibleTodos๋ฅผ Effect ์์์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ๋๋ค.
- ์ Effect๊ฐ ๋ถํ์ํ๊ฐ: ํํฐ๋ง ๋ก์ง(getFilteredTodos)์ด ๊ฐ๋ฒผ์ด ๊ณ์ฐ์ด๋ผ๋ฉด, Effect ์์ด ๋ ๋๋ง ์์ ์ ์ง์ ๊ณ์ฐํด๋ ์ถฉ๋ถํฉ๋๋ค. Effect๋ฅผ ์ฌ์ฉํ๋ฉด ๋ถํ์ํ ์ฌ๋ ๋๋ง์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ:
- ๊ณ์ฐ์ด ๊ฐ๋ฒผ์ธ ๋: ๋ ๋๋ง ์์ ์ getFilteredTodos(todos, filter)์ ๊ฐ์ด ์ง์ ํจ์๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉํฉ๋๋ค.
- ๊ณ์ฐ์ด ๋ฌด๊ฑฐ์ธ ๋: useMemo Hook์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํฉ๋๋ค. useMemo๋ todos๋ filter์ ๊ฐ์ ์์กด์ฑ ๋ฐฐ์ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๋ง ๊ณ์ฐ์ ๋ค์ ์ํํ์ฌ ๋ถํ์ํ ์ฌ๊ณ์ฐ์ ๋ฐฉ์งํฉ๋๋ค.useMemo๋ก ๊ฐ์ธ๋ ํจ์๋ ๋ ๋๋ง ์ค์ ์คํ๋๋ฏ๋ก, ์์ํ ๊ณ์ฐ์๋ง ์๋.
import { useMemo } from 'react'; function TodoList({ todos, filter }) { // ๊ณ์ฐ์ด ๋ฌด๊ฑฐ์ธ ๋ useMemo๋ก ์บ์ฑ const visibleTodos = useMemo(() => getFilteredTodos(todos, filter), [todos, filter]); // ... JSX์์ visibleTodos ์ฌ์ฉ }
3. props ๋ณ๊ฒฝ ์ ์ํ ์ด๊ธฐํ
- ๋ฌธ์ ์ : ProfilePage ์ปดํฌ๋ํธ์์ userId prop์ด ๋ณ๊ฒฝ๋ ๋ comment ์ํ๋ฅผ Effect ์์์ ์ด๊ธฐํํ๋ ๋ฐฉ์์ ๋๋ค. ์ด ์ญ์ ๋ถํ์ํ ์ฌ๋ ๋๋ง์ ์ ๋ฐํฉ๋๋ค.
- ์ Effect๊ฐ ๋ถํ์ํ๊ฐ: React๋ ์ปดํฌ๋ํธ์ key prop์ด ๋ณ๊ฒฝ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๋ฅผ ์์ ํ ์๋ก ๋ง์ดํธ(remount)ํ์ฌ ๋ชจ๋ ์ํ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: userId๋ฅผ ์์ ์ปดํฌ๋ํธ(์: Profile)์ key prop์ผ๋ก ์ ๋ฌํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด userId๊ฐ ๋ฌ๋ผ์ง ๋๋ง๋ค React๊ฐ Profile ์ปดํฌ๋ํธ๋ฅผ ์๋ก์ด ์ธ์คํด์ค๋ก ๊ฐ์ฃผํ์ฌ ๋ด๋ถ ์ํ๋ฅผ ์๋์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
function ProfilePage({ userId }) { // userId๊ฐ ๋ณ๊ฒฝ๋๋ฉด Profile ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ง์ดํธ๋๋ฉด์ ๋ด๋ถ ์ํ๊ฐ ์ด๊ธฐํ๋ฉ๋๋ค. return <Profile key={userId} userId={userId} />; }
4. ์ฌ์ฉ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
- ๋ฌธ์ ์ : ์ฌ์ฉ์์ ํด๋ฆญ์ด๋ ์ ๋ ฅ๊ณผ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋, ํด๋น ์ด๋ฒคํธ์ ๋ํ ๋ก์ง(์: API ์์ฒญ, ์๋ฆผ ํ์)์ Effect ์์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ๋๋ค.
- ์ Effect๊ฐ ๋ถํ์ํ๊ฐ: ์ฌ์ฉ์ ์ด๋ฒคํธ๋ ์ง์ ์ ์ธ ์ํธ์์ฉ์ ๊ฒฐ๊ณผ์ด๋ฉฐ, ์ด์ ๋ฐ๋ฅธ ๋ถ์ ํจ๊ณผ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์์์ ์ฆ์ ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค. Effect๋ ๋ ๋๋ง ์ดํ์ ์คํ๋๋ฏ๋ก, ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์ฐ์ ์ด๋ํ๊ฑฐ๋ ๋ก์ง ํ๋ฆ์ ๋ณต์กํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: ์ฌ์ฉ์ ์ด๋ฒคํธ(ํ๋)์ ๋ํ ๋ก์ง์ ํด๋น ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์ ๋ด์์ ์ง์ ์ฒ๋ฆฌํฉ๋๋ค.
function BuyButton({ productId }) { const handleClick = () => { // ํด๋ฆญ ์ด๋ฒคํธ ๋ฐ์ ์ ๋ฐ๋ก API ํธ์ถ ๋ฐ ์๋ฆผ ํ์ fetch(`/api/buy/${productId}`); showNotification('๊ตฌ๋งค ์๋ฃ!'); }; return <button onClick={handleClick}>๊ตฌ๋งคํ๊ธฐ</button>; }
5. ๋ฐ์ดํฐ ํจ์นญ (์ด๊ธฐํ)
- ๋ฌธ์ ์ : Effect ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ์ ๊ฐ์ ธ์ค๋(Workspace) ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค.
- ์ Effect๊ฐ ๋ถํ์ํ ์ ์๋๊ฐ: Effect๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ ํจ์นญ์ ์ผ๋ฐ์ ์ด์ง๋ง, ๊ฒฝ์ ์ํ(race condition) ์ฒ๋ฆฌ, ์บ์ฑ ๋ฑ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์์ต๋๋ค. ํนํ ์ต์ React ํ๋ ์์ํฌ(Next.js, Remix ๋ฑ)๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(React Query, SWR)๋ ๋ฐ์ดํฐ ํจ์นญ์ ์ํ ๋ ํจ์จ์ ์ด๊ณ ๋ด์ฅ๋ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
- ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ: ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ํจ์นญ ๊ธฐ๋ฅ์ ํ์ฉํ๊ฑฐ๋, ๋ฐ์ดํฐ ํจ์นญ ๋ก์ง์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปค์คํ Hook์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ก์ง์ ๋ ๊น๋ํ๊ฒ ์ ๋ฆฌํ๊ณ , ์ ์ฌ์ ์ธ ์ต์ ํ ๊ธฐํ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
'๐ป FE' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
NodeList vs HTMLCollection (0) | 2025.05.16 |
---|---|
์์ฑ! (0) | 2025.05.16 |
children, childNodes (0) | 2025.05.16 |
querySelectorAll('li'), getElementsByTagName('li') (0) | 2025.05.14 |
์์ฑ , ํ๋กํผํฐ (0) | 2025.05.14 |