공고 알림봇 만들기 (5편) — 같은 공고가 계속 왔습니다

4편에서 소스마다 다른 응답 구조를 겨우 맞췄다고 했죠. 이제 알림이 오기 시작했어요. 그런데 한 시간 뒤에 똑같은 공고가 또 왔습니다. 그다음 시간에도요.

지난 편 → 4편 — API마다 응답 구조가 달랐습니다

API는 "새로 올라온 것"만 주지 않아요

제가 착각한 게 있었어요. 요청하면 새 공고만 골라서 줄 거라고 막연히 생각했거든요.

아닙니다. 공고 API는 지금 열려 있는 목록 전체를 줍니다. 어제 본 것도, 그제 본 것도 마감 전이면 계속 들어 있어요. "이전에 가져간 것 이후로만 주세요" 같은 옵션은 없었습니다.

제 봇은 한 시간마다 물어보는데, 매번 이만큼이 옵니다.

소스한 번에 오는 양
든든전세300건
기업마당100건
K-Startup · LH각 10건
마이홈8건
합계428건

하루 24번이면 1만 건 넘게 받아보는 셈이에요. 그런데 그중 진짜 새 공고는 하루에 많아야 수십 건입니다.

즉 "무엇이 새 것인가"는 API가 알려주지 않아요. 내가 판단해야 합니다.

그래서 "이미 본 것"을 기억하기로 했어요

방법은 단순합니다. 알림을 보낸 공고를 어딘가 적어두고, 다음에 받은 목록과 대조해서 적혀 있지 않은 것만 새 것으로 치는 거죠.

문제는 무엇을 적을 것이냐였어요.

무엇이 같으면 "같은 공고"인가

처음엔 제목만 적으려고 했어요. 그런데 금방 걸리더라고요.

  • 제목만 쓰면: 기관이 다른데 제목이 같은 공고가 있어요. 2026년 창업지원사업 모집 공고 같은 건 여기저기서 씁니다. 하나를 받으면 나머지가 묻혀요.
  • 주소만 쓰면: 같은 공고인데 주소 뒤에 파라미터가 붙었다 말았다 하면 매번 다른 것으로 보입니다.

그래서 제목과 주소를 붙여서 하나의 열쇠로 만들었어요. 둘 다 같아야 같은 공고로 봅니다.

실제로 저장되는 모양은 이렇습니다.

[경기] 포천시 2026년 2차 중소기업 전시회 출전 지원사업 모집 공고|https://www.bizinfo.go.kr/...pblancId=PBLN_000...

가운데 세로줄 하나로 이어붙인 게 전부예요. 이 문자열이 이미 있으면 건너뛰고, 없으면 알림을 보낸 뒤 목록에 추가합니다.

파일 하나면 충분했어요

여기서 데이터베이스를 붙일까 잠깐 고민했어요. 결론은 안 붙였습니다.

지금 그 목록은 이 정도예요.

항목 수   2,634건
파일 크기   480KB

두 달 넘게 돌린 결과가 이겁니다. 텍스트 파일 하나에 담기고, 시작할 때 통째로 읽어도 순식간이에요. 이 정도 규모에 DB를 얹는 건 과했습니다.

물론 영원히 이럴 순 없어요. 몇 년 쌓이면 손봐야 하겠지만, 그건 그때 가서 할 일입니다.

재시작해도 기억해야 해요

이게 파일로 저장하는 진짜 이유입니다.

프로그램 안에서만 기억하면, 껐다 켜는 순간 전부 잊어버립니다. 그러면 재시작할 때마다 열려 있는 공고 428건이 몽땅 "처음 보는 것"이 돼서 알림이 쏟아지죠.

실제로 저는 PC를 끄고 켤 때마다 봇이 다시 시작합니다. 오늘 아침에도 그랬어요. 그런데 알림은 조용했습니다. 파일에 적어둔 걸 다시 읽어와서 "이건 어제 이미 보냈네" 하고 넘어간 덕분이에요.

정리 — 새 것을 아는 건 내 몫이었어요

돌아보면 이 편의 교훈은 하나예요. 바깥에서 오는 데이터는 "무엇이 달라졌는지"를 말해주지 않습니다. 늘 현재 상태 전부를 줄 뿐이죠.

달라진 것을 알고 싶으면 이전 상태를 내가 들고 있어야 합니다. 알림봇의 핵심은 사실 알림이 아니라 이 기억 장치였어요.

그런데 이 열쇠 방식에도 구멍이 있었습니다. 다음 편에서 그 얘기를 해볼게요.

다음 편

한 공고가 알림 일곱 개로 쪼개질 뻔했어요. 분명 중복을 걸렀는데도요. 같은 공고가 다른 것처럼 보이는 경우가 있었습니다. → 6편 — 한 공고가 일곱 번 올 뻔했습니다


(이전 편: 4편 — API마다 응답 구조가 달랐습니다)

댓글