반응형
지금처럼 “강남구 하나만”은 간단히 API 돌리면 되지만, 서울시 25개 구 전체를 실서비스 수준으로 커버하려면 조금 전략적으로 접근해야 합니다.
🚨 카카오 API의 구조적 한계
- 한 번 요청으로 size ≤ 15
- page ≤ 45
- 즉, 최대 15 × 45 = 675개
- **정렬 기준 변경(accuracy vs distance)**은 결과 순서만 바뀌고 총량 제한은 그대로
👉 즉, 구 단위 좌표 1개만 주면 많은 카페가 누락될 수밖에 없습니다.
✅ 실서비스처럼 최대한 많이 모으는 전략
1. 좌표 분할 (Grid Search / 격자 검색)
- 각 구를 중심좌표 하나로만 돌리지 말고 → 구역을 여러 개 격자로 나눠서 검색
- 예: 강남구 → 북쪽/중앙/남쪽 3개 좌표 잡고 각 2km 반경
- 이렇게 하면 675개 제한을 여러 번 돌려 합칠 수 있음
- 중복 데이터는 DB 저장 시 id(카카오 place_id)나 place_url로 제거
2. 행정구역 폴리곤 활용
- 서울시 행정구별 경계 좌표(GeoJSON) 데이터를 구해서, 각 구를 일정한 grid 좌표로 나눔
- 구마다 9~16개 중심점 생성 → API 호출 → 합치기
- (서울 열린데이터광장 등에서 GeoJSON 제공)
3. 좌표 중심 검색 + 카테고리 검색 혼합
- 지금은 category_group_code=CE7 (카페)만 쓰고 있는데,
- 특정 키워드(“카페”, “커피”, “브런치”) 검색도 병행하면 놓치는 업장 보완 가능
4. 데이터 적재 (DB)
- MySQL/Postgres 테이블에 INSERT할 때 PRIMARY KEY를 카카오 id(또는 place_url)로 설정
- ON DUPLICATE KEY UPDATE 전략으로 중복 제거 → 최신화 유지
- 이렇게 하면 격자 검색으로 중복된 카페가 들어와도 DB는 “한 번만” 저장
5. 자동 업데이트
- 크롤러를 정기 실행 (예: 2주마다 cron job)
- 새로 추가된 카페는 DB에 추가, 사라진 카페는 status=deleted 플래그로 표시
- 서비스에선 항상 최신 DB를 읽어서 제공
📊 아키텍처 예시
- Python 크롤러 (requests) → 카카오 API 호출 (격자 단위)
- 데이터 가공 (중복 제거, 필드 정리)
- DB 저장 (MySQL/Postgres)
- cafes (기본 정보)
- cafe_images (이미지 URL, 추후 크롤링/업로드)
- cafe_reviews (후기 요약, 별도 수집 로직)
- 백엔드 API (Spring/Python FastAPI) → DB 조회/관리
- 서비스 프론트엔드 → 지도 + 카페 정보 표시
🚀 현실적으로 가장 좋은 방법
- 카카오 API만 쓰되, 서울시 각 구를 격자 분할해서 호출 + DB deduplication
- 정기적으로 스케줄링해서 최신 데이터 유지
- (추가) 부족하면 네이버 플레이스/구글맵 크롤링으로 보강 가능
👉 정리:
서울시 전체 카페 데이터를 실서비스 수준으로 모으려면,
- 좌표 분할(grid 방식)으로 카카오 API를 여러 번 호출하고
- DB에서 deduplication 처리
- 정기 업데이트(cron job)
이 3단계를 구현해야 합니다.
'2025 > [풀스택]SeSAC 웹개발자 7기' 카테고리의 다른 글
| ✅ DTO란? (0) | 2025.10.09 |
|---|---|
| [b1a4 팀프로젝트 TIL] 251001수(6) 배느실 (0) | 2025.10.01 |
| API 기반 크롤링? (0) | 2025.10.01 |
| python 크롤링? (1) | 2025.10.01 |
| 관리자만 접근 가능한 인가 설정하기 (0) | 2025.09.26 |