- 영어 버전 : [[Solving Memory Leaks with
useEffect
in React Applications]]
React 애플리케이션에서 useEffect
를 사용한 메모리 누수 해결하기
저는 개발 중인 Electron 앱의 뷰를 작업하는 동안 메모리 누수 경고를 만났습니다. 해당 경고를 보자마자 이 경고가 useEffect
훅에서 비롯된 것이라고 의심하였습니다. 왜냐하면 React의 useEffect
는 컴포넌트의 생명주기 동안 부수 효과(side effects)를 관리하기 위해 사용되며, 이 훅을 잘못 사용하면 예상치 못한 방식으로 함수가 반복 실행될 수 있어 숨겨진 위험의 원천이 될 수 있기 때문입니다. 특히, 이벤트 리스너를 추가하고 제대로 청소하지 않을 경우 메모리 누수로 이어질 수 있습니다.
React 애플리케이션에서 메모리 누수는 특히 이벤트 리스너를 자주 추가하고 제거하는 컴포넌트에서 성능에 큰 영향을 줄 수 있습니다. 문제의 핵심은 useEffect
와 함수 인스턴스의 잘못된 사용에 있어, 이벤트 리스너가 쌓이게 됩니다. 이 글에서는 문제의 근원을 파고들고 React 앱을 원활하게 유지하기 위한 견고한 해결책을 제공합니다.
문제: useEffect
에서의 메모리 누수와 함수 인스턴스
useEffect
훅 내에서 이벤트 리스너를 첨부할 때, 개발자들은 종종 이벤트 핸들러 함수의 새 인스턴스를 각 렌더링마다 생성하는 경향이 있습니다. 이 패턴은 컴포넌트가 다시 렌더링될 때마다 새로운 함수 인스턴스가 이벤트 리스너로 추가되고, 이전의 리스너가 제대로 제거되지 않아 메모리 누수로 이어지게 됩니다. 자주 업데이트되는 애플리케이션에서는 이 문제가 급속도로 누적되어 성능 저하를 초래하고 React에서 잠재적인 메모리 누수에 대한 경고를 발생시킵니다.
문제 해결 방법
이 문제를 방지하기 위해서는 이벤트 리스너가 제대로 청소되고, 이벤트 핸들러 함수의 동일한 인스턴스가 리스너 추가와 제거에 모두 사용되는지 확인해야 합니다. 이는 useEffect
외부에서 이벤트 핸들러를 정의하거나 ref를 사용하여 안정적인 함수 참조를 저장함으로써 달성할 수 있습니다.
useEffect
내에서 이벤트 리스너를 올바르게 사용하기
아래는 메모리 누수를 피하기 위해 useEffect
내에서 이벤트 리스너를 올바르게 사용하는 방법을 보여주는 코드 블록입니다:
import { useEffect, useCallback } from 'react';
function MyComponent() {
// useCallback을 사용하여 안정적인 참조 확보
const handleEvent = useCallback(() => {
console.log('Event handled');
}, []); // 의존성 배열이 비어 있어 이 함수 인스턴스는 변경되지 않음
useEffect(() => {
// 'myEventEmitter'가 EventEmitter 또는 유사한 것으로 가정
myEventEmitter.on('eventName', handleEvent);
// 이벤트 리스너를 제거하는 청소 함수 반환
return () => {
myEventEmitter.off('eventName', handleEvent);
};
}, [handleEvent]); // 함수가 변경될 경우를 대비해 'handleEvent'에 의존
return <div>My Component</div>;
}
이 패턴을 따름으로써,
- 핸들러의 단일 인스턴스가 컴포넌트의 수명 동안 유지됩니다. 동일한 이벤트에 대해 여러 리스너 생성을 방지합니다.
- 적절한 청소가 수행됩니다. 컴포넌트가 언마운트되거나 핸들러가 변경되기 전에 이벤트 리스너를 제거합니다.
향후 개발을 위한 주요 학습 사항
useEffect
내에서 이벤트 핸들러를 첨부할 때 항상 안정적인 참조를 사용하세요. 이는useCallback
을 사용하거나 함수를 컴포넌트 외부에서 정의함으로써 달성할 수 있습니다.useEffect
내에 이벤트 리스너를 제거하는 청소 함수를 반드시 포함시키세요. 이 청소 함수는 컴포넌트가 언마운트될 때 또는 효과가 다시 실행되기 전에 실행됩니다.useEffect
의 의존성 배열에 주의를 기울이세요. 의존성을 잘못 지정하면 청소가 누락되거나 예상치 못한 효과 호출이 발생할 수 있습니다.
이러한 모범 사례를 준수함으로써 개발자는 메모리 누수를 효과적으로 방지하고 React 애플리케이션의 성능을 최적화하여 원활하고 효율적인 사용자 경험을 보장할 수 있습니다.
'DEV > Frontend' 카테고리의 다른 글
Electron 컴포넌트 link로 이동 시킨 후 캡처 안되는 이유 (0) | 2024.02.09 |
---|---|
리액트에서 Electorn API 메모리 누수 예방 (0) | 2024.02.09 |
MUI 적용 가이드 - React 프로젝트에 MUI 통합하기 (0) | 2024.02.09 |
React Naviation 추가하는 방법 (1) | 2024.02.09 |
드래그 영역 시각화 및 깜박임 방지 (1) | 2024.02.06 |