ReactJS - useEffect 사용법: 초보자를 위한 종합 가이드
안녕하세요, 미래의 React 마법사 여러분! 오늘 우리는 React의 useEffect
세계로 흥미진진한 여정을 떠납니다. 프로그래밍에 새로운 사람이라고 걱정하지 마세요 - 저는 당신의 친절한 안내자가 되겠습니다. 우리는 단계별로 이를 탐구하겠습니다. 이 튜토리얼의 끝까지 따라오면, useEffect
를 마스터하듯이 사용할 수 있을 것입니다!
useEffect는 무엇인가요?
들어가기 전에, useEffect
에 대해 이해해 보겠습니다. 케이크를 만들어 보세요. 재료를 섞고, 오븐에 넣고, 그런 다음... 무엇을 하겠습니까? 타이머를 설정할 수도 있을 것 같죠? useEffect
는 React에서 이와 같은 역할을 합니다. 컴포넌트의 주요 작업인 UI 렌더링 외에 수행되는 "サイ드エフェクト"를 가능하게 합니다.
サイ드エフェクト는 다음과 같은 행동일 수 있습니다:
- API에서 데이터 가져오기
- DOM을 수동으로 변경하기
- 구독 설정하기
이제 구체적인 내용을 알아보겠습니다!
useEffect의 서명
useEffect
훅은 특정 방식으로 작성되어야 합니다. 이를 분해해 보겠습니다:
useEffect(() => {
// 효과 코드 여기에
}, [dependencies]);
이 각 부분이 무엇을 의미하는지 살펴보겠습니다:
-
useEffect
: 우리가 사용하는 훅의 이름입니다. -
() => { ... }
: 우리가 효과 코드를 넣는 아로 화살표 함수입니다. -
[dependencies]
: 우리의 효과가 의존하는 모든 값을 나열하는 선택적 배열입니다.
간단한 예제를 보겠습니다:
import React, { useEffect, useState } from 'react';
function Timer() {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval = setInterval(() => {
setSeconds(prevSeconds => prevSeconds + 1);
}, 1000);
return () => clearInterval(interval);
}, []);
return <div>Seconds: {seconds}</div>;
}
이 예제에서 우리는 간단한 타이머를 만들고 있습니다. useEffect
훅은 인터벌을 설정하여 우리의 seconds
상태를 매秒마다 증가시킵니다. 빈 의존성 배열 []
은 이 효과가 컴포넌트가 마운트될 때만 실행된다는 것을 의미합니다.
효과 훅의 기능
이제 기본 예제를 보았으니, 효과 훅의 주요 기능을 탐구해 보겠습니다:
- 시간: 기본적으로 모든 렌더링 후에 실행됩니다.
- 조건부 실행: 의존성 배열을 사용하여 효과 실행 시간을 제어할 수 있습니다.
- 정리: 효과에서 정리 함수를 반환하여 메모리 누수를 방지할 수 있습니다.
이제 각각의 기능을 더 자세히 살펴보겠습니다.
시간
기본적으로 useEffect
는 모든 렌더링 후에 실행됩니다. 이는 상태를 업데이트하는 효과가 무한 루프를 유발할 수 있음을 의미합니다. 다음은 하지 말아야 할 예제입니다:
function BadExample() {
const [count, setCount] = useState(0);
useEffect(() => {
setCount(count + 1); // 이는 무한 루프를 유발합니다!
});
return <div>{count}</div>;
}
조건부 실행
효과가 불필요하게 실행되지 않도록 하기 위해 의존성 배열을 제공할 수 있습니다:
function ConditionalEffect({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
fetchUser(userId).then(data => setUser(data));
}, [userId]);
return <div>{user ? user.name : 'Loading...'}</div>;
}
이 예제에서 효과는 userId
가 변경될 때만 실행됩니다.
정리
일부 효과는 메모리 누수를 방지하기 위해 정리 함수가 필요합니다. 다음은 이를 어떻게 하는지 보여줍니다:
function CleanupExample() {
useEffect(() => {
const subscription = subscribeToSomething();
return () => {
subscription.unsubscribe();
};
}, []);
return <div>I'm subscribed!</div>;
}
효과에서 반환된 함수는 컴포넌트가 언마운트될 때 호출됩니다.
API 데이터 가져오기
useEffect
의 일반적인 사용 사례는 API에서 데이터 가져오기입니다. 예제를 보겠습니다:
function DataFetcher() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
setData(data);
setLoading(false);
})
.catch(error => {
setError(error);
setLoading(false);
});
}, []);
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return <div>Data: {JSON.stringify(data)}</div>;
}
이 컴포넌트는 마운트될 때 API에서 데이터를 가져오고, 로딩 및 오류 상태를 처리하며, 데이터가 준비되면 표시합니다.
DOM 변경
useEffect
는 또한 DOM을 직접 조작할 수 있습니다. 예제를 보겠습니다:
function DOMManipulator() {
useEffect(() => {
const element = document.getElementById('my-element');
element.style.color = 'red';
return () => {
element.style.color = '';
};
}, []);
return <div id="my-element">I'm red!</div>;
}
이 효과는 컴포넌트가 마운트될 때 요소의 색상을 빨간색으로 변경하고, 언마운트될 때 초기 색상으로 되돌립니다.
정리 함수
정리 함수에 대해 더 깊이 탐구해 보겠습니다. 정리 함수는 메모리 누수를 방지하는 데 필수적입니다. 더 복잡한 예제를 보겠습니다:
function WindowResizer() {
const [windowWidth, setWindowWidth] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => setWindowWidth(window.innerWidth);
window.addEventListener('resize', handleResize);
return () => {
window.removeEventListener('resize', handleResize);
};
}, []);
return <div>Window width: {windowWidth}px</div>;
}
이 예제에서 우리는 컴포넌트가 마운트될 때 이벤트 리스너를 추가하고, 언마운트될 때 이를 제거합니다. 이는 리스너가 더 이상 필요하지 않을 때 남아 있지 않도록 합니다.
요약
이제 우리가 useEffect
에 대해 배운 내용을 요약해 보겠습니다:
기능 | 설명 |
---|---|
서명 | useEffect(() => { ... }, [dependencies]) |
시간 | 기본적으로 모든 렌더링 후에 실행됩니다 |
조건부 실행 | 의존성 배열을 사용하여 효과 실행 시간을 제어합니다 |
정리 | 효과에서 정리 함수를 반환하여 메모리 누수를 방지합니다 |
데이터 가져오기 | API에서 데이터를 가져오는 데 사용됩니다 |
DOM 조작 | 직접 DOM을 조작할 수 있습니다 |
정리 함수 | 메모리 누수를 방지하는 데 필수적입니다 |
이제 useEffect
에 대한 첫 걸음을 뗐습니다! 기억하시기 바랍니다, 강력한 도구를 사용하는 것은 연습이 필요합니다. 그래서 두려워 말고 실험하고 실수를 하세요 - 우리 모두가 배우는 방법입니다. 행복한 코딩을 기원하며, 당신의 효과가 항상 깨끗하고 컴포넌트가 항상 반응적이기를 바랍니다!
Credits: Image by storyset