유형: 설계 (A 서비스 라이브러리 문서 — 플랫폼 프론트엔드 live-code 지도)
최종 업데이트: 2026-07-07 23:15 KST (dev — 정적 도달성 실측 v1 · dev2 도메인 카탈로그 채움 예정)
방법: 진입점(app 라우트) → import 그래프 실추적(스크립트, @/alias·재수출·dynamic 해석) → 도달=live/미도달=dead → dead 후보 전건 소스 grep 개별 재확인. Explore 요약 불사용.

A 플랫폼 프론트엔드 (punkpoll_web) — live-code 라이브러리

정량 (2026-07-07 실측)

지표비고
전체 소스640파일 / 102,654 LOCapp·components·services·hooks·states·utlis·constants·lib (node_modules 제외)
진입점120page/layout/route 등 (사용자 라우트 74 + admin 21 + API/시스템)
live (도달)577파일 / 97,075 LOC
dead (파일레벨)63파일 / 5,579 LOC (5.4%)아래 카탈로그 — 전건 grep 재확인 완료
고아 라우트 서브트리9파일 / 887 LOC도달은 되나 앱 내 진입링크 0: explore-2·daily·search·dev/alimtalk-progress (live에 포함돼 있으므로 dead와 별도 — 제거 가능분)
admin 전용 서브트리54파일 / 25,091 LOC사용자 서비스와 분리 가능한 관리자 영역 (live)
사용자 서비스 live (admin 제외)≈71,984 LOC97,075 − 25,091

함수레벨 dead는 미포함(파일레벨 우선) — 파일 내부 미사용 함수·중복 로직은 부채 섹션과 B 리팩토링에서 처리.

리팩토링 방식·예상 감소율

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 대비 상당 감소) 전망. 단 미커버 기능(관리자 허브 풀·리포트·고급 빌더) 확장분 감안해 최종 수치는 기능 완주 후 산정.

진입점 카탈로그 (사용자 라우트 — parity-map 연결)

live 함수 카탈로그 — dev 도메인 (진입점→체인)

