← 돌아가기

이 카드에 뭐가 왜 실렸는지

점수나 등급을 매기지 않는다. 대신 무엇을 보여줄지 고르는 규칙을 여기 다 적어둔다. 공개되지 않은 선택은 그 자체가 이미 평가다.

열린국회정보 OpenAPI의 22대 국회 데이터만 쓴다. 카드의 모든 줄은 국회 의안정보시스템 원문으로 되돌아갈 수 있다.


1. 핵심 표결 5개

찬반이 갈린 정도가 큰 순, 같으면 최근 의결순으로 5개.

찬반이 갈린 정도 = min(찬성 수, 반대 수) ÷ 실제 투표한 의원 수

만장일치면 0, 반반이면 0.5다. 값이 클수록 국회 안에서 의견이 갈렸다는 뜻이다. 어느 쪽이 옳은지, 누가 어느 편인지는 계산에 들어가지 않는다. 의원이 아니라 안건을 재는 값이다. 모수는 실제 투표한 의원 수라 불참은 빠진다. 계산식은 schema.sqlv_bill_contest 뷰에 있다.

관심 주제를 켜면 최근 의결순으로 바뀐다. 상임위 소관 안건은 대체로 여야 합의로 올라와 만장일치에 가깝기 때문이다. 정무위원회에서 제일 갈린 안건도 0.0092, 299명 중 반대가 한둘인 수준이다. 이런 걸 "찬반이 갈린 표결"이라고 내보내면 기준이 이름값을 못 한다. 기준이 성립하는 범위에서만 그 기준을 쓰고, 아니면 날짜 역순이라는 더 단순한 규칙으로 간다. 어느 기준으로 뽑았는지는 화면에 적는다.

의원의 표결

찬성·반대·기권·불참 네 가지를 국회 기록 그대로 쓴다. 재분류하지 않는다. 재임 전이라 기록이 없으면 "기록 없음"이다.

여기에 같은 당 의원들의 표결 분포를 한 줄 덧붙인다.

찬성 | 국회법 일부개정법률안(대안)
     전체 찬성 171 · 반대 101 · 2024-11-28
     더불어민주당 찬성 150 · 반대 1 · 불참 16

대부분의 안건은 정당별로 표가 갈린다. 이걸 감추면 카드가 실제보다 개인의 선택처럼 보인다. 반대로 같은 당과 다르게 투표한 의원도 드물게 있는데, 위 예시의 '반대 1'이 그렇다. 그 의원에게는 이게 카드에서 제일 중요한 사실인데 정당 숫자가 없으면 보이지 않는다.

'당론'이라는 말은 쓰지 않고 따랐다 이탈했다도 판정하지 않는다. 그런 말을 쓰는 순간 평가가 된다. 숫자만 나란히 놓는다. 계산은 v_bill_party_vote 뷰. 정당명은 표결 당시 소속이라 나중에 탈당하거나 옮겼어도 그 시점 기준으로 맞다.

숫자의 출처

안건의 찬반 총계는 국회가 공표한 의안별 표결현황(ncocpgfiaoituanbr), 의원 개인의 표결은 국회의원 본회의 표결정보(nojepdqqaweusdfbi)에서 가져온다.

둘을 나눈 건 숫자가 어긋나기 때문이다. 22대 표결 안건 1,656건 중 285건에서 공표 총계보다 개별기록이 적다. 대개 1표, 많으면 14표 차이다. 공표 집계에는 들어가 있는데 그 표를 누가 던졌는지는 국회가 공개하지 않는다. 그래서 총계는 공표값을 그대로 쓰고 개별기록을 더해 새로 만들지 않는다. 차이는 v_vote_mismatch 뷰로 언제든 볼 수 있다.

이 차이로 안건을 빼지는 않는다. 두 기준으로 각각 순위를 매겨도 상위 50건이 그대로 같아서 카드에 실릴 안건이 달라지지 않는다.


2. 본회의 표결 참여율

출석률이 아니다. 국회 OpenAPI는 본회의 출석부를 주지 않는다. 그래서 출석률 대신 아래 값을 그 이름 그대로 쓴다.

