React useEffect 클린업 함수는 왜 필요한가요?
한 줄 답변
useEffect의 클린업 함수는 컴포넌트 언마운트 또는 다음 효과 실행 직전에 이전 부수 효과를 정리하여 메모리 누수, 중복 이벤트 등록, 비동기 상태 업데이트 오류를 방지하는 필수 메커니즘입니다.
핵심 개념 정리
React의 useEffect는 컴포넌트의 생명주기에 따라 외부 API 연동, 수동적인 DOM 조작, 타이머 설정 등의 부수 효과(Side Effect)를 처리하는 강력한 훅입니다. 여기서 '클린업(Cleanup)' 함수는 useEffect 내부에서 return되는 함수로, 등록된 부수 효과를 안전하게 종료하거나 해제하는 역할을 수행합니다. 주로 이벤트 리스너 제거, 웹소켓 구독 해제, setTimeout/setInterval 중단과 같은 정리 작업이 이곳에서 이루어집니다.
많은 개발자가 클린업 함수는 컴포넌트가 화면에서 사라질 때(Unmount)만 실행된다고 오해하곤 합니다. 하지만 실제로는 의존성 배열에 포함된 값이 변경되어 useEffect가 재실행될 때마다, 새로운 효과가 적용되기 직전에 이전 차례의 효과를 정리하기 위해 먼저 호출됩니다. 즉, '이전 상태의 정리'와 '현재 상태의 설정'이 순차적으로 일어나며 애플리케이션의 상태 일관성을 유지합니다. 이러한 메커니즘은 React가 동적인 UI를 효율적으로 관리하는 핵심 방식 중 하나입니다.
만약 클린업 함수를 적절히 구현하지 않는다면 심각한 성능 저하와 버그를 초래할 수 있습니다. 예를 들어, 전역 윈도우 객체에 resize 이벤트를 등록하고 정리하지 않으면 컴포넌트가 다시 그려질 때마다 리스너가 기하급수적으로 늘어나는 '이벤트 리스너 누수'가 발생합니다. 또한, 이미 사라진 컴포넌트의 state를 업데이트하려다 발생하는 'Memory Leak' 경고나, 이전 네트워크 요청의 결과가 늦게 도착해 현재 화면의 데이터와 충돌하는 'Race Condition' 문제도 클린업 함수를 통해 해결할 수 있는 대표적인 실무 사례입니다.
비교 정리
| 항목 | 클린업 함수 사용 | 클린업 미사용 |
|---|---|---|
| 이벤트 리스너 | 정확한 시점에 리스너를 제거하여 중복 등록 방지 | 중복 등록으로 인한 예기치 못한 동작 및 자원 낭비 |
| 메모리 관리 | 타이머, 구독 등을 즉시 해제하여 자원 최적화 | 백그라운드에서 계속 실행되어 불필요한 메모리 소모 |
| 데이터 정합성 | 이전 요청의 결과를 무시하거나 취소하여 상태 꼬임 방지 | 경쟁 상태(Race Condition) 발생 가능성 존재 |
| 콘솔 경고 | 언마운트된 컴포넌트의 상태 업데이트 방지로 경고 해결 | 메모리 누수 관련 React 경고(Warning) 빈번 발생 |
면접에서 이렇게 답하세요
단순히 '컴포넌트가 사라질 때 실행된다'고 답하기보다는, '다음 렌더링에 의한 이펙트 실행 전에도 실행되어 이전 상태를 정리한다'는 점을 명확히 강조하세요. 윈도우 이벤트 리스너나 setInterval 같은 구체적인 예시를 들며, 정리하지 않았을 때 발생할 수 있는 메모리 누수나 좀비 프로세스 문제를 기술적으로 설명하면 좋은 점수를 받을 수 있습니다. 특히 비동기 요청 취소 로직(AbortController 등)을 언급하면 실무 경험이 풍부해 보입니다.
자주 묻는 추가 질문
Q. 클린업 함수는 항상 실행되나요?
아니요, 의존성 배열이 빈 배열([])이면 언마운트 시에만 실행되고, 배열에 값이 있으면 값이 변할 때마다 이전 효과를 정리하기 위해 실행됩니다.
Q. 비동기 작업(Fetch) 중 클린업은 어떻게 하나요?
AbortController를 사용하여 요청을 중단하거나, 내부 변수를 두어 언마운트 후에는 setState를 호출하지 않도록 처리합니다.
Q. 클린업 함수를 작성하지 않으면 어떤 문제가 생기나요?
이벤트 리스너가 무한히 증식하여 CPU 사용량이 늘어나거나, 이미 사라진 컴포넌트를 참조하려는 오류가 발생하여 서비스가 불안정해집니다.
커뮤니티 하이라이트
“시니어 면접에서도 간혹 '이전 이펙트가 정리되는 시점'에 대해 꼬리 질문이 들어옵니다. 동작 원리를 정확히 파악하는 게 중요해요.”
“실무에서는 특히 웹소켓 연결이나 차트 라이브러리 연동 시 클린업 누락으로 인한 버그가 정말 많습니다. 습관적으로 챙겨야 합니다.”
38명의 개발자가 이 질문에 참여했습니다
관련 면접 질문
앱에서 직접 답변해보세요
매일 3개의 면접 질문에 답변하고,
다른 개발자들의 답변을 비교해보세요.