정기 수집과 상태 보존
NestJS Worker가 국회 공개 API를 주기적으로 수집하고 PostgreSQL에 정규화합니다. 웹 요청과 수집 작업을 분리해 대량 동기화가 사용자 화면의 응답 경로를 막지 않도록 했습니다.
국회 공공데이터를 그대로 나열하는 대신, 사용자가 구독한 관심사·법안·정당·정치인과 연결해 개인 피드, 요약, 다이제스트, 알림으로 전달하는 정보 서비스를 만들었습니다. 화면보다 먼저 데이터 수집·의미 매칭·근거 보존·배치 운영까지 하나의 파이프라인으로 설계했습니다.
국회 데이터는 법안, 의원, 정당, 처리 상태처럼 구조화된 정보가 많지만 사용자가 매번 검색하고 원문을 읽어 변화 여부를 확인해야 하면 지속적으로 따라가기 어렵습니다. 반대로 AI 요약만 앞세우면 어떤 원문을 근거로 했는지, 왜 내 관심사와 연결됐는지 확인하기 어려워집니다.
그래서 폴리는 공식 데이터 수집 → 정규화 → 후보 검색 → 관련성 판정 → 근거와 함께 노출 순서를 분리했습니다. AI는 원문을 대체하는 최종 판단자가 아니라, 많은 항목에서 사용자의 구독과 관련된 후보를 좁히고 읽기 쉽게 정리하는 계층으로 두었습니다.
사용자에게 필요한 것은 더 많은 의정 데이터가 아니라, 관심사와 연결된 변화가 무엇인지 확인하고 원문까지 추적할 수 있는 흐름이라고 봤습니다.
NestJS Worker가 국회 공개 API를 주기적으로 수집하고 PostgreSQL에 정규화합니다. 웹 요청과 수집 작업을 분리해 대량 동기화가 사용자 화면의 응답 경로를 막지 않도록 했습니다.
관심사 문장과 법안·활동 텍스트의 임베딩을 이용해 의미적으로 가까운 후보를 먼저 찾습니다. 모든 항목을 매번 AI에 보내지 않고 검색 단계에서 범위를 줄입니다.
후보를 다시 관련·비관련으로 판정하고 근거를 저장합니다. 검색 점수와 AI 판정을 분리해 어느 단계에서 항목이 포함되거나 제외됐는지 운영 화면에서 추적할 수 있게 했습니다.
같은 구독 그래프를 개인 피드, 정기 다이제스트, 처리 상태 변경 알림에 재사용합니다. 전달 채널마다 별도의 추천 로직을 만들지 않고 동일한 관심사 모델을 공유합니다.
요약 생성과 관련성 판정은 외부 모델 호출에 의존하므로 실패 가능성을 운영 상태로 다룹니다. 원문 식별자와 공식 출처를 별도로 보존하고, AI 결과가 없더라도 사용자가 원문으로 이동할 수 있는 구조를 우선했습니다.
사용자는 관심사뿐 아니라 법안, 정당, 정치인을 직접 구독할 수 있습니다. 이 관계를 단순 즐겨찾기가 아니라 피드 정렬, 새 활동 알림, 다이제스트 생성의 공통 입력으로 사용했습니다.
최근에는 정부·공공기관의 정책·혜택 데이터도 별도 수집해 개인 피드에 함께 섞는 흐름을 추가했습니다. 이 경우에는 생활 조건이 필요한 만큼 별도의 정책 프로필과 동의를 두고, 동의된 정보만 매칭에 사용하도록 경계를 분리했습니다.
정책 개인화에 필요한 추가 정보는 일반 구독 정보와 분리하고, 명시적으로 동의한 프로필만 매칭 입력으로 사용하도록 설계했습니다.
관심사·법안·정당·정치인 구독을 하나의 개인화 입력으로 사용
구독 대상의 새 활동과 법안 변화를 묶어 정기적으로 다시 읽을 수 있게 구성
별도 동의 기반 정책 프로필로 정책·혜택 후보를 개인 피드에 연결
초기 데이터가 쌓일수록 관심사별 후보 검색, 관련성 판정, 요약 생성, 알림 전송이 동시에 늘어났습니다. 수집과 AI 작업을 NestJS Worker로 분리하고 Redis/BullMQ 이벤트와 주기 점검을 함께 사용해 실시간성보다 누락 없는 전달을 우선했습니다.
관심사마다 최근 스캔과 판정 상태를 확인할 수 있게 만들고, 실패한 작업은 사용자 화면의 오류 문구로 끝내지 않고 운영 상태에서 다시 추적할 수 있도록 했습니다. 다이제스트도 생성 결과를 보관해 일회성 알림이 아니라 다시 조회할 수 있는 아카이브로 확장했습니다.
Poli에서 가장 큰 구현 범위는 피드 UI가 아니라 외부 공공데이터를 계속 가져오고, 의미 검색과 AI 판정을 운영 가능한 상태로 만들고, 같은 구독 정보를 여러 전달 채널에 재사용하는 일이었습니다.
프론트엔드·API·DB·배치·AI·푸시 알림·개인정보 동의까지 서로 다른 경계를 한 제품 흐름 안에서 연결하면서, AI 기능도 결국 데이터 모델과 운영 상태가 받쳐줘야 제품이 된다는 점을 확인했습니다.
수집, 의미 검색, 관련성 판정, 구독, 다이제스트, 알림과 정책 개인화를 각각 분리하면서도 하나의 사용자 흐름으로 연결했습니다.
Poli 프로젝트 소개 보기 ↗