피드/탐색 (//explore)

항목file역할호출처A→B
app/page.jsx6줄 redirect(routes.home='/explore')홈=탐색-B 동일 구현 ✅
app/(pages)/explore/page.jsxSSR fetch(today/surveys·today/tags, pageUnit12)탐색 서버 진입-B (main)/explore ✅
components/pages/explore/Explore.jsx배너+TagList+PollList 조립pageB 재현 ✅
components/common/poll-list/PollList.jsx카드 그리드+더보기(pageIndex append)Explore·Daily·FeedbackB PollList ✅
components/common/poll-list/TagList.jsx#Today's/태그칩/검색어 헤딩('\"q\" 검색 결과')ExploreB explore 인라인 ✅
components/common/card/PollCard.jsx + CardInfo/CardChannelInfo카드(평균색 파스텔·상태분기 Vote버튼)PollListB SurveyCard(dev2) — 진행중 Vote버튼 갭(스펙 세션 확정)
components/modals/DetailSideModal.jsx카드 클릭 사이드패널(ChannelInfo 포함)PollCardB DetailSideModal ✅(채널행 #138)
services/common.js getSurveyDetailInfo 등상세/공통 API다수B core-api 상세 EP

헤더/검색

항목file역할A→B
header/Header.jsx로고(채널 컨텍스트)+검색+Nav+TagLayerB Header ✅(채널 컨텍스트 로고 갭 — 스펙 세션)
header/TagLayer.jsx검색모달(Enter→/explore?q=·태그→?tag=)B #131 ✅
header/component/Nav.jsx·MobileNav·PanelMenuModal네비/모바일/스탯패널B ✅(#77 스탯패널)

설문상세 (/poll/[id])

항목file역할A→B
(pages)/poll/… → components/pages/poll/Poll.jsx2단 레이아웃(좌 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·SharePopupEnhancedlive/[uid] 공유 상세(플립 카운트다운·평균색·전화입력)B live/[uid]+SharePollCard(#146) — 알림톡 EP 갭

빌더 (/builder·/builder/poll)

항목file역할A→B
components/builder/poll/* (overview·questions·deploy-time·rewards·user-distribution·voter)5스텝 아코디언 빌더(리워드 useRewards fee공식·유권자등록)B BuilderForm(#117) — B2/B3 페이즈드

정적/랜딩 (vote·live·opinion-poll·feedback)

(dev2 몫 — 채움 예정) 채널 브라우즈/상세/관리자·마이페이지·지갑(mWallet)·토큰·구매 체인

dead code (미도달 — 전건 grep 재확인, 참조=자기 파일뿐)

파일LOC
components/common/chart/TokenChart.jsx439
components/pages/channel/manager/blockchain/RewardStatus.jsx434
components/wallet/lib/avalanche-rpc.ts401
components/pages/channel/manager/blockchain/ParticipantBlockchainStatus.jsx398
components/pages/my-page/TokenCirculation.jsx198
components/share/SurveyCard.jsx192
components/pages/channel/voter/TimeSetupSection.jsx186
components/share/QRCodeModal.jsx171
components/modals/FollowersSideModal.jsx168
components/pages/channel/voter/ScheduleSection.jsx134
components/common/charts/BarChart.jsx125
components/pages/channel/manager/followers/Followers.jsx125
components/builder/poll/user-distribution/DeployListSection.jsx123
hooks/admin/useRealtimeUsers.js123
components/realtime-monitor/components/ActivityFeed.jsx122
app/(pages)/footer/terms-privacy/components/SearchHighlight.jsx115
hooks/admin/useDeploymentSSE.js112
hooks/useAdminDeploymentSSE.js112
components/share/LiveStats.jsx108
components/builder/poll/user-distribution/Distribution.jsx101
components/wallet/ui/toast.jsx100
components/pages/channel/voter/PhoneBookSection.jsx88
components/share/PhoneInput.jsx84
services/adminAuditService.js79
services/metrixService.js73
components/pages/channel/voter/SelectPhoneBook.jsx62
services/channel.js62
services/adminSettingsService.js60
components/builder/poll/overview/Organizers.jsx56
components/pages/channel/voter/DatePickerSection.jsx55
components/wallet/wallets/quick-actions.jsx55
components/builder/poll/overview/SelectBoxOptions.jsx54
components/common/detail/tab-content/report/IFrameReport.jsx54
constants/table.js54
utlis/mobileMenuToggle.js53
components/builder/poll/user-distribution/UserDistributionShare.jsx51
components/common/detail/Table.jsx49
components/pages/channel/voter/TimeSettingSection.jsx47
hooks/usePayUsers.js45
hooks/useSelectFocus.jsx40
components/builder/poll/user-distribution/InputAddVoter.jsx37
components/wallet/ui/toaster.jsx32
components/modals/ChartModal.jsx29
hooks/useBanner.jsx29
components/builder/poll/user-distribution/ButtonsEditPhoneBook.jsx27
components/common/layout/header/component/DarkModeToggle.jsx27
components/pages/channel/manager/analysis/Analysis.jsx27
services/banner.js26
hooks/usePunkToken.js26
components/common/Logo.jsx25
hooks/useFooterInfo.js25
hooks/useTokenHolderInfo.jsx24
components/pages/channel/voter/SelectBox.jsx23
components/wallet/hooks/use-mobile.jsx21
components/builder/poll/user-distribution/TabButtonSection.jsx20
components/pages/channel/voter/GuideTimeSetting.jsx17
components/pages/mWallet/MWalletLayoutWrapper.jsx15
components/share/PollCardWrapper.jsx12
components/wallet/lib/utils.ts7
states/useSurveyNoStore.js7
states/slice/surveyNoSlice.js6
utlis/requestId.js6
components/common/charts/index.js3

(합계 63파일 5,579 LOC. 개별 검증 표본: TokenChart·avalanche-rpc·QRCodeModal·FollowersSideModal·LiveStats·PhoneInput(SharePollCard 주석에만 언급)·RewardStatus/ParticipantBlockchainStatus(블록체인 탭 미사용)·ActivityFeed(RealtimeMonitor 조립에서 제외됨) — import 0 확인)

고아 라우트 (도달 가능하나 진입링크 0 — 제거 가능)

라우트파일LOC
/explore-2page+Explore243+35
/dailypage+Daily+PoliticalChart24+α
/searchpage+layout (footer 검색기 — footer 트랙 종속)240+6
/dev/alimtalk-progresspage+AlimtalkProgressSimulator내부용
합계9파일887

기술부채 (live지만 문제)

항목file문제B 개선
SSE 훅 중복 2벌hooks/useAdminDeploymentSSE.js vs hooks/admin/useDeploymentSSE.js112줄 동일 계열 중복(둘 다 dead이기도)제거
차트 디렉토리 중복common/chart/ vs common/charts/Chart.jsx(live)·BarChart(dead)·TokenChart(dead) 혼재단일화
질문 타이틀 렌더QuestionList.jsxfirstUrl/타입별 렌더 로직이 결과탭(ResultDetail)과 중복 구현공용 컴포넌트화(B QuestionList 단일)
IpfsModal Pinata 링크modals/IpfsModal.jsx:59하드코딩 샘플 CID(placeholder 버그)B: 실제 CID(#135 반영)
useElapsedTimerrealtime-monitor/hooks이름은 elapsed, 실제는 남은시간 카운트다운(주석으로 자인)B: 의미명확한 네이밍(#157 반영)
미사용 서비스services/adminAuditService·metrixService·channel·adminSettingsServicedead(참조 0)제거
지갑 개인키 클라 전송wallet create-wallet-modal:196보안 결함(평문 POST) — D-028 P0B custodial(#151, 평문 전송 제거)

남은 작업