넓은 지역의 업체를 훑는 수집은 짧게 끝나지 않습니다. 도시 하나를 촘촘히 나눠 칸마다 조회하다 보면 몇 시간이 우습게 지나갑니다. 그 긴 시간 동안 한 번도 멈추지 않기를 기대할 수는 없습니다. 컴퓨터를 꺼야 할 수도, 네트워크가 끊길 수도, 프로그램을 실수로 닫을 수도 있습니다. 지도 업체 수집 도구를 만들며 가장 신경 쓴 부분 중 하나가, 이렇게 멈춰도 처음부터 다시 하지 않게 만드는 것이었습니다.
진행 상태를 통째로 저장한다
이어받기의 핵심은 무엇을 저장하느냐입니다. 단순히 결과 CSV만 남겨서는 부족합니다. 다시 켰을 때 어느 칸까지 훑었고 어느 칸이 남았는지, 붐벼서 다시 쪼갠 칸은 어디였는지를 알아야 중단 지점부터 정확히 이어갈 수 있습니다. 그래서 체크포인트에는 아직 처리할 칸의 목록, 이미 끝낸 칸, 재시도 한도를 넘겨 실패로 격리한 칸, 그리고 지금까지 만난 업체의 고유 식별자 전부를 담습니다. 진행 상태를 통째로 얼려 둡니다.
이 체크포인트는 수집 도중 주기적으로 자동 저장됩니다. 사용자가 저장을 누를 필요가 없고 갑자기 전원이 나가도 마지막 저장 시점까지는 안전하게 남습니다. 다시 프로그램을 켜면 저장된 지역과 키워드를 확인한 뒤 그 상태를 그대로 복원해 남은 칸부터 다시 워커에게 나눠 줍니다. 사용자 입장에서는 이전 작업 이어받기 버튼 한 번이면 끝입니다.
쓰다가 죽어도 파일이 깨지지 않게
자동 저장에는 함정이 하나 있습니다. 파일을 쓰는 도중에 프로그램이 멈추면 어떻게 될까요. 절반만 쓰인 체크포인트 파일이 남으면, 다음에 켰을 때 그 깨진 파일을 읽다 실패해 이어받기 자체가 불가능해집니다. 이어받으려고 만든 장치가 오히려 이어받기를 막는 셈입니다.
그래서 저장을 원자적으로 처리합니다. 기존 파일을 바로 덮어쓰지 않고 먼저 임시 파일에 상태를 온전히 다 쓴 뒤 그 임시 파일을 원래 이름으로 바꿔치기합니다. 이름을 바꾸는 동작은 중간이 없는 한 번의 연산이라, 어느 순간에 멈추더라도 파일은 옛 상태이거나 새 상태이지 절반짜리가 될 수 없습니다. 덕분에 저장하던 바로 그 순간 전원이 나가도 직전 체크포인트는 멀쩡히 남습니다. 이어받기를 믿을 수 있으려면 저장 자체가 절대 깨지지 않아야 합니다.
같은 업체를 한 번만 남긴다
이어받기와 짝을 이루는 것이 중복 제거입니다. 지역을 칸으로 나눠 훑으면 경계에 걸친 업체가 인접한 두 칸에 모두 잡히고 붐벼서 쪼갠 조각들 사이에서도 같은 업체가 겹칩니다. 이걸 그대로 두면 결과에 같은 가게가 여러 번 나옵니다. 그래서 업체마다 붙는 고유 식별자를 열쇠로, 이미 만난 업체는 다시 담지 않습니다. 여러 워커가 동시에 결과를 쏟아 내도 하나의 공유된 기록에 안전하게 모아 한 번만 통과시킵니다.
이 중복 제거 기록이 바로 체크포인트에 함께 저장되는 식별자 목록입니다. 그래서 이어받을 때도 중복 방지가 끊기지 않습니다. 다시 켠 뒤 예전에 이미 담았던 업체가 남은 칸에서 또 나와도, 복원된 식별자 목록이 그것을 걸러 냅니다. 중단과 재개를 몇 번 반복해도 최종 CSV에는 각 업체가 정확히 한 번씩만 남습니다. 이어받기와 중복 제거가 같은 기록을 공유하기에 가능한 일입니다.
이 위에서 도는 칸 분할은 적응형 그리드 수집에서, 상대 서버를 존중하며 오래 버티는 운영은 크롤링 예절과 안정성에서 다룹니다. 전체 시스템은 지도 업체 정보 수집 자동화 사례에 있습니다.
자주 묻는 질문
결과 CSV만 저장하면 이어받을 수 없나요?
CSV에는 어느 칸을 훑었고 어느 칸이 남았는지가 없어서 이어받기에는 부족합니다. 남은 칸, 끝낸 칸, 다시 쪼갠 칸, 이미 만난 업체 식별자까지 함께 저장해야 중단 지점부터 정확히 이어갈 수 있습니다.
저장하는 도중에 멈추면 파일이 깨지지 않나요?
깨지지 않도록 임시 파일에 다 쓴 뒤 원래 이름으로 바꿔치기하는 원자적 방식을 씁니다. 이름 바꾸기는 중간 상태가 없는 연산이라, 어느 순간에 멈춰도 파일은 옛 상태이거나 새 상태로 온전히 남고 절반짜리가 되지 않습니다.
중단과 재개를 반복해도 중복이 안 생기나요?
이미 만난 업체의 고유 식별자 목록이 체크포인트에 함께 저장되어 복원되므로, 재개 후 같은 업체가 다시 나와도 걸러집니다. 몇 번을 멈췄다 이어가도 최종 결과에는 각 업체가 한 번씩만 남습니다.