Generated by /office-hours on 2026-03-30 Branch: unknown Repo: nullfull/scratch Status: APPROVED Mode: Builder 프로젝트명 후보: 의원님 같이가요 / 의원님 어디가 / 의원트립
한국의 지방의회(시의회, 도의회, 구의회, 군의회) 의원들이 해외 출장을 다녀오지만, 어디를 갔는지, 얼마를 썼는지, 출장 목적이 정당했는지에 대한 통합된 시각화 도구가 없다. 데이터는 각 지방의회 웹사이트에 파편화되어 있고 공공 API가 없다. 코로나 해제(2023년) 이후 해외 출장이 급증했으며, 행안부가 2019년 환수 조치를 권고했지만 2023년까지 실제 환수는 0건이다. 9대 지방의회 임기(2022.7 ~ 2026.6) 기간의 데이터를 대상으로 한다.
"우리 동네 시의원이 '저출생 벤치마킹'으로 도쿄를 3번 갔다" — 이 한 문장이 SNS에서 스크린샷으로 퍼지는 순간이 이 프로젝트의 핵심이다.
기존 예산 시각화 도구(열린재정, 지방재정365)는 데이터를 제공하지만 감정적으로 공감되지 않는다. 이 프로젝트는 "해외 출장"이라는 가장 직관적이고 분노를 유발하는 데이터 포인트 하나에 집중한다. 지도 위의 애니메이션 아크, 출장 목적의 모호성 폭로, 자동 생성 SNS 카드가 바이럴의 메커니즘이다. 지방의원은 지자체장보다 수가 훨씬 많아 데이터 볼륨이 크고, "우리 동네 의원"이라는 개인적 연결감이 더 강하다.
- 공공 API 없음: 지방의회 웹사이트 게시판 크롤링 + HWP/PDF 파싱 필요
- 첫 버전: 13개 지역 (하남, 평택, 군포, 인천, 부천, 오산, 용인, 양평, 이천, 김포, 여주, 안양, 서울시 동대문구)
- 타겟: 일반 시민 (SNS 바이럴이 핵심 지표)
- 대상 기간: 9대 지방의회 임기 (2022.7 ~ 2026.6)
- 데이터 소스: 지방의회 웹사이트 게시판 (정보공개 청구 불필요)
- 법적 리스크: 공개 게시판 데이터이므로 없음
- 오픈소스/리서치 프로젝트
- 지방의원 해외출장 데이터는 각 지방의회 웹사이트 게시판에서 추출 가능하다.
- 일반 시민은 "우리 동네 시의원이 어디를 몇 번 갔다"는 정보를 SNS에서 공유할 것이다 (감정적 공감 > 데이터 정확도).
- 13개 지역의 데이터로 충분히 임팩트 있는 첫 버전을 만들 수 있다.
- Stagehand/Playwright로 지방의회 웹사이트의 HWP/PDF 보고서를 크롤링하고 LLM으로 파싱하는 것이 기술적으로 가능하다.
Codex(GPT-5.4)의 독립적 분석:
가장 멋진 버전: "while-they-were-away" 책임 엔진. 출장 중 지역구에서 무슨 일이 있었는지(의회 표결, 재난, 예산 삭감) 대조하고, 30/90/180일 후 실제 성과(MOU, 투자, 정책 변화, 없음)를 추적. 지도가 증거가 되는 것이지 장식이 아니다.
핵심 통찰: 이 프로젝트가 원하는 것은 데이터 인프라가 아니라 "visual scandal engine"이다.
50% 도구: Observable Framework (정적, 빠름, 스크롤리텔링에 강함). 나머지 50%: 스크래핑, HWP/PDF 추출, 트립 스키마, 의심 휴리스틱, 한국어 카피, SNS 공유 카드 UX.
주말 빌드: 풀 스크래퍼가 아니라 가장 날카로운 데모. 5명 지자체장, 30-50개 출장 수동 추출, 한국 중심 지도 + 목적지 아크, red-flag 배지, 여권 스타일 타임라인, 자동 SNS 카드 ("OO구청장 2024 해외출장 4회 / 총 3,200만원 / 일본 3회 / 성과보고 0건"). "그 페이지가 사람들이 스크린샷 찍고 싶게 만들면 프로젝트는 진짜다."
CSV/DuckDB로 데이터 관리, Observable Framework로 스크롤리텔링 + 지도 시각화. GitHub Pages/Vercel 배포.
- 노력: S (CC: ~2-3시간) | 위험: Low
- 장점: 초고속 배포, 바이럴 트래픽에 강함, 데이터 중심
- 단점: Observable 생태계 학습 필요, 동적 기능 제한
- 완성도: 7/10
Next.js App Router로 풀스택 웹앱. D3 + MapLibre GL로 지도/차트. Supabase로 DB.
- 노력: M (CC: ~1일) | 위험: Med
- 장점: 10x 버전으로 확장 용이, 동적 기능 자유로움, 커뮤니티 기능 추가 가능
- 단점: 초기 세팅 복잡도 높음, 바이럴 시 서버 비용
- 완성도: 9/10
한 페이지짜리 스크롤리텔링 기사 형식. Svelte/SvelteKit + Scrollama.
- 노력: S (CC: ~3-4시간) | 위험: Low
- 장점: 스토리텔링 최적화, 언론 협업 용이
- 단점: 확장성 제한
- 완성도: 6/10
B) Next.js + D3/MapLibre
Next.js는 정적 생성(SSG)으로 첫 버전을 배포하면 Vercel 무료 티어에서 바이럴 트래픽도 감당 가능하다. 10x 버전에서 DB가 필요해질 때 Supabase를 추가하면 된다.
v1은 정적 데이터(JSON/CSV)로 시작. Approach A(Observable)의 "바이럴에 강함" 장점을 Next.js SSG로 동일하게 얻되, 이후 동적 기능 확장의 길을 열어둔다.
- 프론트엔드: Next.js 15 (App Router, SSG) + TypeScript
- 시각화: D3.js (차트/그래프) + MapLibre GL JS (지도)
- 데이터: 정적 JSON/CSV 파일 (레포에 커밋, 50건 미만)
- 데이터 수집: Stagehand/Playwright + hwp.js(HWP→텍스트 변환) + LLM 구조화 추출 (별도 파이프라인)
- 배포: Vercel (SSG, 무료 티어)
- SNS 공유: OG Image는 빌드 타임에 의원별 사전 생성하여 정적 에셋으로 제공 (Vercel 무료 티어 함수 호출 제한 회피)
- DB: Supabase (PostgreSQL)
- 인증: Supabase Auth (커뮤니티 기능 시)
- 저장소: Supabase Storage (원본 HWP/PDF 아카이브)
interface Trip {
id: string; // 고유 ID
official_name: string; // 의원 이름
official_title: string; // 직함 (시의원, 도의원, 구의원, 군의원)
party: string; // 소속 정당
district: string; // 선거구
council: string; // 소속 의회명 (예: 하남시의회)
council_type: "광역의회" | "기초의회"; // 의회 유형
region: string; // 지자체명
region_population: number; // 지자체 인구수
destination_country: string; // 출장 국가
destination_city: string; // 출장 도시
destination_lat: number; // 목적지 위도 (도시명 → 좌표 룩업 테이블 사용)
destination_lng: number; // 목적지 경도
start_date: string; // 출발일 (YYYY-MM-DD)
end_date: string; // 귀국일 (YYYY-MM-DD)
duration_days: number; // 출장 일수
total_cost_krw: number; // 총 비용 (원)
purpose: string; // 출장 목적
party_size: number; // 출장 인원 (의원 본인 포함)
outcome_report_exists: boolean; // 성과보고서 존재 여부
outcome_report_url?: string; // 성과보고서 링크
source_url: string; // 원본 데이터 출처 URL
}- 다운로드: Stagehand/Playwright로 지방의회 웹사이트에서 HWP/PDF 파일 다운로드
- 변환: HWP →
hwp.js로 텍스트 추출, PDF →pdf-parse로 텍스트 추출 - 구조화: LLM(Claude)에 텍스트를 전달하여 Trip 스키마에 맞게 구조화 추출
- 검증: 파싱 실패 또는 신뢰도 낮은 항목은 수동 검토 큐에 추가
- v1에서는 수동 추출 병행: 13개 지역이지만 수동으로도 가능한 규모
- 좌표 매핑: 주요 출장 도시(도쿄, 타이베이, 삿포로 등)의 좌표를 정적 룩업 테이블로 관리. 미매핑 도시는 국가 중심 좌표로 폴백
참고: Stagehand는 Playwright 위에서 동작하는 AI 기반 브라우저 자동화 도구로, 구조가 일관적이지 않은 지방의회 웹사이트 탐색에 적합하다.
- 메인: 한국 중심 세계지도 + 목적지 애니메이션 아크 + 스토리텔링 섹션
- 의원 상세: 출장 타임라인 (시간순 카드 리스트, 각 카드에 국기+도시+기간+비용+목적), 총 비용 요약, 방문지 랭킹, 소속 정당/선거구 정보, 출처 문서 링크
- 랭킹: 의회별/정당별 비교 (출장 횟수, 비용, 인구 대비, 목적 분류)
- 데이터: CSV/JSON 다운로드 (오픈데이터)
일비는 공무출장여비규정에 따라 정해지므로 평균 초과 여부는 실효성이 낮다. 성과보고서는 규정상 필수 제출이므로 최근 출장 외에는 대부분 존재한다. v1에서는 반복 목적지와 출장 목적의 모호성에 집중한다.
- 반복 목적지: 같은 국가 3회 이상 또는 같은 도시 2회 이상 (임기 내)
- 출장 목적 모호성: "벤치마킹", "우호교류", "선진지 시찰" 등 범용적 목적어 감지
- 장기 출장: 7일 초과
- 성과 보고 미제출: outcome_report_exists === false (최근 3개월 내 출장은 제외)
- while-they-were-away: v2에서 구현 (뉴스 검색: "지방의회 국외출장", 22년 6월 ~ 26년 5월)
┌──────────────────────────────────────┐
│ OO시의원 홍길동 해외출장 리포트 │
│ (더불어민주당 · OO시의회 제3선거구) │
│ │
│ 출장 4회 | 총 3,200만원 │
│ 일본 3회 | 대만 1회 │
│ "저출생 벤치마킹" "우호교류" │
│ │
│ 🔴 반복국가(일본 3회) | 🔴 목적 모호 │
└──────────────────────────────────────┘
- 데이터 소스: 지방의회 웹사이트 게시판만 사용 (정보공개 청구 불필요)
- 법적 리스크: 공개 게시판 데이터이므로 없음
- 대상 지역 (13개): 하남, 평택, 군포, 인천, 부천, 오산, 용인, 양평, 이천, 김포, 여주, 안양, 서울시 동대문구
- 뉴스 매칭: "지방의회 국외출장" 검색, 9대 임기 기간 (2022.6 ~ 2026.5)
- 프로젝트명 후보: 의원님 같이가요 / 의원님 어디가 / 의원트립
- 13개 의회 웹사이트 구조 파악: 각 의회 사이트에서 출장 데이터가 어떤 형태로 게시되어 있는지 (게시판, PDF, HWP 등) 사전 조사 필요
- 의원 수 규모: 13개 지역 의원 총 수 파악 → 데이터 볼륨 예측
- 프로젝트 이름 최종 확정 및 도메인 확보
- 첫 버전 배포 후 SNS에서 자발적 공유 발생
- 13개 지역의 지방의원 출장 데이터가 시각화됨
- 자동 생성 SNS 카드가 스크린샷/공유됨
- 오픈소스로 공개되어 커뮤니티 기여자 참여
- 웹 서비스: Vercel에 배포, 커스텀 도메인
- 코드: GitHub 오픈소스 (MIT 또는 AGPL)
- 데이터: 수집된 데이터셋은 CSV/JSON으로 별도 공개
- CI/CD: GitHub Actions → Vercel 자동 배포
- 사전 조사 (CC, 1일): 13개 지방의회 웹사이트 구조 파악 → 출장 데이터 게시 형태 확인 → 의원 수 파악 → 크롤링 전략 수립. hwp.js로 실제 HWP 파일 3개 이상 파싱 테스트 → 실패 시 LibreOffice headless 대안 검토
- 데이터 수집 (CC+수동, 1주): 13개 지역 웹사이트 게시판에서 출장 데이터 수집 (크롤링 가능한 곳은 자동화, 나머지는 수동)
- 프로토타입 (CC, 1일): Next.js 프로젝트 세팅 → 메인 지도 페이지 + 의원 상세 페이지 + SNS 카드 생성
- 스크래퍼 파이프라인 (CC, 2-3일): Stagehand/Playwright로 13개 지역 자동화 → LLM 파싱 파이프라인 → 정적 JSON 생성
- 첫 배포 + 바이럴 테스트: 배포 후 SNS 공유 반응 관찰 → 피드백 기반 반복
- "1번과 3번을 위주로 하되 2번은 별도의 상세페이지에서" — 콘텐츠의 감정적 임팩트(지도+스토리)와 데이터 탐색(랭킹)을 분리해서 생각하고 있다. 이건 뉴스 에디터의 사고방식이고, 데이터 시각화 프로젝트에서 가장 중요한 판단이다.
- 시각화/UX를 차별화 포인트로 꼽은 것은 정확하다. 이 데이터는 이미 존재하지만, 아무도 "보기 좋게" 만들지 않았다. 기술적 어려움은 데이터 수집이지, 차별화는 프레젠테이션이다.
- "전체 재정 확장"을 10x 버전으로 본 것은 이 프로젝트를 단발성이 아닌 플랫폼으로 생각하고 있다는 뜻이다.
- 범위를 "공무출장"으로 좁힌 결정이 프로젝트 전체에서 가장 좋은 판단이었다. 화이트보드에 공유재산, 재정현황, 의회 활동까지 있었지만, 하나에 집중하기로 한 것이 바이럴의 전제조건이다.
- 지자체장에서 지방의원으로 피봇한 것은 날카로운 판단이다. 의원은 수가 많아 데이터 볼륨이 크고, "우리 동네 의원"이라는 개인적 연결감이 더 강하며, 정당별 비교라는 추가 분석 축이 생긴다.
- 일비 규정과 성과보고서 제출 의무에 대한 도메인 지식을 반영하여 red-flag 기준을 "반복 목적지 + 출장 목적 모호성"으로 재설정한 것은 실제 데이터의 특성을 이해한 조정이다.