2026-01-21
useEffect
useEffect란?
컴포넌트 렌더링 이후에 부수 효과(side effect)를 처리하기 위한 React Hook
- 렌더링 결과를 화면에 반영한 뒤 실행됨
- 컴포넌트의 생명주기와 연결됨
Side Effect란?
렌더링 외에 발생하는 모든 작업
- API 요청
- 이벤트 등록/해제
- 타이머(setTimeout, setInterval)
- DOM 직접 조작
- 로깅, 구독(subscribe)
왜 렌더링 안에서 side effect를 하면 안 되는가
렌더링은 순수해야 함
- 같은 props/state → 항상 같은 UI
- 렌더링 중 side effect 발생 시 예측 불가
// 안 좋은 예
functionComponent() {
fetch('/api');// 렌더링 중 side effect
return<div />;
}
// 올바른 예
useEffect(() => {
fetch('/api');
}, []);
⇒ 렌더는 UI 계산만, effect는 useEffect에서
기본 문법
useEffect(() => {
// 실행 코드
return() => {
// cleanup
};
}, [deps]);
useEffect 안에서 사용하는 props ,state, 함수는 원칙적으로 deps에 넣어야 한다
useEffect 호출 시점
- deps 없음
useEffect(() => {
console.log("렌더 후 실행");
});
- 의존성 배열을 넘기지 않을 경우에는 매 렌더링마다 호출 (모든 렌더링 후마다 실행)
-
state/props 변경 시 계속 실행
⇒ 거의 안 씀 (성능 이슈)
- deps 빈 배열
[]
useEffect(() => {
console.log("마운트 시 1회");
}, []);
- 컴포넌트 마운트 후 한 번만 실행
-
초기 데이터 로딩에 사용
⇒
componentDidMount역할
- deps 배열 있음
useEffect(() => {
console.log("count 변경 시 실행");
}, [count]);
- 해당 값이 변경될 때만 실행
-
이전 값 → 변경된 값 감지
⇒
componentDidUpdate
cleanup 함수
useEffect(() => {
const id =setInterval(() => {
console.log("running");
},1000);
return() => {
clearInterval(id);
};
}, []);
cleanup 실행 시점
- 컴포넌트 언마운트 시
- deps 변경으로 effect가 다시 실행되기 직전
- 메모리 누수 방지 필수
useEffect와 렌더링 순서
- 컴포넌트 렌더링
- DOM 업데이트
- 브라우저 화면 표시
- useEffect 실행
렌더링을 막지 않는다 (비동기처럼 동작)
세부과정
useEffect는 컴포넌트의 생명주기 시점에 맞춰 부수 효과(side effect)를 실행하는 훅
- 마운트 시
- 컴포넌트가 처음 렌더링된 후 한 번 실행
- 초기 데이터 로딩, API 호출, 이벤트/구독 설정 등에 사용
- 업데이트 시
- 의존성 배열에 포함된 값이 변경될 때마다 실행
- 실행 순서
- 이전 effect의 클린업 함수 실행
- 변경된 state/props 기준으로 effect 본문 실행
- 언마운트 시
useEffect에서 return한 클린업 함수가 실행- 이벤트 제거, 타이머 해제, 구독 취소 등에 사용
- 의존성 배열 규칙
[ ]→ 마운트 시 한 번만 실행[value]→value가 변경될 때마다 실행- 생략 → 매 렌더링마다 실행
요약
useEffect는 렌더링 이후 실행되며, API 요청이나 이벤트 처리 같은 부수 효과를 관리하는 훅이다.
참고자료
- https://ko.legacy.reactjs.org/docs/hooks-effect.html#explanation-why-effects-run-on-each-update
- https://velog.io/@sucream/%EA%B7%B8%EB%9E%98%EC%84%9C-useEffect%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%93%B0%EB%8A%94%EA%B1%B4%EB%8D%B0%EC%9A%94
- https://jhbljs92.tistory.com/entry/7-useEffect