누굴 뽑아야 할까 — 그걸 '쉽게' 보고 싶어 만든 사이드 프로젝트
선거 때마다 반복되는 장면이 있다. 우편함에는 공보물이 잔뜩 쌓이고, 뉴스에는 이름들이 흘러가는데, 정작 “그래서 내 동네에서는 뭘 뽑고, 거기 나온 사람들은 무슨 생각을 하는가"를 한눈에 보기가 어렵다. 광역·기초 단체장에 지역구·비례 의원, 교육감까지 한 사람이 여러 장을 찍어야 하는데, 그 정보가 여기저기 흩어져 있다.
그래서 만들었다. 거창한 서비스가 아니라, “내가 누굴 뽑아야 하고, 그 사람들은 무슨 생각을 하는가"를 쉽고 간편하게 확인하는 창 하나. 이름은 agorea 로 붙였다.
이 글은 그 결과물을 자랑하려는 게 아니다. 사이드 프로젝트 하나를 혼자 0에서 1까지 끌고 가면서, 코드 바깥에서 더 많이 배웠기 때문에 그 기록을 남긴다.
만들고 싶었던 것
목표는 처음부터 단순했다. 주소 한 줄을 넣으면,
- 내가 사는 곳에서 이번에 치러지는 투표의 종류가 보이고
- 그 선거구의 후보자가 추려지고
- 후보별 공약까지 한 화면에서 펼쳐 보이는 것.
전국의 모든 후보를 나열하는 백과사전이 아니라, ‘내 기준’으로 좁혀주는 것이 핵심이었다. 정보가 없어서가 아니라 너무 많아서, 내 것만 골라내기가 어려운 거였으니까.
내가 공유하고 싶었던 가치도 여기에 있다. 정보에 닿는 문턱을 한 칸 낮추는 일 자체가, 누군가의 참여를 돕는다고 믿는다. 투표라는 행위는 거창한데, 그 앞에 놓인 정보 탐색은 너무 번거롭다. 그 간극을 줄이고 싶었다.
데이터는 어디서
데이터는 공공데이터 — 선거관리위원회의 OpenAPI 를 활용했다. 후보자 명단도, 공약도 결국 공식 출처에서 와야 신뢰가 생긴다. 이 부분은 길게 풀지 않겠다. 출처가 공공기관이라는 점, 그거면 이 글에서는 충분하다.
만드는 것과 ‘버티게 하는 것’은 다르다
기능이 돌아가게 만드는 것까지는 어렵지 않았다. 문제는 그 다음이었다. 동작하는 것과 운영할 수 있는 것은 완전히 다른 문제라는 걸, 이번에 제대로 체감했다.
대표적인 사례 하나. 의정활동 통계를 보여주는 화면이 처음엔 요청마다 메모리를 1GB 가까이 잡아먹었다. 그대로 두면 사람이 몰리는 순간 서버가 주저앉는다. 미리 계산해둔 결과를 따로 저장해두는 방식으로 바꾸자 같은 화면이 16MB 로 떨어졌다. 사용자는 이 차이를 눈으로 보지 못한다. 그래도 이게 서비스의 생사를 가른다.
성능만이 아니었다. 여러 사람이 동시에 들어올 때 데이터가 꼬이지 않게 하는 일, 외부에 노출되는 서버를 조금이라도 단단하게 만드는 일 — 이른바 성능·보안·동시성을, 이번 프로젝트에서 처음으로 진지하게 고민했다. 돌아가게 만드는 것과 버티게 만드는 것은 다른 일이었다.
만들었다고 끝이 아니다, 발견돼야 한다
이번 프로젝트에서 가장 오래 고민한 지점이 이거였다.
아무리 쉽게 잘 만들어도, 사람들에게 닿지 않으면 없는 것과 같다. 검색에 노출되게 만들고, 검색엔진에 사이트를 등록하고, 실제로 누가 어떻게 들어오는지 관찰하는 것 — 코드를 한 줄도 더 안 쓰는데, 해야 할 일이 산더미였다. 그동안 내 일의 끝을 ‘배포’라고 생각해왔는데, 이번에 그 선이 옮겨졌다. 개발은 배포가 아니라 도달에서 끝난다.
검색 노출과 도달에 관한 이야기는 분량이 제법 되니, 앞으로 다른 사이드 프로젝트 포스트에서 파트별로 따로 상세하게 다뤄볼 생각이다.
개발 밖에서 든 의문 — 확인할 시간이 부족하다
코드와 무관하게, 데이터를 다루다 보니 일정 자체가 눈에 들어왔다.
- 후보자 등록 마감: 5월 15일
- 선거공보(공약) 제출 마감: 5월 22일
- 선거일: 6월 3일
즉 후보와 공약이 다 갖춰지는 건 5월 하순이고, 유권자가 그걸 들여다볼 수 있는 시간은 길어야 2주 남짓이다. 야근하고 돌아온 직장인이 일곱 장 투표지의 후보와 공약을 차분히 비교하기엔 빠듯하다. 만들면서 내내 “이 일정이 적절한가” 하는 의문이 들었다.
찾아보니 이건 한국 제도의 구조적 특징이었다. 한국은 공직선거법으로 공식 선거운동기간 자체를 짧게(지방선거 13일) 묶는다. 비용과 과열을 억제하려는 의도된 설계지, 누락이 아니다. 반대로 미국은 한국식 ‘공약 등록 마감’이라는 개념이 없고, 후보들이 예비선거를 포함해 수개월에 걸쳐 정책을 공개·토론한다. 길게 늘어진 만큼 돈과 피로도가 크다는 트레이드오프가 따라온다.
짧고 압축적인 쪽을 택한 게 한국이라면, 그 짧은 기간에 후보와 공약을 빠르게 훑을 수 있는 도구가 있어야 한다. 이 프로젝트를 만든 이유와도 정확히 맞물리는 지점이었다.
숫자가 평가가 되는 순간
의정활동 데이터를 들여다보다 또 하나 걸린 게 있다. 어느 순간부터 국회의원 발의안 개수가 눈에 띄게 많아졌다는 점이다.
발의안 개수는 의정활동을 평가하는 점수에 반영된다. 의도는 이해한다. 일을 얼마나 했는지 숫자로 보여주자는 거니까. 그런데 수치화된 정성평가는 결국 ‘평가를 잘 받기 위한 수단’으로 변질되기 쉽다.
예를 들면 이렇다. 하나의 좋은 안건을 떠올렸다가도, 점수를 위해 굳이 여러 건으로 쪼개 발의한다. 건수는 늘지만 안건 하나가 가지는 무게는 옅어진다. 숫자는 채워지는데 알맹이는 흐려지는, 그런 부작용만 남는 건 아닐까 싶었다.
회사에서 하는 평가도 다르지 않다고 생각한다. 어떤 방법론이든 프로젝트의 완성도를 높이기 위한 수단에 그쳐야 한다. 그게 시험 문제처럼 그 자체로 평가 항목이 되는 순간, 사람들은 일을 잘하는 게 아니라 평가를 잘 받는 쪽으로 움직인다. 그러면 본래의 목적을 잃는다. 데이터를 만지다 든, 기능과는 직접 상관없는 개인적인 생각이다.
다음 한 뼘 — 선거를 넘어서
agorea 는 6월 3일이 지나면 소임을 다하는 일회성 사이트로 끝낼 생각이 없다.
선거는 시작일 뿐이다. 그 다음 더 궁금한 건, 우리가 사는 나라의 정책들이 실제로 어떻게 만들어지고 굴러가는가다. 이번에 깔아둔 토대 — 후보와 공약을 모으고, 의정활동 데이터를 다루고, 통계로 보여주는 구조 — 는 그대로 정책의 흐름을 따라가는 화면으로 확장할 수 있다.
그래서 이 프로젝트의 다음 챕터는 선거가 아니라 정책이다. 누가 잘하고 못하는지 감시하겠다는 게 아니라, 평소 관심 있던 나라 정책들이 지금 어디까지 와 있는지 한 화면에서 차분히 따라가는 — 나를 위한 작은 정책 대시보드로 키워볼 생각이다.
6월 3일, 투표하기 전에 agorea.xyz 에서 당신의 동네는 뭘 뽑는지 한 번 확인해보시길.