React의 useEffect
훅은 컴포넌트의 마운트(Mount), 업데이트(Update), 언마운트(Unmount) 시점을 제어할 수 있게 해주는 핵심 도구입니다. 아래는 예제 코드를 기준으로 useEffect
의 동작 방식을 정리한 문서입니다.
deps
)이 빈 배열인 경우 한 번만 실행됨useEffect(() => {
console.log("mount");
}, []); // 최초 1회만 실행
deps
에 해당 값을 명시useEffect(() => {
if (!isMount.current) {
isMount.current = true;
return;
}
console.log("update");
});
useRef
로 최초 마운트를 구분해 update 시점만 감지 가능useEffect
의 return 함수에서 정의useEffect(() => {
return () => {
console.log("unmount");
};
}, []); // mount 시 등록 → unmount 시 실행
deps
가 빈 배열일 경우 컴포넌트 종료 시점에만 실행됨dependency array
, deps)설정 | 동작 설명 |
---|---|
없음 | 매 렌더링마다 실행 |
[] |
최초 마운트 한 번만 실행 |
[a, b] |
a 또는 b 가 변경될 때 실행 |
Even
컴포넌트의 언마운트 감지const Even = () => {
useEffect(() => {
return () => {
console.log("unmount");
};
}, []);
return <div>Even입니다.</div>;
};
count
가 홀수로 바뀌면 조건부 렌더링에서 제외되면서 언마운트됨unmount
로그 출력import "./App.css";
import Viewer from "./components/Viewer";
import Controller from "./components/Controller";
import { useEffect, useState, useRef } from "react";
import Even from "./components/Even.jsx";
function App() {
const [count, setCount] = useState(0);
const [input, setInput] = useState("");
const isMount = useRef(false);
useEffect(() => {
console.log("mount");
}, []);
useEffect(() => {
if (!isMount.current) {
isMount.current = true;
return;
}
console.log("update");
});
const onClickButton = (value) => {
setCount(count + value);
};
return (
<div className="App">
<h1>Simple Counter</h1>
<section>
<input
value={input}
onChange={(e) => {
setInput(e.target.value);
}}
/>
</section>
<section>
<Viewer count={count} />
{count % 2 === 0 ? <Even /> : null}
</section>
<section>
<Controller onClickButton={onClickButton} />
</section>
</div>
);
}
export default App;
import { useEffect } from "react";
const Even = () => {
useEffect(() => {
return () => {
console.log("unmount");
};
}, []);
return <div>Even입니다.</div>;
};
export default Even;
useEffect(() => {}, [])
→ 마운트 시 1회 실행useEffect(() => {})
→ 리렌더링마다 실행useEffect(() => { return () => {} }, [])
→ 언마운트 시 실행컴포넌트 생명주기에 따라 적절한 useEffect
패턴을 사용하면, 효과적인 상태 관리와 자원 정리를 구현할 수 있습니다.
React - useState를 useReducer로 대체하는 간단 예제 (0) | 2025.06.05 |
---|---|
React - props 전달 방식의 차이: `{...todo}` vs `todo={todo}` (0) | 2025.06.05 |
♻️ 리액트 컴포넌트 생명 주기(Lifecycle) 핵심 정리 (0) | 2025.06.03 |
React - 상태 끌어올리기(State Lifting) (0) | 2025.06.01 |
React - Hook 사용 규칙과 Custom Hook 예제 (0) | 2025.06.01 |