[트러블 슈팅] 롱 폴링 방식 과정에서 메모리 누수 발생 - 100-hours-a-week/4-bull4zo-fe GitHub Wiki
롱 폴링 과정에서의 메모리 누수(6/12)
🐞 에러 내용
- 롱 폴링을 사용하는 컴포넌트가 unmount되어도 계속해서 요청이 발생하며 메모리 누수가 발견됨
🔍 원인 분석
- 롱 폴링을 위해 설정한
poll
함수가 컴포넌트가 unmount되어도 사라지지 않고, 계속해서 존재하며 동작함
✅ 해결 방법
- useRef를 통해 mount, unmount 정리 함수를 통해 값을 조절하고, poll함수가 unmount된 경우 동작하지 않도록 로직 개선
useEffect(() => {
if (!longPollingEnabled) return
let timer: ReturnType<typeof setTimeout>
let hasRetried = false
const poll = async () => {
const result = await refetchLongPolling()
if (result?.status === 'success') {
hasRetried = false
timer = setTimeout(poll)
} else if (!hasRetried) {
hasRetried = true
timer = setTimeout(poll, 3000)
} else {
toast.error('댓글을 불러오는 중 오류가 발생했습니다. 새로고침 후 다시 시도해주세요.')
}
}
poll()
return () => clearTimeout(timer)
}, [longPollingEnabled, refetchLongPolling])
🤔 향후 대응 방안
- 컴포넌트 unmount시 해당 컴포넌트에서 발생한 통신요청들까지 강제 언마운트하도록 대응 가능
💬 회고
- 롱 폴링을 처음 연결하면서, 메모리 누수에 대해서 고려하지 못했다.