지도에서 한 지역의 업체를 전부 모으려 할 때 부딪히는 첫 벽은 개수 제한입니다. 넓은 범위를 한 번에 조회하면 스무 개 남짓에서 결과가 잘립니다. 예전에는 이걸 키워드로 뚫었습니다. 주소를 잘게 쪼개고 한식, 중식, 양식 같은 업종을 잔뜩 붙여 수백 개의 조합을 만들어 하나씩 돌리는 식입니다. 그렇게 해도 누락은 남고 결과를 합치고 중복을 지우는 일이 또 생깁니다. 해외 업체 리스트를 모으던 한 사업자의 수집 도구를 만들며 이 문제를 적응형 그리드로 풀었습니다.
화면을 좁히면 결과가 담긴다
발상의 전환은 단순합니다. 한 화면에 담기는 결과 수가 정해져 있다면, 화면을 좁히면 됩니다. 넓은 지역을 한 번에 조회해 스무 개만 건지는 대신, 지역을 작은 칸으로 나눠 칸마다 조회하면 각 칸의 업체는 대부분 담깁니다. 도심의 한 블록만 떼어 보면 그 안의 식당은 스무 개 아래로 내려오는 경우가 많고 그러면 잘림 없이 전부 읽힙니다. 넓게 훑어 잘리던 것을 좁게 여러 번 훑어 메우는 것입니다.
문제는 칸을 얼마나 잘게 나누느냐입니다. 모든 칸을 똑같은 크기로 나누면 곤란해집니다. 도심 한 칸에는 식당이 수백 개라 여전히 잘리고 외곽 한 칸에는 몇 개뿐이라 대부분의 조회가 빈손으로 돌아옵니다. 지역마다 업체 밀도가 천차만별인데 격자를 일률적으로 그으면 붐비는 곳은 여전히 누락되고 한산한 곳은 헛돕니다. 밀도를 미리 알 수 없다는 것이 핵심 난점입니다.
붐비는 칸만 다시 쪼갠다
그래서 격자를 고정하지 않고 결과를 보고 적응시킵니다. 처음에는 지역의 경계 상자를 적당한 크기의 칸으로 나눠 하나씩 조회합니다. 한 칸의 결과가 기준치를 넘으면 아직 다 담지 못한 것으로 보고 그 칸만 네 개로 다시 쪼개 큐에 되돌립니다. 쪼갠 조각이 또 붐비면 다시 넷으로 쪼갭니다. 반대로 결과가 기준치 아래인 칸은 그 칸을 다 훑은 것으로 보고 거기서 멈춥니다. 이렇게 하면 붐비는 도심은 저절로 더 잘게 나뉘고 한산한 외곽은 성기게 남습니다.
이 구조는 사각형을 넷으로 나누는 일을 반복한다는 점에서 쿼드트리와 같습니다. 다만 무한정 쪼갤 수는 없으니 최소 칸 크기를 두어 그보다 작아지면 붐벼도 멈춥니다. 지나친 세분화로 같은 곳을 계속 조회하는 낭비를 막는 안전장치입니다. 결과적으로 조회 횟수는 업체가 실제로 밀집한 만큼만 늘어나고 빈 지역에 헛도는 조회는 최소가 됩니다. 개수 제한을 억지로 우회하지 않고도 구역 전체를 성실하게 덮는 방법입니다.
어디부터 훑을지도 설계의 일부다
칸을 만드는 순서에도 신경을 썼습니다. 경계 상자를 격자로 나누면 가장자리 칸에는 인접한 다른 지역이 섞여 들어오기 쉽습니다. 그래서 전체 영역의 중심에 가까운 칸부터 큐에 넣어 사용자가 지정한 지역의 핵심부터 채워지도록 했습니다. 시작하자마자 옆 동네 결과가 먼저 쌓이는 체감을 줄이는 작은 배려입니다.
칸을 조회할 때 지도 화면의 확대 수준도 칸 크기에 맞춰 계산합니다. 작은 칸은 더 확대해서 봐야 그 안의 업체가 촘촘히 뜨고 큰 칸은 덜 확대해야 범위가 담깁니다. 칸의 위경도 폭에서 적절한 확대 수준을 역산하되, 로컬 업체 검색이 잘 뜨는 구간으로 하한과 상한을 잡아 두었습니다. 이렇게 칸의 크기, 확대 수준, 분할 조건이 함께 맞물려야 넓은 지역을 빈틈없이 훑는 그리드가 완성됩니다.
이 그리드로 모은 결과는 곧바로 가상 스크롤 목록 파싱과 중복 제거 설계를 거칩니다. 이 방식이 왜 공식 API보다 넓은 그물이 되는지는 공식 지도 API의 한계에서 이어집니다. 전체 시스템은 지도 업체 정보 수집 자동화 사례에서 볼 수 있습니다.
자주 묻는 질문
왜 격자를 고정하지 않고 적응시키나요?
지역마다 업체 밀도가 크게 다르기 때문입니다. 고정 격자로 나누면 붐비는 도심은 여전히 결과가 잘려 누락되고 한산한 외곽은 빈 조회만 반복합니다. 결과가 기준치를 넘는 칸만 다시 쪼개면 필요한 곳에만 조회를 집중해 누락을 메우면서 헛도는 조회를 줄일 수 있습니다.
칸을 무한히 쪼개면 되지 않나요?
무한히 쪼개면 같은 좁은 구역을 반복 조회하는 낭비가 생기고 상대 서버 부담도 커집니다. 그래서 최소 칸 크기를 두어 그보다 작아지면 붐벼도 멈춥니다. 대부분의 밀집 지역은 그 한계 안에서 충분히 잘게 나뉘어 담깁니다.
결과 개수 제한을 우회하는 건가요?
우회가 아닙니다. 제한을 뚫는 게 아니라 각 조회 화면이 제한 아래로 내려올 만큼 지역을 좁히는 방식입니다. 사람이 지도를 확대해 좁은 동네를 하나씩 둘러보는 것과 같은 접근이라, 공개된 검색 결과를 성실한 범위로 열람해 모읍니다.