유형: 계획 (V3 리팩토링 마스터 — 역엔지니어링·리스트럭처링·측정모델)
최종 업데이트: 2026-07-07 (manager 초안 · 리팩토링 진행에 따라 지속 업데이트)
웹뷰: https://chat.punkpoll.com/doc/v3

V3 리팩토링 마스터플랜

0. 왜 V3인가 (V2 교훈 → 처음부터 온전히)

V2는 리팩토링에 많은 시간을 썼으나 온전한 결과를 내지 못함. 근본 실패 클래스(팀 전원 교훈 수렴):

V3 원칙: 인벤토리 우선 → A file:line 근거 → 5게이트 이진 완료 → 골든 픽셀 대조 → 실환경 통합 스모크 → run-of-record 단일 원장.


1. 운영 전체 모듈 인벤토리 (감사 대상)

#모듈역할스택도메인 오너(V3)
진입·메신저
1kakaoChatBotNodeJs (4채널 복제)카카오 진입·설문발송·참여Node(배정)
2punkpollBotAvax / telegramBot텔레그램 진입Node(배정)
3bizchat-reward-api비즈챗 리워드Node(배정)
4clawdbot-kakaotalk보조 챗봇Node(배정)
코어 API·데이터
5punkpoll_api설문/채널/유저 CRUD·참여수집Spring Boot(Java)(배정)
6punkpoll-auth-gateway인증(카카오/텔레그램 OAuth·JWT·nullifier)NestJS(배정)
7punkpoll-ipfs (ipfs-pin-server)참여내용 저장(Pinata·BullMQ)Node(배정)
8punkpoll-common-data-api공통 데이터Node(배정)
온체인
9txSender배포·참여·리워드·콜백 데몬Nodereviewer/backend4
10punkpollAvaxBlockChainApi (+Ver2)블록체인 API·txConfirmationWorkerNodebackend4
11PunkpollFungibleTokenAvax토큰 컨트랙트·APINode/Solbackend4
운영·공통·지갑
12punkpollUtil (panelManager)패널 관리Node(배정)
13standalone_wallet웹뷰 지갑Next.jsdev2
프론트
14punkpoll_web사용자 웹Next14(A=.jsx)dev/dev2
15punkpoll_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 반영.


2. 산출물 (V3 준비 문서 4종 + 대시보드)

산출물목적웹뷰 슬러그상태
역엔지니어링 기획문서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 별도카피 주의).


2-A. 데이터 아키텍처 (현재 B ↔ A DB) — 브레인스토밍 ④ 근거

3. 구조 최적화 방향 (모듈 리스트럭처링)

목적: 다른 AI 개발자가 즉시 참고할 수 있는 가벼운 구조. 통폐합/분리 후보(감사로 확정):


4. 기능별 리팩토링 체크리스트 스키마 (완료 판정 원장)

각 기능(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

5. 측정모델 (reviewer 소유 — 이진 완료)

완료 = 이진(binary). 기능은 해당 게이트 전부 통과해야 done. 하나라도 미달=not-done(부분 PASS 금지). 유예는 사전상정+jegwon 승인분만 별도 상태.


6. 롤 배정 및 조정 검토 (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 조정 검토(참고 — 초기 초안):


7. 진행 단계 (대시보드 연동)

Phase P0 준비(현재) → P1 브레인스토밍(문서 리뷰·상호 파악 확인) → P2 기능별 리팩토링 착수(체크리스트 구동) → P3 컷오버.

현황(2026-07-07):

완료 통지 조건(jegwon): 전체 모듈 검수 + 문서화 완료 시 통지 → 브레인스토밍 → 착수.

2-B. DB 경량 마이그레이션 전략 (팀 수렴 2026-07-07 — 브레인스토밍 ④ 산출)

방향(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 병행운영(델타 반영 규칙 필요).

2-B 교정 (jegwon 2026-07-07: 추측 금지·드라이런·내역 필요·통합 파급)

⚠️ 앞선 '스냅샷 집계만 이관·로그 버림'은 과단순화(manager 자기교정). jegwon 3대 제약:
1. 추측 절대 금지 → 실측+드라이런: 테이블별 실제 용량/행수/참조관계를 코드가 아닌 실 DB로 조사. 마이그레이션 스크립트를 샌드박스 B DB에 실행(드라이런)해 용량·값정합·소요시간을 실측한 뒤에만 가능성 판단. 프로덕션 반영 전 필수.
2. 내역(history) 데이터는 이관 필수: 참여내역·토큰 리워드 지급내역 등 '이력을 보여주는 페이지'는 개별 행 데이터가 필요 → 집계 스냅샷으로 대체 불가. 분류 기준 = '로그성인가'가 아니라 'UI가 그 개별 내역을 보여주는가'. UI 페이지별 필요 데이터 역매핑 선행.
3. 챗봇↔플랫폼 유저 통합 = 대규모 작업: A는 챗봇 유저정보(kakao_user_info 등)와 플랫폼 유저정보(users)가 분리. 통합 시 유저 식별자 병합·전 모듈 영향 → 챗봇 리팩토링뿐 아니라 모든 모듈에 파급. 별도 대형 워크스트림으로 산정 필요(과소평가 금지).

엄밀 접근 3단계(산출물 = DB 마이그레이션 타당성 문서 + 드라이런 결과):

2-B 확정 (jegwon: (가) A→B 완전전환·스냅샷 시점 고정 · 팀 함의 정리 2026-07-07)

전환 방식 확정 = (가) 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 최소컬럼 | 내역페이지↔필요행 | 온체인 상태(컨트랙트 동결/결과 스냅샷/토큰잔액).