본회의 표결 참여율 = (불참이 아닌 표결 수) ÷ (그 의원 이름으로 표결 기록이 남은 안건 수)

분모에는 찬성·반대·기권·불참이 다 들어간다. 기권은 참여로 센다. 표결에 참여해 의사를 밝힌 것이기 때문이다. 재임하지 않은 기간의 안건은 애초에 기록이 없어 자연히 빠지므로, 보궐로 들어온 의원이 불리해지지 않는다. 실제로 299명 중 20명은 표결 기록이 1,656건보다 적고 15명은 아예 없다. 이 15명은 참여율을 계산하지 않고 "본회의 표결 기록 없음"이라고만 적는다. 0%가 아니다.

불참한 이유는 국회가 공개하지 않는다. 해외출장이든 질병이든 사임이든 기록에는 똑같이 '불참'으로만 남는다. 이 숫자는 성실함의 지표가 아니고, 카드에도 그렇게 적어둔다. 상임위 회의 출석은 데이터가 없어 아예 다루지 않는다.

계산식은 v_vote_participation 뷰.


3. 대표발의 법안

대표발의만 세고, 이름만 올린 공동발의는 따로 표시해 섞지 않는다. 출처는 국회의원 발의법률안(nzmimeepazxkubdpn)의 RST_MONA_CDPUBL_MONA_CD다. 대표발의자가 두 명 이상인 법안은 양쪽 다 대표발의로 센다. 국회 기록이 그렇게 되어 있다.

카드에는 가장 최근 3건만 싣는다. 중요도를 판단할 여지를 없애려고 날짜 역순만 쓴다. 발의 건수가 많다고 일을 잘한다는 뜻은 아니다.


4. 주제 태그

소관 상임위원회를 그대로 쓴다. 법안 내용을 읽고 분류하지 않는다. 상임위 이름이 낯설어서 라벨만 1:1로 바꿨고, 대응표 전체가 아래다.

소관 상임위원회표시 라벨
국회운영위원회국회 운영
법제사법위원회법·사법
정무위원회금융·공정거래
재정경제기획위원회세금·경제
교육위원회교육
과학기술정보방송통신위원회과학·통신·방송
외교통일위원회외교·통일
국방위원회국방
행정안전위원회행정·안전
문화체육관광위원회문화·체육·관광
농림축산식품해양수산위원회농림·해양수산
산업통상자원중소벤처기업위원회산업·에너지·중소기업
보건복지위원회보건·복지
기후에너지환경노동위원회환경·노동
국토교통위원회부동산·교통
정보위원회정보
성평등가족위원회성평등·가족

22대 후반기에 이름이 바뀐 위원회는 옛 이름도 같은 라벨로 묶는다. 기획재정 → 재정경제기획, 환경노동 → 기후에너지환경노동, 여성가족 → 성평등가족. 대응표 원문은 collect.pyTOPIC_LABELS.

관심 주제는 브라우저(localStorage)에만 저장된다. 서버로 보내지 않으니 누가 무슨 주제를 골랐는지 우리도 모른다.


5. 법안 한 줄 설명

의안 원문의 '제안이유'를 잘라 쓴다. 새로 쓰지 않는다.

있으면 "주요내용" 앞까지가 제안이유 구간이다. 합본이 절반을 넘어서, 구분하지 않으면 본문이 통째로 날아간다.

구현은 collect.py_reason_head(), 출처 API는 BPMBILLSUMMARY다. 이 규칙으로 문장이 안 나오는 법안은 설명을 비우고 원문 링크만 건다.

AI로 요약을 만든 경우에는 그 줄에 자동생성 라벨을 반드시 붙인다. 라벨이 없으면 국회 원문에서 잘라낸 것이다.

원문에 가 섞여 나오는 법안도 있다. 회장?부회장?이사, ?출입국관리법? 같은 식이다. 국회 API가 내려주는 원문 자체가 그렇다. 같은 응답 안에 「 」는 멀쩡히 들어 있는 걸 보면 특정 글자만 국회 쪽에서 깨진 건데, 원래 무슨 글자였는지 알 방법이 없다. 추측해서 바꾸지 않고 그대로 둔다. 한 줄 설명 2,504건 중 36건이 그렇다.


