React를 사용하다 보면, 컴포넌트가 화면에 나타나거나 사라질 때, 또는 특정 값이 변경될 때 어떤 작업을 하고 싶을 때가 많습니다. 예를 들어, 데이터를 가져오거나, 타이머를 설정하거나, 특정 작업을 정리(cleanup)해야 할 때 말이죠. 이럴 때 우리가 사용하는 것이 바로 useEffect
입니다.
useEffect
를 사용하면 컴포넌트가 렌더링될 때 또는 특정 값이 바뀔 때 필요한 작업을 자동으로 처리할 수 있습니다. 이번 글에서는 useEffect의 다양한 사용 시점을 알아보고, 실제 예시 코드를 통해 그 사용법을 익혀보도록 하겠습니다.
useEffect
의 사용 시점
useEffect는 다음과 같은 시점에서 사용됩니다.
- 컴포넌트가 처음 화면에 나타날 때
- 특정 값이 바뀔 때
- 컴포넌트가 매 렌더링마다 실행될 때
- 컴포넌트가 화면에서 사라질 때
1. 컴포넌트가 처음 화면에 나타날 때
컴포넌트가 처음 렌더링될 때 한 번만 실행하고 싶은 코드가 있을 때 사용합니다. 예를 들어, 컴포넌트가 처음 나타날 때 데이터를 서버에서 가져오는 작업을 수행할 수 있습니다.
useEffect(() => {
// 컴포넌트가 처음 화면에 나타날 때 한 번 실행됨
console.log('컴포넌트가 처음 렌더링됐어!');
}, []);
여기서 끝에 []
빈 배열을 주목해주세요. 빈 배열을 두 번째 인자로 주면, 이 useEffect
는 컴포넌트가 처음 화면에 나타날 때 한 번만 실행됩니다.
2. 특정 값이 바뀔 때
어떤 특정 값이 바뀔 때마다 실행하고 싶은 코드가 있을 때 사용합니다. 예를 들어, 사용자가 입력한 값이 변경될 때마다 이를 처리하는 작업을 수행할 수 있습니다.
useEffect(() => {
// 특정 값(count)이 바뀔 때마다 실행됨
console.log(`count 값이 ${count}로 바뀌었어!`);
}, [count]);
이 코드에서는 count
값이 변경될 때마다 useEffect
안의 코드가 실행됩니다. 이때 count
는 두 번째 인자로 전달된 배열 안에 있습니다.
3. 컴포넌트가 매 렌더링될 때
컴포넌트가 매 렌더링될 때 실행하고 싶은 코드가 있을 때 사용합니다. 이 경우 두 번째 인자로 빈 배열도, 특정 값도 전달하지 않으면 됩니다.
useEffect(() => {
// 매 렌더링마다 실행
console.log('컴포넌트가 렌더링됐어!');
});
이 useEffect
는 컴포넌트가 처음 렌더링될 때뿐만 아니라, 상태나 props가 바뀌어서 컴포넌트가 다시 렌더링될 때마다 실행됩니다.
4. 컴포넌트가 화면에서 사라질 때
컴포넌트가 화면에서 사라질 때 실행하고 싶은 정리 작업이 있을 때 사용합니다. 예를 들어, 타이머를 정리하거나 이벤트 리스너를 제거하는 작업을 할 수 있습니다.
useEffect(() => {
console.log('컴포넌트가 렌더링됐어!');
return () => {
// 컴포넌트가 화면에서 사라질 때 실행됨
console.log('컴포넌트가 사라지고 있어!');
};
}, []);
이 예시에서는 컴포넌트가 처음 렌더링될 때 console.log
를 실행하고, 컴포넌트가 화면에서 사라질 때 return
뒤에 있는 함수가 실행됩니다.
예시로 쉽게 이해하기
이제 실제 예시를 통해 useEffect
가 어떻게 작동하는지 알아볼까요?
예를 들어, 단어들을 순차적으로 화면에 나타나게 해봅시다. 각 단어는 0.3초 간격으로 하나씩 나타나야 합니다.
import { useEffect, useState } from "react";
export default function WordList({ words = [] }) {
const [visibleItems, setVisibleItems] = useState([]);
useEffect(() => {
words.forEach((word, index) => {
setTimeout(() => {
setVisibleItems((prevItems) => [...prevItems, word]);
}, index * 300); // 각 단어가 0.3초 간격으로 나타남
});
}, [words]);
return (
<ul>
{visibleItems.map((word, index) => (
<li key={index}>
{word}
</li>
))}
</ul>
);
}
이 코드가 하는 일은 다음과 같습니다.
useEffect
가 실행되면서,words
배열에 있는 단어들을 하나씩 순차적으로 보여줍니다.setTimeout
을 사용해 각 단어가 나타나는 시간을 0.3초 간격으로 조절합니다.setVisibleItems
상태를 업데이트해서, 시간이 지날수록 더 많은 단어들이 화면에 나타나도록 합니다.
*참고로 `prevItems` 인수는 자동으로 `setVisibleItems` 함수에 전달 됩니다.
아래는 예시 코드를 응용하여 구현한 영상입니다.
마무리
`useEffect` 는 React 에서 컴포넌트의 생명 주기 동안 발생하는 중요한 시점들을 관리하고, 원하는 작업을 자동으로 처리할 수 있게 해주는 유용한 훅입니다. React 로 개발할 때 useEffect 훅을 적재적소에 활용해보시기 바랍니다.
'나는 이렇게 학습한다 > Frontend' 카테고리의 다른 글
Tailwind CSS로 줄바꿈 방지와 긴 문자열 생략하기 (0) | 2024.08.07 |
---|---|
TypeScript 타입 종류 한 번에 정리 (0) | 2024.08.06 |
React와 Tailwind CSS로 간단한 애니메이션 구현하기 (0) | 2024.08.05 |
React Query의 useMutation 구현 예시와 콜백 활용법 (2) | 2024.08.04 |
React Query의 useQuery를 활용한 데이터 조회 및 상태 관리 (0) | 2024.08.03 |