react에서 useEffect란?
useEffect
는 리액트에서 부수효과(side effects)를 처리하는 데 사용되는 hook입니다.
컴포넌트가 렌더링된 후, 데이터를 가져오거나 구독을 설정하거나 타이머를 시작하는 등의 작업을 할 때 유용하게 사용됩니다.
쉽게 말해서 jquery의 document.ready와 비슷하다 생각하면 됩니다.
목차
예를 들어 화면이 렌더링 된뒤에 api 데이터를 가져와서 처리를 해야 한다던지 할 때 좋습니다.
이번 포스트에서는 useEffect
의 기본 사용법과 함께 다양한 예제를 살펴보겠습니다.
useEffect란?
useEffect
는 리액트 훅으로 렌더링 된 뒤에 처리하는 기능을 제공합니다. 컴포넌트의 렌더링 외부에서 일어나는 작업들, 예를 들어 데이터 가져오기, 타이머 설정, 구독 관리 등을 의미합니다.
useEffect
는 컴포넌트가 렌더링된 후 또는 의존성 배열에 있는 값이 변경될 때 실행됩니다.
useEffect 기본 사용법
useEffect
는 두 가지 주요 매개변수를 받습니다:
- 실행할 함수: 부수효과를 수행하는 함수
- 의존성 배열 (optional): 특정 값이 변경될 때만
useEffect
를 실행하도록 설정
import React, { useState, useEffect } from 'react';
const ExampleComponent = () => {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('컴포넌트가 렌더링된 후 실행됩니다.');
}, [count]); // count가 변경될 때마다 실행
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
};
export default ExampleComponent;
useEffect 의존성 배열
useEffect
의 두 번째 매개변수인 의존성 배열은 이 배열에 있는 값들이 변경될 때마다 useEffect
를 실행하도록 설정할 수 있습니다. 배열에 아무 값도 넣지 않으면, useEffect
는 컴포넌트가 처음 렌더링될 때만 실행됩니다.
// 의존성 배열에 count를 넣으면, count가 변경될 때마다 useEffect가 실행됩니다.
useEffect(() => {
console.log('count가 변경되었을 때만 실행됩니다.');
}, [count]);
// 빈 의존성 배열 사용 시, 컴포넌트가 처음 렌더링될 때만 실행됩니다.
useEffect(() => {
console.log('컴포넌트가 처음 렌더링될 때만 실행됩니다.');
}, []);
클린업 함수
부수효과가 완료된 후, 리소스를 정리할 때 클린업 함수를 사용할 수 있습니다. 예를 들어, 타이머를 설정하거나 외부 데이터베이스에 구독을 설정할 때, 컴포넌트가 언마운트될 때 리소스를 정리하는 코드가 필요합니다.
useEffect(() => {
const timer = setInterval(() => {
console.log('타이머 작동 중');
}, 1000);
// 컴포넌트가 언마운트되거나 의존성 배열이 변경될 때 타이머를 정리합니다.
return () => clearInterval(timer);
}, []);
다양한 useEffect 예제
예제 1: API 호출 후 상태 업데이트
import React, { useState, useEffect } from 'react';
const FetchDataExample = () => {
const [data, setData] = useState(null);
useEffect(() => {
fetch('https://jsonplaceholder.typicode.com/posts')
.then(response => response.json())
.then(json => setData(json));
}, []); // 컴포넌트가 처음 렌더링될 때만 호출
if (!data) {
return <p>Loading...</p>;
}
return (
<div>
<h3>{data[0].title}</h3>
</div>
);
};
export default FetchDataExample;
예제 2: 타이머 설정
import React, { useState, useEffect } from 'react';
const TimerExample = () => {
const [time, setTime] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setTime(prevTime => prevTime + 1);
}, 1000);
return () => clearInterval(interval); // 타이머 클린업
}, []);
return (
<div>
<p>Time: {time} seconds</p>
</div>
);
};
export default TimerExample;
예제 3: 상태 변경 시 다른 작업 수행
import React, { useState, useEffect } from 'react';
const StatusExample = () => {
const [status, setStatus] = useState('offline');
useEffect(() => {
if (status === 'online') {
console.log('유저가 온라인 상태입니다!');
}
}, [status]); // status가 변경될 때마다 실행
return (
<div>
<p>Status: {status}</p>
<button onClick={() => setStatus('online')}>Go Online</button>
</div>
);
};
export default StatusExample;
결론
useEffect
는 리액트에서 화면이 렌더링 된 뒤에 뭔가를 처리할 때 유용합니다.
데이터 fetching, 타이머 설정, 구독 관리 등 다양한 부수효과를 처리할 수 있으며, 의존성 배열과 클린업 함수를 사용하여 효율적으로 리소스를 관리할 수 있습니다.
다양한 예제를 통해 useEffect
의 활용법을 익혀보세요.