1. 즉시 제거 가능: dead 63파일(5,579) + 고아 라우트 9파일(887) = 6,466 LOC (6.3%)
2. 구조 분리: admin 25,091 LOC → 별도 모듈/앱 분리(사용자 번들 경량화)
3. 중복 통합(부채 섹션): SSE 훅 2벌(112×2)·차트 컴포넌트 중복(common/chart vs common/charts)·미사용 서비스 5종 등
4. B 재작성 실측 참고치: B(web-app) 현재 90파일/8,747 LOC 로 A 코어 사용자 플로(피드·상세·빌더 골격·라이브·지갑 등)를 커버 — 동일 컨벤션으로 전 기능 재작성 시 사용자 영역 기준 대폭 감소(현재 커버 범위에서 ~1/8 수준, 전 기능 확장 시에도 A 대비 상당 감소) 전망. 단 미커버 기능(관리자 허브 풀·리포트·고급 빌더) 확장분 감안해 최종 수치는 기능 완주 후 산정.
| 항목 | file | 역할 | 호출처 | A→B |
| app/page.jsx | 6줄 redirect(routes.home='/explore') | 홈=탐색 | - | B 동일 구현 ✅ |
| app/(pages)/explore/page.jsx | SSR fetch(today/surveys·today/tags, pageUnit12) | 탐색 서버 진입 | - | B (main)/explore ✅ |
| components/pages/explore/Explore.jsx | 배너+TagList+PollList 조립 | page | B 재현 ✅ |
| components/common/poll-list/PollList.jsx | 카드 그리드+더보기(pageIndex append) | Explore·Daily·Feedback | B PollList ✅ |
| components/common/poll-list/TagList.jsx | #Today's/태그칩/검색어 헤딩('\"q\" 검색 결과') | Explore | B explore 인라인 ✅ |
| components/common/card/PollCard.jsx + CardInfo/CardChannelInfo | 카드(평균색 파스텔·상태분기 Vote버튼) | PollList | B SurveyCard(dev2) — 진행중 Vote버튼 갭(스펙 세션 확정) |
| components/modals/DetailSideModal.jsx | 카드 클릭 사이드패널(ChannelInfo 포함) | PollCard | B DetailSideModal ✅(채널행 #138) |
| services/common.js getSurveyDetailInfo 등 | 상세/공통 API | 다수 | B core-api 상세 EP |
| 항목 | file | 역할 | A→B |
| (pages)/poll/… → components/pages/poll/Poll.jsx | 2단 레이아웃(좌 PollDefaultInfo+ShareButton+ChannelInfo / 우 PollDetailTab+InfoWallet) | B poll page ✅(#111·#114·#135) |
| detail/tab/PollDetailTab.jsx | 탭(선택탭만 아이콘·종료=result 기본·monitoring=팝업) | B DetailTabs ✅(#149·#157) |
| tab-content/question/QuestionsDetail·QuestionList | 질문 렌더(titleList 전체 타입별·firstUrl 출처) | B QuestionList ✅(#159) |
| tab-content/result/ResultDetail·ResultsReport·SubjectiveAnswers + common/chart/Chart.jsx | 결과(chartType 01~05·데이터표·연령/성별 drill·Excel) | B ResultsChart(#155) — chartType EP·연령성별 EP·Excel 갭 |
| tab-content/participants/ParticipantsDetail + user/UserPublicKey + modals/VoterResultModal | 참여자 테이블+탐색기 링크+응답모달 | B #149/#153/#160 ✅(resultOf EP 갭) |
| tab-content/credit/CreditDetail | 조사개요+JSON+분석리포트(오너) | B CreditTab(부분) — result/json EP·리포트 갭 |
| realtime-monitor/* (index·Header·PeriodInfo·Metrics·Chart, 20파일) | 모니터링 풀 대시보드(chart.js Line+Filler·60슬롯·남은시간 카운트다운) | B MonitoringPopup(#154/#157) — SSE EP 갭 |
| share/SharePollCard·SocialShare·SharePopupEnhanced | live/[uid] 공유 상세(플립 카운트다운·평균색·전화입력) | B live/[uid]+SharePollCard(#146) — 알림톡 EP 갭 |
| 파일 | LOC |
| components/common/chart/TokenChart.jsx | 439 |
| components/pages/channel/manager/blockchain/RewardStatus.jsx | 434 |
| components/wallet/lib/avalanche-rpc.ts | 401 |
| components/pages/channel/manager/blockchain/ParticipantBlockchainStatus.jsx | 398 |
| components/pages/my-page/TokenCirculation.jsx | 198 |
| components/share/SurveyCard.jsx | 192 |
| components/pages/channel/voter/TimeSetupSection.jsx | 186 |
| components/share/QRCodeModal.jsx | 171 |
| components/modals/FollowersSideModal.jsx | 168 |
| components/pages/channel/voter/ScheduleSection.jsx | 134 |
| components/common/charts/BarChart.jsx | 125 |
| components/pages/channel/manager/followers/Followers.jsx | 125 |
| components/builder/poll/user-distribution/DeployListSection.jsx | 123 |
| hooks/admin/useRealtimeUsers.js | 123 |
| components/realtime-monitor/components/ActivityFeed.jsx | 122 |
| app/(pages)/footer/terms-privacy/components/SearchHighlight.jsx | 115 |
| hooks/admin/useDeploymentSSE.js | 112 |
| hooks/useAdminDeploymentSSE.js | 112 |
| components/share/LiveStats.jsx | 108 |
| components/builder/poll/user-distribution/Distribution.jsx | 101 |
| components/wallet/ui/toast.jsx | 100 |
| components/pages/channel/voter/PhoneBookSection.jsx | 88 |
| components/share/PhoneInput.jsx | 84 |
| services/adminAuditService.js | 79 |
| services/metrixService.js | 73 |
| components/pages/channel/voter/SelectPhoneBook.jsx | 62 |
| services/channel.js | 62 |
| services/adminSettingsService.js | 60 |
| components/builder/poll/overview/Organizers.jsx | 56 |
| components/pages/channel/voter/DatePickerSection.jsx | 55 |
| components/wallet/wallets/quick-actions.jsx | 55 |
| components/builder/poll/overview/SelectBoxOptions.jsx | 54 |
| components/common/detail/tab-content/report/IFrameReport.jsx | 54 |
| constants/table.js | 54 |
| utlis/mobileMenuToggle.js | 53 |
| components/builder/poll/user-distribution/UserDistributionShare.jsx | 51 |
| components/common/detail/Table.jsx | 49 |
| components/pages/channel/voter/TimeSettingSection.jsx | 47 |
| hooks/usePayUsers.js | 45 |
| hooks/useSelectFocus.jsx | 40 |
| components/builder/poll/user-distribution/InputAddVoter.jsx | 37 |
| components/wallet/ui/toaster.jsx | 32 |
| components/modals/ChartModal.jsx | 29 |
| hooks/useBanner.jsx | 29 |
| components/builder/poll/user-distribution/ButtonsEditPhoneBook.jsx | 27 |
| components/common/layout/header/component/DarkModeToggle.jsx | 27 |
| components/pages/channel/manager/analysis/Analysis.jsx | 27 |
| services/banner.js | 26 |
| hooks/usePunkToken.js | 26 |
| components/common/Logo.jsx | 25 |
| hooks/useFooterInfo.js | 25 |
| hooks/useTokenHolderInfo.jsx | 24 |
| components/pages/channel/voter/SelectBox.jsx | 23 |
| components/wallet/hooks/use-mobile.jsx | 21 |
| components/builder/poll/user-distribution/TabButtonSection.jsx | 20 |
| components/pages/channel/voter/GuideTimeSetting.jsx | 17 |
| components/pages/mWallet/MWalletLayoutWrapper.jsx | 15 |
| components/share/PollCardWrapper.jsx | 12 |
| components/wallet/lib/utils.ts | 7 |
| states/useSurveyNoStore.js | 7 |
| states/slice/surveyNoSlice.js | 6 |
| utlis/requestId.js | 6 |
| components/common/charts/index.js | 3 |
(합계 63파일 5,579 LOC. 개별 검증 표본: TokenChart·avalanche-rpc·QRCodeModal·FollowersSideModal·LiveStats·PhoneInput(SharePollCard 주석에만 언급)·RewardStatus/ParticipantBlockchainStatus(블록체인 탭 미사용)·ActivityFeed(RealtimeMonitor 조립에서 제외됨) — import 0 확인)
| 항목 | file | 문제 | B 개선 |
| SSE 훅 중복 2벌 | hooks/useAdminDeploymentSSE.js vs hooks/admin/useDeploymentSSE.js | 112줄 동일 계열 중복(둘 다 dead이기도) | 제거 |
| 차트 디렉토리 중복 | common/chart/ vs common/charts/ | Chart.jsx(live)·BarChart(dead)·TokenChart(dead) 혼재 | 단일화 |
| 질문 타이틀 렌더 | QuestionList.jsx | firstUrl/타입별 렌더 로직이 결과탭(ResultDetail)과 중복 구현 | 공용 컴포넌트화(B QuestionList 단일) |
| IpfsModal Pinata 링크 | modals/IpfsModal.jsx:59 | 하드코딩 샘플 CID(placeholder 버그) | B: 실제 CID(#135 반영) |
| useElapsedTimer | realtime-monitor/hooks | 이름은 elapsed, 실제는 남은시간 카운트다운(주석으로 자인) | B: 의미명확한 네이밍(#157 반영) |
| 미사용 서비스 | services/adminAuditService·metrixService·channel·adminSettingsService | dead(참조 0) | 제거 |
| 지갑 개인키 클라 전송 | wallet create-wallet-modal:196 | 보안 결함(평문 POST) — D-028 P0 | B custodial(#151, 평문 전송 제거) |