React/Hooks/Lesson 09
useEffect
35분·theory
이 챕터
1/5
JavaScript
useEffect
💡 왜 배워야 할까요?
🎯
서버에서 데이터를 받아오는 가장 기본적인 방법입니다.
💼
페이지 로드 시 한 번만 실행하거나 특정 값이 바뀔 때만 실행하는 제어가 가능합니다.
⚡
React 개발자라면 매일 쓰는 필수 기능입니다.
🏢 실무에서는
실무에서는 컴포넌트가 화면에 나타나면 useEffect로 API를 호출해 상품 목록, 사용자 정보 등을 받아옵니다. 거의 모든 웹 앱이 이 패턴으로 만들어집니다.
useEffect — 컴포넌트 생애주기, API 호출/타이머에 사용
실생활 비유: 입장/퇴장 안내원
컴포넌트가 화면에 나타날 때(마운트)와 사라질 때(언마운트)
자동으로 실행되는 코드를 등록하는 Hook.
왜 배우나요?
- ▸데이터 로딩 (API 호출)
- ▸타이머 설정
- ▸이벤트 리스너 등록/해제
기본 구조
의존성 배열 패턴
💡 ⚠️ 흔한 실수
- ▸의존성 배열에 필요한 값을 누락하여 ESLint 경고를 무시하는 경우 (exhaustive-deps 규칙 위반)
- ▸클린업 함수 없이 setInterval, addEventListener 등을 사용하여 메모리 누수 발생
- ▸async/await을 useEffect 콜백에 직접 사용하기 (useEffect는 cleanup 함수만 반환해야 함)
- ▸객체나 배열을 의존성으로 사용할 때 참조 동등성 문제로 무한 렌더링 발생
💡 🎯 면접 준비
Q: useEffect의 의존성 배열이 빈 배열일 때와 없을 때의 차이점을 설명해주세요
Q: useEffect에서 API 호출 시 경쟁 조건(Race Condition)을 어떻게 방지할 수 있나요?
Q: useEffect 클린업 함수는 언제 실행되고 왜 필요한가요?
힌트: 의존성 배열의 3가지 패턴(없음/빈배열/값있음)을 명확히 구분하고, AbortController나 cleanup 플래그를 이용한 경쟁 조건 해결 방법을 코드와 함께 설명. 메모리 누수 방지를 위한 클린업의 중요성을 실무 사례로 답변
⚛️ React 패턴 — useEffect
useEffect을 React에서 어떻게 쓰는지 코드와 함께 단계별로 익혀보세요.
1
🎯
1. Effect 정의
렌더 후 실행할 부수효과
useEffect(() => {
console.log('마운트 또는 count 변경');
}, [count]);
↓
2
📋
2. 의존성 배열
[] = 한 번만, [x] = x 변경 시, 없음 = 매번
↓
3
🧹
3. Cleanup 함수
return으로 정리 함수 — 언마운트 시 실행
useEffect(() => {
const t = setInterval(...);
return () => clearInterval(t); // cleanup
}, []);
↓
4
⚠️
4. 흔한 실수
의존성 빠뜨림 → stale closure / 무한 루프
⏰ useEffect — 마운트 + 의존성 + cleanup
코드를 직접 수정하면 0.7초 후 자동 반영됩니다. React 18 + Babel로 브라우저에서 즉시 실행.
🖥️ 실행 결과 — 렌더링된 React 컴포넌트
✏️ React 코드 수정하기 (클릭해서 열기)
⚛️ React 18 + Babel Standalone — 결과 먼저 확인 후 코드 편집기에서 직접 수정해볼 수 있습니다.
확인 퀴즈
useEffect의 의존성 배열이 [] (빈 배열)일 때 실행 시점은?
먼저 읽으면 좋은 개념: 폼 처리
다음 추천: useReducer — Redux 의 기반