5.2 KiB
5.2 KiB
메모리 누수 분석 및 개선 리포트
🔴 심각한 메모리 누수 (즉시 수정 필요)
1. app.vue - watch가 정리되지 않음
- 위치:
app/app.vue:131-146 - 문제:
onMounted내부에서 생성된watch가onBeforeUnmount에서 정리되지 않음 - 영향: 컴포넌트가 언마운트되어도 watch가 계속 실행되어 메모리 누수 발생
2. useSplideArrow.ts - 이벤트 리스너가 정리되지 않음
- 위치:
layers/composables/useSplideArrow.ts:55, 59 - 문제:
addEventListener로 추가된 이벤트 리스너가 제거되지 않음 - 영향: 컴포넌트가 언마운트되어도 이벤트 리스너가 남아있어 메모리 누수 발생
3. useModalStore.ts - setTimeout이 정리되지 않음
- 위치:
layers/stores/useModalStore.ts:125 - 문제:
setTimeout이 사용되지만 컴포넌트 언마운트 시 정리되지 않음 - 영향: 컴포넌트가 언마운트된 후에도 타이머가 실행되어 메모리 누수 발생
4. useLoadingStore.ts - setTimeout이 정리되지 않음
- 위치:
layers/stores/useLoadingStore.ts:38 - 문제:
setTimeout이 사용되지만 정리되지 않음 - 영향: 스토어가 초기화되어도 타이머가 실행되어 메모리 누수 발생
5. Video.vue - setTimeout이 정리되지 않음
- 위치:
layers/components/atoms/Video.vue:34 - 문제:
setTimeout이 사용되지만 컴포넌트 언마운트 시 정리되지 않음 - 영향: 컴포넌트가 언마운트된 후에도 타이머가 실행되어 메모리 누수 발생
6. GrGallery01/index.vue - setTimeout이 정리되지 않음
- 위치:
layers/templates/GrGallery01/index.vue:93 - 문제:
setTimeout이 사용되지만 컴포넌트 언마운트 시 정리되지 않음 - 영향: 컴포넌트가 언마운트된 후에도 타이머가 실행되어 메모리 누수 발생
7. useGameStart.ts - setTimeout이 정리되지 않음
- 위치:
layers/composables/useGameStart.ts:70 - 문제:
setTimeout이 사용되지만 정리되지 않음 - 영향: 컴포저블이 사용되지 않아도 타이머가 실행되어 메모리 누수 발생
8. Thumbnail.vue - 이벤트 리스너가 정리되지 않음
- 위치:
layers/components/blocks/slide/Thumbnail.vue:114 - 문제:
addArrowClickListeners로 추가된 이벤트 리스너가 제거되지 않음 - 영향: 컴포넌트가 언마운트되어도 이벤트 리스너가 남아있어 메모리 누수 발생
🟡 중간 수준 이슈 (개선 권장)
9. amplitude.client.ts - 이벤트 리스너가 정리되지 않음
- 위치:
layers/plugins/amplitude.client.ts:34 - 문제:
window.addEventListener('pagehide')가 추가되지만 제거되지 않음 - 영향: 플러그인은 앱 전체 생명주기 동안 유지되므로 큰 문제는 아니지만, 명시적으로 정리하는 것이 좋음
10. app.vue - removeEventListener 사용 오류
- 위치:
app/app.vue:150 - 문제:
useEventListener로 추가한 이벤트 리스너를removeEventListener로 제거하려고 함 - 영향:
useEventListener는 자동으로 정리되므로 불필요한 코드 (메모리 누수는 아님)
📋 수정 우선순위
- ✅ 즉시 수정 (메모리 누수): #1, #2, #3, #4, #5, #6, #7, #8 - 완료
- 단기 개선 (안정성): #9, #10 - 추후 검토
✅ 수정 완료 내역
수정된 파일 목록
app/app.vue- watch 정리 추가, removeEventListener 제거layers/composables/useSplideArrow.ts- 이벤트 리스너 제거 함수 반환하도록 수정layers/components/blocks/slide/Thumbnail.vue- 이벤트 리스너 정리 추가layers/stores/useModalStore.ts- setTimeout 정리 추가layers/stores/useLoadingStore.ts- setTimeout 정리 추가layers/components/atoms/Video.vue- setTimeout 정리 추가layers/templates/GrGallery01/index.vue- setTimeout 정리 추가layers/composables/useGameStart.ts- setTimeout 정리 추가
수정 방법 요약
- watch 정리:
watch반환값을 저장하고onBeforeUnmount에서 호출 - setTimeout 정리: 타이머 ID를 저장하고
onBeforeUnmount또는 함수 재호출 시clearTimeout으로 정리 - 이벤트 리스너 정리: 이벤트 리스너 제거 함수를 반환하고
onBeforeUnmount에서 호출
🎯 개선 효과
- 메모리 누수 방지: 컴포넌트 언마운트 시 모든 리소스가 정리되어 메모리 누수 방지
- 성능 향상: 불필요한 타이머 및 이벤트 리스너 제거로 성능 향상
- 안정성 향상: 컴포넌트 생명주기 관리가 명확해져 버그 발생 가능성 감소
- 코드 품질 향상: 리소스 정리 패턴이 일관되어 유지보수성 향상
📝 추가 권장 사항
- 자동 정리 유틸 함수: 공통 패턴을 유틸 함수로 추출하여 재사용성 향상
- 테스트 강화: 컴포넌트 언마운트 시 리소스 정리 테스트 추가
- ESLint 규칙: 메모리 누수 방지를 위한 ESLint 규칙 추가 고려
- 성능 모니터링: 수정 후 메모리 사용량 모니터링