필요할 때마다 api 호출? or DB에 직접 저장?
이번에 참여하게 된 프로젝트의 주요 기능 중 하나는 나의 맛집 리스트에 특정 음식점을 추가하고 리뷰도 작성할 수 있어야 한다는 것이었다.
이러한 기능을 구현하기 위해서는 자체 DB에 음식점 목록을 모두 저장할 필요가 있다고 판단했다.
어떤 open api?
음식점 데이터를 자체 DB에 저장하기 위해 가장 처음으로 고려한 open api는 카카오에서 제공하는 지도 api였다.
공식문서가 잘 정리되어 있었고, 검색어 자동완성 기능을 구현하기 위해 사용할 수 있는 키워드로 장소 검색이 가능한 api도 있었다.
또한 프로젝트 기획 당시 필요하다고 판단했던 현 위치를 기반으로 검색 반경을 제한하는 기능 또한 자체적으로 포함하고 있었기 때문에 최적의 open api라고 판단했다.
실제로도 의도대로 잘 동작하는지 확인하기 위해 간단하게 api를 한번 호출해서 응답을 출력해보았고, 결과는 만족스럽게도 목표했던 서울시의 음식점 정보가 잘 출력되었다.
이 카카오 api 하나만으로 자체 DB에 서울시 음식점 정보 저장과 자동완성 기능을 쉽게 구현할 수 있겠다는 들뜬 마음으로 이번에는 서울시 전체 음식점 정보를 모두 불러오는 코드를 작성해서 테스트를 해보았다.

위의 코드는 카카오 지도 api 공식 문서를 바탕으로 응답의 메타데이터 중 현재 페이지가 마지막 페이지인지 여부를 판단하는 변수를 활용하여 마지막 페이지가 될때까지 페이지번호를 증가시키며 서울시 전체 음식점 정보를 받아오도록 작성했다.
테스트 결과는 예상과 너무나도 달랐다. 전체 음식점 정보가 출력될 것을 예상한 것과 달리, 아래와 같이 한 페이지에 15개씩 3페이지의 총 45개의 음식점 정보만 출력되었다.

처음에는 코드를 잘못 작성했나? 라는 생각으로 코드를 찬찬히 봤지만 문제가 될 만한 부분은 없었고, 공식문서와 관련 내용을 검색하는 도중 충격적인 내용을 발견했다.

처음에 공식문서를 보며 응답에 대한 meta data 부분에서 pageable_count의 값이 최대 45라는 것을 보며 단순히 한 페이지에 45개까지 보여주나 보다 하고 넘어갔었는데 알고보니 같은 api 요청에 대해 total_count가 훨씬 크더라도 최대 45개의 응답만 보여준다는 의미였다...!!
이러한 사실에 나와 팀원은 크게 당혹감을 느꼈다. 해당 api를 사용해서 서울시의 전체 음식점 정보를 저장하려면, 128600 / 45 = 약 3000개의 각 응답이 겹치지 않는 키워드나 주소 등을 활용하여 api를 호출해야 했다.
이 방식은 많은 시간과 노력이 투자되어야 하고 비효율적이며 음식점이 새로 생기거나 없어지는 경우에 대해 유연한 대처가 너무 어렵기 때문에 현실적으로 불가능하다고 생각했고, 다른 api를 모색해보기로 결정했다.
그 다음으로 시도한 것은 네이버의 지도 api였는데 결과는 카카오 api와 마찬가지로 같은 api 요청에 대한 응답수가 제한되어 있었고 서울시 전체 음식점 정보를 저장하는 방법에 대해 깊은 고민에 빠졌다.
결론은 서울시 Open API !!!
프로젝트의 주요 기능을 구현하기 위해 자체 DB에 음식점 정보 저장은 필수적이였기 때문에 조금 어렵고 비효율적일지라도 약 3000번의 서로 다른 api 호출을 통해 저장을 해야 하나 고민하던 중, 과거 전공 수업에서 공공데이터를 활용했던 경험이 떠올랐고 공공데이터 포털과 서울시 open api를 찾아보았다.
해당 사이트들에서 우리 프로젝트에서 필요한 정보를 모두 제공하는 api를 찾아다녔고, 서울시 open api에서 제공하는 "서울시 일반음식점 인허가 정보"를 활용할 수 있겠다는 결론에 도달했다.

해당 api는 현재 영업이 종료된 음식점을 포함하여 전체 약 60만개의 데이터를 json형태로 다운로드 받을 수도 있었고, 한번의 api 호출에 1000개씩 약 600번의 pagination을 통한 호출로 전체 음식점 정보를 모두 받아올 수 있었다.
결국 자체 DB에 서울시 전체 음식점 정보 저장을 위해서 "서울시 일반음식점 인허가 정보" api를 이용하기로 결정했다. 자동완성 기능도 구현해야 했기 때문에 이 경우에는 카카오 지도 api를 사용할까 했지만 호출 횟수가 제한된 탓에 자동완성을 위해 매번 호출하는 것은 무리가 있다고 판단했고 결국 자체 DB에 저장된 음식점 목록을 조회하여 자동완성 기능을 제공하기로 결정했다.
이어서 다음 글에서는 "서울시 일반음식점 인허가 정보" api를 사용하는 과정에서 겪었던 문제와 이를 해결했던 과정에 대해 작성해보고자 한다.