프로젝트 기록

PROJECT RECORD

입찰 문서의 변경 기록에서 나라장터 공고 조회 도구로

EN 한국어

입찰 자료가 바뀌었다는 알림을 받아도, 견적에 무엇을 반영해야 하는지는 다시 확인해야 한다. 바뀐 내용이 어느 문서의 몇 쪽에 있고, 아직 답을 받지 못한 질문은 무엇인지 함께 남기는 도구를 만들고 싶었다. 처음에는 영국의 기계·전기 설비 견적팀을 대상으로 BidDelta의 범위를 잡았고, 이후에는 한국 나라장터의 공식 공고 데이터를 찾아 정리하는 KONEPS Live Tender Matcher를 공개했다.

두 도구가 처리하는 자료는 다르다. BidDelta는 도면·사양서·추가 문서의 변경 내용을 검토하는 서비스이고, KONEPS 도구는 공식 API가 주는 공고와 변경 표시를 일정한 형태로 정리하는 프로그램이다. 나라장터 도구가 문서 두 개를 읽어 차이를 계산하거나 입찰을 대신하는 것은 아니다.

바뀐 내용 옆에 근거 페이지를 붙였다

BidDelta에서는 변경 목록에 원문 페이지를 연결하고, 해결되지 않은 항목은 다음 담당자에게 넘길 수 있도록 제품 범위를 정했다. 변경을 찾았다는 사실에서 멈추지 않고, 가격에 반영할지 질문을 남길지 사람이 판단할 수 있는 기록을 만들려 했다. 자동 비교 결과도 사람의 검토를 거치는 구성으로 잡았다.

판매 페이지와 범위·가격 문서, 실제 변경 사례를 다룬 보고서, 운영 절차와 잠재고객 관리표를 준비하면서 단위시험과 과거 사례 비교도 진행했다. 공개 레코드를 한꺼번에 조회하다 속도제한에 걸린 뒤에는 요청 속도를 낮추고 실패한 요청을 재시도하는 방식으로 바꿨다. 외부에 보내기 전에는 잠재고객 순위의 오류와 끊어진 근거 링크도 다시 확인했다.

당시 기록에는 공식 조달 레코드의 몇 가지 사례에서 핵심 변경 신호를 대조한 과정과 문의폼·이메일로 첫 접촉을 한 일이 남아 있다. 2026년 8월 17일자로 표시된 KBlip 제품 소개에서도 영국 설비 견적팀을 위한 변경 목록과 인계표라는 당시 제품 범위를 볼 수 있다. 이것은 출시 소개의 흔적이며 고객 계약을 뜻하지 않는다.

나라장터 공고는 한 행씩 정리했다

KONEPS는 나라장터의 영문 약칭이다. 여기서는 웹페이지를 눈으로 읽는 대신, 프로그램이 데이터를 요청하는 창구인 조달청 Open API를 사용했다. 용역·물품·공사·외자·기타 공고마다 해당 조회 경로를 선택하고, 등록일 또는 변경일 범위를 지정해 자료를 가져오도록 구현했다. 이 프로그램을 Apify에서 실행할 수 있는 Actor로 공개했다. 공개 도구 · 조달청 API 원문

조회 뒤에는 키워드와 지역으로 거르고, 공고 번호·제목·기관·예산·마감일·변경 상태·원문 링크를 한 행에 담았다. 이렇게 여러 단계로 중첩된 데이터를 같은 열 구조로 바꾸는 것을 정규화라고 한다. 결과를 JSON으로 받거나 CSV·Excel로 내보내면 관심 공고를 표에서 이어 볼 수 있다. 지역 검색은 공개된 지역·기관 필드의 글자를 비교하는 필터로, 입찰 참가 자격을 판정하는 기능은 아니다.

같은 공고가 여러 번 들어오면 공식 공고 번호와 차수의 조합인 bidNtceNo + bidNtceOrd로 묶었다. 같은 조합 안에서는 더 최근의 변경 시각을 가진 기록을 우선하되, 비어 있지 않은 기존 값도 보완에 사용한다. 공식 번호가 없을 때만 업무 유형·제목·기관·마감일로 임시 식별값을 만든다. 이것은 도구 안에서 중복을 줄이기 위한 값이며 공식 공고 번호를 새로 발급하는 것이 아니다.

