useEffect 훅은 함수형 컴포넌트에서 부수 효과(side effects)를 처리하기 위해 사용되는 중요한 기능이다
useEffect 훅은 클래스 컴포넌트의 componentDidMount, componentDidUpdate, componentWillUnmount와 같은 라이프사이클 메서드를 함수형 컴포넌트에서도 사용할 수 있게 해준다.
이는 데이터 가져오기, 구독, DOM 업데이트 등 다양한 부수 효과를 관리하는 데 사용된다.
기본 사용법
import React, { useEffect } from 'react';
function MyComponent() {
useEffect(() => {
// 부수 효과 코드는 여기 작성된다.
console.log('Component mounted or updated');
// 정리(clean-up) 함수 반환 (선택 사항)
return () => {
console.log('Component will unmount');
};
}, []); // 의존성 배열
return <div>My Component</div>;
}
의존성 배열을 통해 useEffect가 언제 실행될지를 제어할 수 있다.
useEffect(() => {
console.log('Component mounted');
}, []);
const [count, setCount] = useState(0);
useEffect(() => {
console.log('Count changed:', count);
}, [count]);
useEffect(() => {
console.log('Component rendered');
});
useEffect(() => {
const timer = setInterval(() => {
console.log('Tick');
}, 1000);
// 정리 함수
return () => {
clearInterval(timer);
console.log('Clean up');
};
}, []);
useEffect(() => {
console.log('Effect 1');
}, [dependency1]);
useEffect(() => {
console.log('Effect 2');
}, [dependency2]);
const [isActive, setIsActive] = useState(false);
useEffect(() => {
if (isActive) {
console.log('Active state changed');
}
}, [isActive]);
의존성 배열 관리:
모든 의존성을 배열에 포함시켜야 한다. 이는 eslint-plugin-react-hooks를 통해 검증할 수 있다. 이 플러그인은 의존성 배열의 누락된 항목을 경고해 준다.
비동기 함수 사용:
useEffect 안에서 비동기 함수를 직접 사용할 수 없기 때문에, 내부에 비동기 함수를 정의하고 호출하는 패턴을 사용한다.
useEffect(() => {
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
};
fetchData();
}, []);
비동기 작업이 완료되기 전에 컴포넌트가 언마운트되면 레이스 컨디션이 발생할 수 있다. 이를 방지하기 위해 정리 함수 안에서 비동기 작업을 취소할 수 있는 패턴을 사용할 수 있다.
useEffect(() => {
let isCancelled = false;
const fetchData = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
if (!isCancelled) {
console.log(data);
}
};
fetchData();
return () => {
isCancelled = true;
};
}, []);
해당 게시글은 chat-GPT의 도움을 받아 작성되었습니다.
출처 :
chat-GPT