-
Notifications
You must be signed in to change notification settings - Fork 1
useEffect 의존성 배열
dannysir edited this page Nov 22, 2024
·
1 revision
개발을 하다보니 아래와 같은 문제를 마주치게 되었다. 아래 문제는 useEffect 내부에서 사용하는 요소가 의존성 배열에 없기 때문에 발생하는 문구인데 단순하게 의존성 배열에 해당 함수나 값을 넣게 되면 무한 렌더링이 발생할 수 있다.

useEffect의 두 번째 인자로 전달되는 배열을 의존성 배열(dependencies array)이라고 한다. 이 배열 내부의 값들이 변경될 때마다 useEffect가 재실행된다.
useEffect(() => {
// 수행할 작업
}, [dependency1, dependency2]);
내가 가장 먼저 했던 실수는 아래처럼 useEffect 내부에서 사용하는 함수를 의존성 배열에 넣지 않아서 발생했다.
javascript
Copy
const MyComponent = () => {
const [data, setData] = useState([]);
const fetchData = () => {
// API 호출 등의 로직
};
useEffect(() => {
fetchData();
}, []);// 빈 의존성 배열
};
문제점
- ESLint 규칙 위반
- "React Hook useEffect has a missing dependency: 'fetchData'"
- 클로저 문제:
fetchData
함수가 컴포넌트 내부의 상태나 props를 사용한다면, 항상 첫 렌더링 시점의 값을 참조하게 된다. - 잠재적 버그: 의존성 배열이 비어있어서
fetchData
함수가 업데이트되더라도 effect가 재실행되지 않는다.
이후 해당 문제를 해결하기 위해 아래처럼 함수를 그대로 의존성 배열에 넣었다.
그런데 이렇게 할 경우 리렌더링이 일어날 때마다 fetchData
함수가 새로 생성되고 useEffect가 매번 실행되는 문제가 발생한다.
const MyComponent = () => {
const [data, setData] = useState([]);
// 🔴 잘못된 예시: 매 렌더링마다 새로운 함수가 생성됨
const fetchData = () => {
// API 호출 로직
};
useEffect(() => {
fetchData();
}, [fetchData]); // fetchData가 매번 새로 생성되어 무한 루프 발생
};
useCallback은 함수를 메모이제이션하여 불필요한 재생성을 방지할 수 있다.
const MyComponent = () => {
const [data, setData] = useState([]);
// ✅ 올바른 예시: 의존성이 변경될 때만 함수가 새로 생성됨
const fetchData = useCallback(() => {
// API 호출 로직
}, []); // 빈 의존성 배열: 컴포넌트가 마운트될 때만 함수 생성
useEffect(() => {
fetchData();
}, [fetchData]); // 이제 안전하게 의존성으로 사용 가능
};
useCallback의 의존성 배열도 useEffect와 마찬가지로 잘 확인해야 한다.
// 🔴 잘못된 예시: 필요한 의존성 누락
const handleUpdate = useCallback(() => {
console.log(data); // data는 의존성 배열에 포함되어야 함
}, []);
// ✅ 올바른 예시
const handleUpdate = useCallback(() => {
console.log(data);
}, [data]);
모든 함수에 useCallback을 적용하는 것은 오히려 성능을 저하시킬 수 있다.
const SimpleComponent = () => {
// 🔴 불필요한 사용: 단순한 함수의 경우 useCallback이 필요하지 않음
const handleClick = useCallback(() => {
console.log('clicked');
}, []);
// ✅ 이렇게 작성하는 것이 더 명확하고 효율적
const handleClick = () => {
console.log('clicked');
};
};
- useEffect의 의존성으로 함수를 사용할 때
- 자식 컴포넌트의 props로 함수를 전달할 때
- 복잡한 로직이 포함된 함수가 불필요하게 재생성되는 것을 방지하고 싶을 때
- [FE] 프론트엔드 기술스택
- [FE] 라이브러리 없이 차트 구현 이유
- [FE] Canvas API 사용방법
- [FE] 네비게이션 바 애니메이션 구현
- [FE] Socket.io 사용방법
- [FE] Tanstack Router에 대하여...
- [FE] Intl(Internationalization) API
- [FE] React Suspense 적용
- [FE] 한글 입력 방식의 유연성을 높인 검색 시스템 구현하기
- [BE] 백엔드 기술 스택
- [BE] SSE vs Socket.io
- [BE] Redis를 도입하게 된 계기
- [BE] ACG Rule을 활용한 Secure CI CD 파이프라인 구현
- [BE] Nginx 로드밸런싱을 통해 한국 투자 API 소켓 제한 극복
- [BE] 주가 지수 기능 개발 과정
- [BE] 매수 및 매도 기능 개발 과정
- [BE] 실시간 자산 조회 기능 개발 과정
- [BE] 단위 테스트
- [BE] redis를 이용한 한국투자 Open API 세션 관리
- [BE] 데이터베이스 인덱싱
- [FE] React에서의 DOM 요소 접근 (useRef vs getElementById)
- [FE] Outlet을 활용한 공통 레이아웃 관리
- [FE] react hooks가 특정 조건에서 실행되면 안되는 이유 & useQuery에 query function 매개변수가 undefined일 수도 있을 때 어떻게 해결할까
- [FE] cross‐domain 로컬 환경에서 cookie로 인증 처리하기 with vite proxy
- [FE] 크롬&사파리 Composition 차이
- [FE] useEffect 의존성 배열
- [BE] Naver Cloud Platform HTTPS 무응답 현상
- [BE] 한국투자 Open API에서 access token을 발급받지 못하는 문제
- [BE] 한국투자 Open API와 웹소켓 연결이 되지 않던 문제
- [BE] 한국투자 Open API 웹소켓 연결이 중단되는 문제
- [BE] 같은 주식 주문이 동시에 여러 번 체결되는 문제
- [BE] 한국투자 Open API Websocket 세션을 두 개에서 한 개로 변경하기
- [BE] Nginx 로드 밸런싱 중 Socket bad Request 발생하는 현상
- [BE] 매수/매도 체결 로직에 의해 redis pub/sub이 정상적으로 동작하지 않는 문제