유형: 계획 (V3 리팩토링 마스터 — 역엔지니어링·리스트럭처링·측정모델)
최종 업데이트: 2026-07-07 (manager 초안 · 리팩토링 진행에 따라 지속 업데이트)
웹뷰: https://chat.punkpoll.com/doc/v3
V2는 리팩토링에 많은 시간을 썼으나 온전한 결과를 내지 못함. 근본 실패 클래스(팀 전원 교훈 수렴):
V3 원칙: 인벤토리 우선 → A file:line 근거 → 5게이트 이진 완료 → 골든 픽셀 대조 → 실환경 통합 스모크 → run-of-record 단일 원장.
| # | 모듈 | 역할 | 스택 | 도메인 오너(V3) |
|---|---|---|---|---|
| 진입·메신저 | ||||
| 1 | kakaoChatBotNodeJs (4채널 복제) | 카카오 진입·설문발송·참여 | Node | (배정) |
| 2 | punkpollBotAvax / telegramBot | 텔레그램 진입 | Node | (배정) |
| 3 | bizchat-reward-api | 비즈챗 리워드 | Node | (배정) |
| 4 | clawdbot-kakaotalk | 보조 챗봇 | Node | (배정) |
| 코어 API·데이터 | ||||
| 5 | punkpoll_api | 설문/채널/유저 CRUD·참여수집 | Spring Boot(Java) | (배정) |
| 6 | punkpoll-auth-gateway | 인증(카카오/텔레그램 OAuth·JWT·nullifier) | NestJS | (배정) |
| 7 | punkpoll-ipfs (ipfs-pin-server) | 참여내용 저장(Pinata·BullMQ) | Node | (배정) |
| 8 | punkpoll-common-data-api | 공통 데이터 | Node | (배정) |
| 온체인 | ||||
| 9 | txSender | 배포·참여·리워드·콜백 데몬 | Node | reviewer/backend4 |
| 10 | punkpollAvaxBlockChainApi (+Ver2) | 블록체인 API·txConfirmationWorker | Node | backend4 |
| 11 | PunkpollFungibleTokenAvax | 토큰 컨트랙트·API | Node/Sol | backend4 |
| 운영·공통·지갑 | ||||
| 12 | punkpollUtil (panelManager) | 패널 관리 | Node | (배정) |
| 13 | standalone_wallet | 웹뷰 지갑 | Next.js | dev2 |
| 프론트 | ||||
| 14 | punkpoll_web | 사용자 웹 | Next14(A=.jsx) | dev/dev2 |
| 15 | punkpoll_admin | 관리자 콘솔 | — | (배정) |
앵커: 기존 문서docs/claude-ref/pipeline.md·service-quickref.md·specs/ 20개·서비스별 CLAUDE.md 6종 = 감사 초기지도(단 문서 stale 가능 → G2/G5는 실코드·픽셀로 확정).
파이프라인 흐름: 챗봇(진입) → auth-gateway → punkpoll_api(설문배포요청·참여수집) → txSender/blockchainApi(온체인 배포·참여·리워드) + ipfs(내용) → 콜백 → web/admin 반영.
| 산출물 | 목적 | 웹뷰 슬러그 | 상태 |
|---|---|---|---|
| 역엔지니어링 기획문서 | www.punkpoll.com + 백엔드 + 전체 파이프라인을 A 실측으로 역설계 | /doc/reverse-eng | 🔧 작성중 |
| 리스트럭처링 plan (이 문서) | 모듈 통폐합/분리·구조 최적화 방향 | /doc/v3 | 🔧 초안 |
| 기능별 리팩토링 체크리스트 | 기능마다 A출처모듈·G1~G6·done (완료 체크리스트) | /doc/checklist | ⏳ 스키마 확정 |
| 측정모델 | 이진 완료 게이트 G1~G6 정의·정량지표 | /doc/measure | ⏳ reviewer 소유 |
| 리팩토링 대시보드 | 진행단계·진행률 시각화 (우측 패널) | (챗 우측패널) | ⏳ 구현 예정 |
| 코드 감사(A프론트+v2백엔드) | 완료분 | /doc/audit | ✅ |
| 배선 리스트(A정합 클릭맵) | 완료분 | /doc/parity-map | ✅ |
모든 문서는 웹 확인 + 리팩토링 진행에 따라 자동 업데이트(/doc 배포경로 재사용, remote 별도카피 주의).
목적: 다른 AI 개발자가 즉시 참고할 수 있는 가벼운 구조. 통폐합/분리 후보(감사로 확정):
runChainJob 코어(nonce+mutex+M4+콜백). backend4 감사 확인.각 기능(row) = 하나의 리팩토링 단위. 나중에 완료 체크리스트로 사용.
| 열 | 의미 |
|---|---|
| 기능 | 예: "설문 사이드패널 좋아요" |
| A 출처 모듈 | A에서 어떤 모듈을 통폐합/최적화했는지 (provenance, reviewer 소유) |
| B 구현 위치 | v2 모듈/파일 |
| G1 구조 | 라우트·컴포넌트 존재 |
| G2 A대조 | A file:line 근거 명시 |
| G3 데이터배선 | EP·필드 실연결 |
| G4 실동작 | 클릭→결과 실행 |
| G5 실화면 | A 골든 픽셀 대조(여백·폰트·px·색) — 협상불가 |
| G6 온체인 | 실 Fuji 트레이스 항등식(온체인 기능만) |
| done | 이진 — G1~G6(해당분) 전부 통과해야 done |
완료 = 이진(binary). 기능은 해당 게이트 전부 통과해야 done. 하나라도 미달=not-done(부분 PASS 금지). 유예는 사전상정+jegwon 승인분만 별도 상태.
현 롤: manager(총괄·plan·문서·PR게이트) · reviewer(측정모델·A출처·G5/G6 검증) · backend1(코어API 헥사고날) · backend2(결제) · backend4(온체인·토큰·지갑) · dev(web 결선) · dev2(web 신규컴포넌트·타입세이프) · submanager(조율·원장·인벤토리).
✅ 롤 분담 jegwon 승인(2026-07-07): verifier=reviewer(provenance·G2/G3/G4·G5판정[캡처=dev2]·G6 온체인 독립트레이스) / producer=dev·dev2(프론트)·backend1(코어API·메신저·인증)·backend4(온체인·토큰·지갑). submanager=run-of-record 원장. manager=총괄·문서·PR게이트.
V3 조정 검토(참고 — 초기 초안):
Phase P0 준비(현재) → P1 브레인스토밍(문서 리뷰·상호 파악 확인) → P2 기능별 리팩토링 착수(체크리스트 구동) → P3 컷오버.
현황(2026-07-07):
완료 통지 조건(jegwon): 전체 모듈 검수 + 문서화 완료 시 통지 → 브레인스토밍 → 착수.
방향(jegwon): A 분산·무거운 DB → B 단일 통합·경량 DB. 로그 버리고 필수만 선별 이관.
A 무거움 주범 = 로그성 테이블(backend1·backend4 전수): survey/token/distribution_bclogs·processed_events·admin_audit·channel_daily/hourly_participation · (온체인) tx_pending/confirmed/failed·callback_failures(50재시도)·zkapp_tx_hash_log·zkapp_prove_job_pool. B는 개별 로그행이 아니라 대부분 '집계 결과값'만 읽음.
3분류 이관 전략(backend1):
1. 통째 이관(마스터·기준·소형·값정합 필수): users 참조필드(nullifier·profileImg)·survey_basic_info·channel_basic_info·tags·commcode_details·channel_admins.
2. 스냅샷 압축 이관(무거운 로그→결과만): bclogs·participation 로그는 개별 TX/행 버리고 설문별·채널별 집계(참여수·리워드합·통계·홀더수)만 이관. 용량 대부분 감소.
3. 미이관(B 불필요): 콜백 재처리 로그·admin_audit 원시행·온체인 TX 로그(B는 chain-worker BullMQ+processed_events 자체 오케스트레이션).
분담(producer/verifier): backend1(producer)=마이그레이션·스냅샷 쿼리 authoring + 3분류표(테이블별 이관/스냅샷/제외 + B 최소 컬럼) + 각 스냅샷이 재현하는 A 계산식 file:line 명시. reviewer(verifier)=각 집계 스냅샷값을 A 원본쿼리 직접 실행→마이그레이션 값 대조(G2+G3, diff=0). = 온체인 G6와 같은 독립검증 패턴의 DB 버전.
⏳ jegwon 결정: (a)3분류표 착수 승인 (b)컷오버 시점 = A→B 완전전환(스냅샷 시점 고정) vs 병행운영(델타 반영 규칙 필요).
⚠️ 앞선 '스냅샷 집계만 이관·로그 버림'은 과단순화(manager 자기교정). jegwon 3대 제약:
1. 추측 절대 금지 → 실측+드라이런: 테이블별 실제 용량/행수/참조관계를 코드가 아닌 실 DB로 조사. 마이그레이션 스크립트를 샌드박스 B DB에 실행(드라이런)해 용량·값정합·소요시간을 실측한 뒤에만 가능성 판단. 프로덕션 반영 전 필수.
2. 내역(history) 데이터는 이관 필수: 참여내역·토큰 리워드 지급내역 등 '이력을 보여주는 페이지'는 개별 행 데이터가 필요 → 집계 스냅샷으로 대체 불가. 분류 기준 = '로그성인가'가 아니라 'UI가 그 개별 내역을 보여주는가'. UI 페이지별 필요 데이터 역매핑 선행.
3. 챗봇↔플랫폼 유저 통합 = 대규모 작업: A는 챗봇 유저정보(kakao_user_info 등)와 플랫폼 유저정보(users)가 분리. 통합 시 유저 식별자 병합·전 모듈 영향 → 챗봇 리팩토링뿐 아니라 모든 모듈에 파급. 별도 대형 워크스트림으로 산정 필요(과소평가 금지).
엄밀 접근 3단계(산출물 = DB 마이그레이션 타당성 문서 + 드라이런 결과):
전환 방식 확정 = (가) A→B 완전전환(스냅샷 시점 고정). 병행운영 아님.
완전전환의 단순화(backend1):
3분류 재정의(reviewer 정정 — '로그성=집계만'은 위험):
1. 운영 로그(버림): 콜백 재처리·pending/failed 큐 로그·admin_audit 원시. B 미표시.
2. 거래 내역(행 보존·내역페이지 원천): 참여내역·리워드 지급내역·토큰 전송내역. 집계 아니라 행 단위 이관 — 마이페이지 TokenHistory(행+txHash→탐색기)·참여자탭 등 히스토리 페이지의 데이터 원천. 히스토리 페이지별 '필요 행 데이터' 매핑 선행(parity-map 클릭맵 근거).
3. 마스터/통계(통째 or 집계): users·survey·channel·tags·survey_stats.
온체인 함의(backend4):
유저 DB 통합(reviewer): 챗봇 유저정보+플랫폼 유저정보 분리→통합은 resolveAUser·nullifier·전 유저참조 재배선 = 전 모듈 영향. 측정모델에 독립 기능셋(G3 데이터배선 게이트)으로 별도 추적(과소평가 금지).
산출물 = 3분류표(공동: backend1 표구조·오프체인 분류 + backend4 온체인 상태 열 + reviewer 내역손실0·집계정합 A대조 검증) + 드라이런 결과. 컬럼: 테이블 | 분류(이관/스냅샷/제외) | B 최소컬럼 | 내역페이지↔필요행 | 온체인 상태(컨트랙트 동결/결과 스냅샷/토큰잔액).