6. 심사중 법안과 입법예고

'심사중'은 국회가 계류의안(nwbqublzajtcqpdae)으로 분류한 법안이다. 우리가 판단하지 않는다. 입법예고는 게시종료일(NOTI_ED_DT)에서 오늘을 빼 남은 날짜를 센다. 종료일 당일이 D-0이다.

의견은 국회 입법예고 사이트에서 낸다. 우리는 링크만 걸고 의견을 받거나 모으거나 저장하지 않는다.


7. 돈

서버비와 도메인 값은 나온다. 후원을 받고, 광고를 붙일 수도 있다. 다만 돈이 카드 내용에 닿지 않게 선을 그어둔다.

무엇을 보여줄지는 이 문서의 규칙이 정한다. 후원했다고 뭐가 더 실리거나 빠지는 일은 없고, 그 규칙을 바꾸려면 이 문서부터 고쳐야 한다.

정당과 국회의원, 후보자, 선거 캠프에서는 후원을 받지 않는다. 광고도 정치 관련은 받지 않는다. 특정 인물이나 정당을 홍보해주는 대가로 돈을 받는 일도 없다. 정치 정보를 다루는 곳에서 정치권 돈을 받으면 나머지 규칙을 아무리 잘 지켜도 의심을 못 벗는다.

광고는 카드 바깥 두 자리에만 둔다. 표결이나 발의 기록 사이에 끼워넣지 않고, 광고에는 '광고'라고 적어 기록과 구분한다.

광고는 구글 애드센스로 싣는다. 구글은 광고를 보여주고 성과를 재려고 이용자 기기에 쿠키를 심고 광고 식별자와 IP를 수집한다. 우리가 그 내용을 넘겨받지는 않지만, 우리 사이트에서 벌어지는 일이니 숨기지 않는다. 무엇을 수집하고 어떻게 끄는지는 [개인정보처리방침](/privacy)에 적었고, 처음 방문했을 때 화면 아래에 한 번 알린다.

결제는 외부 서비스로 넘긴다. 카드번호나 계좌 정보가 우리 쪽을 지나가지 않는다. 들어온 돈과 쓴 곳은 정기적으로 적어 올린다.


8. 조회 통계

어느 지역구 카드가 몇 번 열렸는지는 센다. 어디를 고쳐야 할지 알려면 그 정도는 봐야 한다. 서버에 남는 건 이런 줄이다.

2026-08-17 | card  | 서울 중구성동구갑 | 1,204
2026-08-17 | topic | 부동산·교통       |   318

방문 하나를 한 줄로 남기지 않는다. 요청이 들어오면 카운터를 1 올리고 그대로 버린다. 줄이 없으니 나중에 시간 순서로 이어 붙일 것도 없다. 시각은 저장하지 않고 날짜까지만 남긴다.

IP도 User-Agent도 리퍼러도 저장하지 않는다. 우리 쪽에서는 쿠키를 굽지 않으므로 같은 사람이 다시 왔는지 모른다. 다만 광고 사업자는 별개다. 아래 7절과 [개인정보처리방침](/privacy)에 적어뒀다.

검색창에 친 말은 받지 않는다. 읍면동 이름은 사는 곳을 꽤 좁히기 때문이다. 이미 해석이 끝난 선거구만 센다. 선거구 하나에 20만 명쯤 산다.

셀 수 있는 이름은 선거구 254개와 주제 17개로 미리 정해져 있다. 목록에 없는 값은 받지 않으므로 이 표에 자유 문자열이 들어올 수 없다.

DNT나 Global Privacy Control을 켠 브라우저에서는 아무것도 보내지 않는다. 같은 카드를 여러 번 봐도 한 탭에서는 한 번만 센다.