예산 역시 숫자 하나로 합치고 끝내지 않았다. 배정 예산, 공고 예산, 추정가격 필드 순으로 사용할 수 있는 값을 고르면서, 어느 필드에서 가져왔는지와 원래 세 금액을 함께 남겼다. 없는 금액은 0으로 채우지 않고 null, 즉 값이 없다는 표시로 둔다. 공고의 금액을 비교하는 사람이 서로 다른 종류의 숫자를 같은 예산으로 오해하지 않도록 출처 필드를 보존한 것이다.

변경 표시와 조회 실패를 구분했다

Actor의 ‘변경됨’ 표시는 변경일 기준으로 조회했거나, 공식 응답에 변경 시각·사유 또는 변경 공고라는 표시가 있을 때 붙는다. 이전 문서와 새 문서를 비교해 알아낸 차이는 아니다. 나는 원문으로 돌아갈 링크와 변경 사유를 남겨, 이 표를 확인의 출발점으로 쓰도록 했다. 이 도구는 조달청이나 나라장터가 운영·보증하는 공식 서비스가 아니며 최종 확인 기준은 원래 공고다.

조회 범위는 양 끝 날짜를 포함해 31일 이내로 제한하고, 페이지 수와 결과 수에도 상한을 두었다. 일시적인 서버 오류나 초당 요청 제한에는 기본적으로 최대 세 번까지 시도하며, 재시도 전에는 250ms, 500ms 순으로 기다린다. 승인이나 입력 문제처럼 다시 보내도 해결되지 않는 오류까지 무조건 반복하지는 않는다. 마감 전 공고만 고르는 onlyOpen 조건에서는 마감일 자체가 없는 기록도 제외한다. 마감이 없다는 이유로 아직 열려 있다고 추정하지 않기 위해서다.

사용자는 data.go.kr에서 발급받은 자기 서비스 키를 입력한다. 키는 비밀 입력 항목으로 지정했고 결과에 넣지 않으며, 오류 메시지에서도 원문 키와 URL 인코딩된 키를 지우도록 했다. 2026년 9월 7일 코드 검토와 오프라인 시험에서는 날짜·응답 형태·중복 처리·과금 상한·키 마스킹 등을 다룬 10개 시험이 통과했다. 실제 키로 나라장터를 조회하고 결제까지 확인한 시험은 아니다.

실행 전에 결과 수와 비용을 제한했다

유료 도구로 공개하면서는 반환한 공고 한 건에 과금 이벤트 하나만 연결하도록 했다. 기본 데이터 저장 과금과 결과 과금이 동시에 설정되면 중복 청구가 생길 수 있어, 그런 설정에서는 자료를 가져오기 전에 멈추게 했다. 사용자가 입력한 지출 상한과 플랫폼의 실행 상한이 함께 있으면 더 작은 값을 적용하며, 플랫폼이 과금 한도 도달을 알리면 출력을 중단한다.

공개된 AI·자동화 용역 검색 예제는 최대 10개 결과와 미화 0.01달러의 이벤트 지출 상한을 둔 설정이다. 현재 저장된 예제 날짜는 2026년 8월 30~31일이므로, 새 공고를 찾으려면 날짜와 본인의 서비스 키부터 바꿔야 한다. 예제 설정이 있다는 사실과 실제 조회 결과가 있다는 사실은 구분했다.

공개 이후 확인한 범위

2026년 9월 7일 공개 페이지와 공식 공개 API를 다시 확인했을 때 Actor는 공개 상태였고 최신 빌드는 0.1.6이었다. 페이지에는 총 사용자 1, 월간 활성 사용자 0, 북마크 0이 표시됐으며 API의 전체 실행 수는 0이었다. 총 사용자 1이라는 표시만으로 외부 고객이 사용했다고 판단할 수는 없다.

BidDelta의 첫 접촉까지는 진행했지만, 9월 3일 확인 기록에서 구매와 매출은 0이었다. 이후의 계약이나 입금은 이번 확인 범위에서 새로 확인하지 못했다. 지금 남은 두 구현은 서로 다른 지점을 다룬다. 하나는 변경 내용을 원문 페이지와 함께 넘기는 일이고, 다른 하나는 공식 공고를 같은 열 구조로 정리해 다시 확인할 수 있게 하는 일이다. 고객이 이 기록을 실제 업무에서 반복해서 쓰는지는 별도로 확인할 부분이다.

Read in English

연구 목록 · 작업 목록

Research index · Work index

Woong Works에서 더 알아보기

지금 구독하여 계속 읽고 전체 아카이브에 액세스하세요.

계속 읽기