크롤러를 한 번 만들고 나면 "매일 돌리기"가 다음 과제가 됩니다. 그런데 매일 전체를 처음부터 다시 긁으면 문제가 생깁니다. 상대 서버에 매일 같은 부하를 주고 이미 가진 데이터를 또 받아 오며 처리 시간도 쓸데없이 길어집니다. 법률 게시판을 매일 수집하는 이 프로젝트에서는 "새로 올라온 것만 가볍게 걷어 오는" 증분 수집으로 이 낭비를 걷어 냈습니다.
시간 범위로 필요한 것만 요청한다
증분 수집의 출발점은 "언제부터 언제까지"를 정하는 것입니다. 각 수집기는 지난 수집 시점과 이번 시점을 받아 그 사이에 올라온 질문만 대상으로 삼습니다. 게시판이 글마다 작성 시각을 함께 내주므로, 그 시각을 기준으로 범위 밖의 글은 걸러 냅니다. 어제까지 이미 모은 글을 오늘 다시 받지 않는 것이 기본 원칙입니다.
이 범위 개념은 게시판마다 방식이 달라도 똑같이 적용됩니다. HTML을 읽는 게시판이든, API를 부르는 게시판이든, 렌더링 데이터를 보는 게시판이든, 각 질문의 작성 시각을 확인해 범위 안에 드는 것만 남깁니다. 접근 방식은 달라도 "새 글만"이라는 규칙은 하나로 유지됩니다.
최신순이면 오래된 글에서 멈춘다
게시판 대부분은 최신 글을 먼저 보여 줍니다. 이 성질은 증분 수집에 아주 유용합니다. 최신순으로 훑다가 지난 수집 시점보다 오래된 글을 만나면, 그 아래는 볼 필요가 없기 때문입니다. 그래서 그 지점에서 탐색을 즉시 멈추게 했습니다.
이 조기 종료가 있으면 오래된 대역까지 끝까지 훑는 낭비가 사라집니다. 어제 이후 새 글이 몇 건뿐이라면 몇 페이지만 보고 멈추고 새 글이 많으면 그만큼만 더 봅니다. 수집량이 실제 새 글 수에 비례하게 됩니다. 페이지를 무한정 넘기지 않으니 요청 수도 자연스럽게 줄어듭니다.
중복은 들어오기 전에 거른다
같은 글이 두 번 들어오는 경로는 생각보다 많습니다. 한 게시판 안에서 여러 분야를 검색하면 같은 글이 여러 분야에 걸쳐 나오기도 하고 페이지 경계에서 겹치기도 합니다. 그래서 수집 중에 이미 본 글을 기억해 두고 같은 링크나 같은 식별자가 다시 나오면 건너뜁니다. 게시판에 따라 링크로, 고유 번호로, 순서 번호로 중복을 판별합니다.
중복을 수집 단계에서 미리 거르면 뒤 단계가 깨끗해집니다. 저장소에 같은 질문이 여러 번 쌓이지 않고 AI 분류도 같은 질문을 여러 번 읽지 않습니다. 앞에서 한 번 거르는 비용이 뒤에서 여러 번 치를 비용보다 훨씬 쌉니다.
밀린 작업은 버린다
매일 도는 작업에는 뜻밖의 함정이 있습니다. 어떤 이유로 실행이 밀려 큐에 작업이 쌓이면, 다음 날 한꺼번에 몰려 실행되면서 오래된 시점의 작업이 뒤늦게 도는 일이 생깁니다. 그래서 대기한 지 일정 시간이 지난 작업은 실행하지 않고 폐기하게 했습니다. 오래된 수집 요청을 굳이 지금 실행할 이유가 없기 때문입니다.
여기에 일시적인 오류를 위한 재시도도 두었습니다. 잠깐의 접속 실패는 간격을 늘려 가며 몇 차례 다시 시도하고 그래도 안 되면 그 게시판만 실패로 남깁니다. 실패를 어떻게 격리하고 기록하는지는 크롤러 실패 격리와 감사 로그에서 이어집니다. 목록이 사라진 게시판에서 새 글만 거슬러 모으는 구체적인 방법은 사라진 목록 페이지 수집하기에서 다뤘습니다.
자주 묻는 질문
매일 전체를 다시 긁으면 안 되나요?
기술적으로는 가능하지만 낭비가 큽니다. 상대 서버에 매일 같은 부하를 주고 이미 가진 데이터를 또 받으며 처리 시간도 길어집니다. 시간 범위로 새 글만 걷으면 수집량이 실제 새 글 수에 비례하도록 줄어들어 여러모로 가볍습니다.
조기 종료가 새 글을 놓칠 위험은 없나요?
게시판이 최신순으로 글을 보여 준다는 전제 위에서 동작하므로, 최신순 정렬을 확인하고 적용합니다. 정렬이 보장되지 않는 게시판에서는 조기 종료 대신 시간 범위 필터만으로 새 글을 걸러 놓침 없이 안전하게 수집합니다.
작업이 밀리면 데이터에 구멍이 생기지 않나요?
밀린 오래된 작업은 폐기하되, 다음 정상 실행이 지난 수집 시점부터 이번까지의 범위를 통째로 담당하므로 그 사이 새 글은 함께 걷힙니다. 시간 범위 기준으로 수집하기 때문에 한두 번 실행이 밀려도 빈 구간이 남지 않습니다.
이 스케줄 설계가 속한 전체 시스템은 법률 상담 게시판 통합 수집 자동화에서 볼 수 있습니다.