센 숫자는 [조회 통계](/stats)에 그대로 올린다. 기준을 공개한다면서 트래픽만 따로 쥐고 있으면 앞뒤가 안 맞는다.

구현은 stats.sql, stats.py, stats_worker.js 세 파일이고 다 합쳐 270줄이다.


9. 잘못된 걸 봤을 때

카드마다 아래에 "이 카드에 잘못된 게 있나요?" 링크를 둔다. 누르면 다섯 가지 중에서 고른다. 의원 정보가 틀림, 표결 기록이 이상함, 우리 동네가 아닌 것 같음, 링크가 안 열림, 법안 설명이 깨져 보임.

자유롭게 쓰는 칸은 두지 않는다. 글을 받으면 이름이나 전화번호가 섞여 들어오고, 의원에 대한 의견을 적는 사람도 생긴다. 그 순간 이 서비스는 개인정보를 모으는 곳이 되고 댓글창이 된다. 고르는 방식이면 둘 다 애초에 불가능하다.

제보도 조회 수와 같은 카운터에 쌓인다. 남는 건 `2026-08-17 | report | 서울 강남구갑

district3` 같은 줄이고, 누가 눌렀는지는 남지 않는다.

집계는 [조회 통계](/stats)에 올리되 유형별 합계만 낸다. 어느 선거구에서 몇 건이 들어왔는지까지 내걸면, 확인도 안 된 제보가 "이 의원 카드는 틀렸다"로 읽힌다. 선거구별 내역은 고치는 데만 쓴다.

다섯 가지에 안 맞는 얘기는 메일로 받는다. 주소는 화면 아래에 적어둔다. 메일은 우리 서버를 거치지 않는다. 다만 답장은 못 드린다.


10. 우리가 하지 않는 것

의원에게 점수·등급·순위를 매기지 않는다. 진보나 보수 같은 성향을 추정하지 않는다. 표결을 옳은 표결과 틀린 표결로 나누지 않는다.

회원가입도 로그인도 댓글도 커뮤니티도 없다. 계정이 없으니 계정에 쌓이는 기록도 없다. 개인을 알아볼 수 있는 데이터를 서버에 저장하지 않는다. 위 8절의 카운터가 서버에 남는 전부다.


11. 데이터 갱신과 한계

22대 국회(2024~) 기준이고 그 이전 국회는 다루지 않는다. 국회가 올린 다음에 우리가 받아오므로 본회의 직후 며칠은 반영이 늦을 수 있다. 마지막 수집 시각은 화면 아래에 항상 적어둔다.

동네 이름을 선거구로 잇는 방법

열린국회정보 OpenAPI에는 주소와 선거구를 잇는 데이터가 없다. 국회가 주는 건 서울 중구성동구을 같은 선거구 이름뿐이다. 그래서 공직선거법 별표1 국회의원지역선거구구역표를 국가법령정보 공동활용 API로 받아 그대로 옮겼다. 읍면동 하나가 어느 선거구인지는 전부 이 법에 적힌 대로다. 받아온 판본은 공포일자까지 district_area.source에 남는다.

선거구는 254개인데 의원은 253명이다. 강원 강릉시가 공석이라 그 지역은 카드 대신 "현재 공석"이라고 뜬다.

광주는 시도 목록에 없다. 국회 표기가 전남광주통합특별시라 광주와 전남이 한 덩어리다. "광주"로 검색해도 찾아지도록 별칭만 둔다.

입력한 말국회 표기
광주 · 광주광역시 · 전남 · 전라남도전남광주통합특별시
세종세종특별자치시
강원도 · 강원특별자치도강원
전라북도 · 전북특별자치도전북
(그 외) 서울특별시, 경기도 …서울, 경기 …

같은 이름의 의원도 있다. 22대에 박지원 의원이 두 명이다. 전북 군산시김제시부안군을, 전남광주통합특별시 해남군완도군진도군. 사람 구분은 이름이 아니라 국회의원코드로 하고 카드에는 지역구를 늘 같이 적는다.

← 처음으로 · 선정 기준 · 조회 통계 · 개인정보처리방침 · 후원하기
후원하기