22시 1분에 계획이 뒤집혔다. 지금 있는 사이트를 다 지우고, 공고를 긁는 것부터 글과 사진까지 전부 자동으로 도는 한국어 사이트로 다시 세우기로 했다. 퇴사하고 AI로 회사를 만드는 중이라 이런 결정은 밤에 혼자 내린다. 대상은 정부 지원사업 공고를 자동 수집하는 사이트(rebate-kr)였고, 제일 먼저 만진 색인 정책 스크립트가 세 번 연속으로 죽었다.
없는 파일을 두 번 찾았다
색인 규칙이 두 군데에 흩어져 있는 게 먼저 걸렸다. 페이지가 내보내는 robots 메타와 사이트맵이 각자 판단하고 있어서, 한쪽만 고치면 다른 쪽이 조용히 어긋난다. 규칙을 한 파일에서 정하고 양쪽이 그걸 읽게 바꾼 다음 돌렸더니 첫 줄에서 멈췄다.
ENOENT: no such file or directory,
open '~/projects/rebate-kr/dist/sitemap-0.xml'
사이트맵이 없다. 빌드를 안 돌렸으니 그럴 수 있다고 보고 npx astro build를 돌린 다음 다시 실행했더니, 이번엔 dist/data/pblanc.json이 없다고 죽었다.
설정인 줄 알았다
첫 에러를 봤을 때 나는 색인 정책을 “빌드에 넘기는 설정”이라고 생각하고 있었다. 설정은 빌드 앞에 있는 게 맞으니, 없는 파일은 내가 아직 안 만든 파일이라고 읽었다. 그래서 빌드를 한 번 돌리고 같은 스크립트를 다시 걸었다.
두 번째 ENOENT가 다른 파일 이름으로 나왔을 때 그 추정이 깨졌다. 한 파일이 비었으면 사고지만, 채우자마자 다음 파일이 비면 그건 내가 파일 하나를 빠뜨린 게 아니라 이 스크립트가 서 있는 자리가 틀린 것이다.
순서가 거꾸로였다
내가 만든 건 설정이 아니라 후처리 스크립트였다. dist 안의 사이트맵과 데이터 파일을 열어서 세고 고치는 물건인데, 그 두 파일은 빌드가 만들어내는 산출물이다. 빌드 앞에 두면 영원히 못 읽는다.
그래서 이 함정은 이렇게 정리된다. 조건은 빌드 산출물을 읽는 스크립트를 빌드 앞 단계에 걸었을 때. 증상은 파일 이름만 바뀐 ENOENT가 반복되는 것이고, 하나 채우면 다음 파일에서 같은 에러가 난다. 회피법은 그 스크립트를 빌드 뒤로 옮기는 것이다. 수집, 빌드, 정책 순서로 고정했다. 새로 넣는 스크립트가 여는 파일이 저장소에 원래 있던 것인지 빌드가 만드는 것인지부터 가른다. 나는 그 구분을 안 해서 22시 24분 한 구간에서 세 번 돌렸다.
순서를 고치고 나온 숫자
데이터를 채우고 빌드를 먼저 돌린 다음 정책을 걸었다. 정책 스크립트가 마지막에 찍는 줄은 이것 하나다.
페이지 1623 · 색인 대상 38 · noindex 1585 · 광고 게재 33

한 줄에 넣은 건 의도였다. 만든 페이지 수와 내놓을 수 있는 페이지 수가 같은 줄에 찍히지 않으면 1,623이라는 숫자만 남고, 사이트가 커지는 중인지 나만 볼 페이지가 쌓이는 중인지 구분할 방법이 로그 어디에도 없다. 사이트맵에 올라간 URL도 38건, 빌드는 1.34초, 경고 4건. 1,623과 38 사이에 있는 1,585개는 나만 볼 페이지다.
빌드 뒤에 미리보기를 띄워 확인하려 했는데 npx astro preview --port 4331이 exit 7로 끝났고 응답 코드는 000이었다. 원인 모름. 재현 조건은 빌드 직후 preview를 백그라운드로 띄우고 바로 요청을 보내는 것. 색인 38개를 화면으로 본 건 아니고, 빌드가 그렇게 셌다는 것까지만 확인했다.
게이트는 같은 밤에 한 번 더 걸렸다
22시 13분에 돌린 수집기도 같은 모양으로 멈췄다. 공고 1,576건을 모았는데 마감일이 날짜로 읽힌 건 654건, 41.5%였다. 게이트는 마감일 파싱률 41.5% < 90%를 찍고 종료 코드 2로 끝났다.
두 자리에 같은 규칙을 뒀다. 단계마다 들어온 수와 통과한 수를 한 줄에 찍고, 통과율이 미리 박아둔 선 아래면 다음 단계로 넘기지 않는다. 색인 쪽은 1,623과 38이 그 줄이고, 수집 쪽 선은 마감일 파싱률 90%다. 공고나 상품을 긁어 페이지를 찍어내는 자동화를 돌린다면, 로그 마지막 줄에 모은 수와 내보낼 수를 나란히 두고 그 비율에서 멈추는 선을 하나 박아두세요.
90%는 내가 정한 값이고 아직 근거는 없다. 41.5%에서 걸려버려서 그 선이 맞는지 시험해 본 적이 없다. 기준은 내리지 않고 그대로 뒀다.