useEffect | useLayoutEffect | |
실행 시점 | 랜더링이 완료되는 시점 (렌더링 후 화면에 직접적인 영향 없음) |
랜더링 후 DOM이 업데이트 되기 직전 (화면이 그려지기 전) |
동기/비동기 | 비동기적 | 동기적 |
예시 | 사용자 데이터를 API에서 가져옴 (데이터 렌더링 후 화면 업데이트) 이벤트 리스너를 추가함 |
DOM 크기를 측정해서 다른 요소 위치 조정 (요소 높이 측정해 레이아웃 높이 조정) |
코드 | useEffect(()=> { fetchData().then(data=>setData(data)); },[]); |
useLayoutEffect(()=>{ const height=ref.current.offsetHeight; setHeight(height); },[]); |
참고 | 기본적으로 사용 | 너무 많이 실행되면 렌더링 느려짐 |
useEffect 호출 시점은 언제인가?
useEffect는 컴포넌트의 life cycle에 따라 특정 작업을 수행할 수 있도록 도와주는
컴포넌트가 마운트, 업데이트, 언마운트되는 시점에 자동으로 호출 됨
useEffect의 구조
useEffect(() => {
// 실행할 작업 (부수 효과)
return () => {
// 정리 작업 (클린업 함수)
};
}, [dependencies]); // 의존성 배열
- 첫 번째 매개변수: 함수
- 컴포넌트 특정 시점(마운트, 업데이트)에 실행됨
- 내부에서 데이터를 불러오거나, 이벤트 리스너를 등록하거나, DOM을 조작하는 등 작업
- 두 번째 매개변수: 의존성 배열(dependencies)
- useEffect가 실행되어야 할 조건을 명시함
- 의존성 배열이 있는 경우: 의존성 배열에 포함된 값이 변경될 때만, useEffect가 다시 호출됨
- 의존성 배열이 비어있는 경우: 컴포넌트의 최초 렌더링 시에만 useEffect가 실행됨
- 의존성 배열이 없는 경우: 매 렌더링마다 실행됨
- return 값: 클린업 함수
- return 함수는 컴포넌트가 언마운트되거나, 의존성 배열 값이 업데이트되기 직전에 실행됨
- 메모리 누수를 방지하고, 리소스를 해제하는 데 유용함(타이머 정리, 구독 해제, 이벤트 리스너 제거)
[1] 컴포넌트 마운트: 컴포넌트가 처음 화면에 렌더링 된 후, 필요한 초기 작업 수행
데이터 초기화, api 호출, 이벤트 리스너 등록 등을 수행할 수 있음
useEffect(() => {
console.log('컴포넌트가 마운트되었습니다.');
fetchData();
}, []); // 빈 배열 -> 최초 렌더링 시 1회만 실행
[2] 컴포넌트 업데이트: 의존성 배열에 지정된 값이 변경될 때마다
props나 state가 변경되었고, 해당 값이 의존성 배열에 포함되어 있을 경우에 호출됨
useEffect(() => {
console.log(`count 값이 ${count}로 변경되었습니다.`);
}, [count]); // count가 변경될 때 실행
클린업 함수 예시, count 값 변경 전에 기존 count값을 클린업하는 경우
useEffect(() => {
console.log(`count 값이 ${count}로 업데이트되었습니다.`);
return () => {
console.log(`이전 count 값 ${count}에 대한 클린업 실행`);
};
}, [count]);
[3] 컴포넌트 언마운트: 화면에서 컴포넌트가 제거됨
이벤트 리스너 제거나 구독 해제 같은 정리 작업을 진행함
useEffect(() => {
const handleScroll = () => console.log('스크롤 중');
window.addEventListener('scroll', handleScroll);
return () => {
console.log('컴포넌트가 언마운트되었습니다. 이벤트 리스너를 제거합니다.');
window.removeEventListener('scroll', handleScroll);
};
}, []);
출처
[1] 2025.01.13. [매일메일] 프론트엔드 질문 https://www.maeil-mail.kr/
[2] 매일메일. 250128. useEffect가 호출되는 시점에 대해 설명해 주세요. 64번. https://maeil-mail.kr
[3] React 공식 독스. Effect Hook https://ko.legacy.reactjs.org/docs/hooks-effect.html
'개발자 강화 > 프론트엔드' 카테고리의 다른 글
[매일메일] 자바스크립트 ES6 버전이란? (FE.250130) (0) | 2025.01.30 |
---|---|
🌟[매일메일] 브라우저 렌더링 파이프라인이란? (FE.241224/241213) (0) | 2025.01.29 |
🌟[매일메일] 자바스크립트의 Event Loop와 테스트 큐란? (FE.250122/241218) (0) | 2025.01.28 |
[매일메일] undefined와 null의 차이점? (FE.250127) (1) | 2025.01.27 |
🌟[공부] React의 트리 쉐이킹이란? (1) | 2025.01.26 |