본문 바로가기
개발/프로젝트-식당 웨이팅 앱 FOOD LINE

230530 실전프로젝트5 [Node.js/Nest.js 공공 data와 카카오맵API 연동하기]

by 코딩하는짱구 2023. 5. 30.
반응형

✅오늘학습 Keyword

공공 api에서 PostgreSQL에 저장한 db를 카카오맵 api와 연동하는 작업을 진행했다. 

 

 

✅local data와 카카오맵API 연동하기 - 겪은 문제

1. 대용량 data 저장 문제

CSV파일의 공공data를 PostgreSQL에 다운로드 받는 과정에서 70만 건 정도에서 서버가 끊기는 현상이 일어났다. 

또한 저장한 음식점들에 카카오맵api를 통해 좌표를 부여하는 작업에서, 쿼터 문제가 발생했다.

https://developers.kakao.com/docs/latest/ko/quota/common

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

간단히 말하면 카카오 API에는 쿼터(Quota, 사용량제한)가 정해져있어서 제한건수 이상으로는 데이터 수집이 어렵다는 것. 이 문제는 AWS RDS에 계정을 하나 만들어서 팀원들과 API Key를 돌아가며 정보를 수집하기로 했다. 

 

 

2. 카카오맵api와 PostgreSQL data 연결

진짜 도대체 어떻게 해야하나..아무리 살펴봐도 감이 안잡혔지만 일단 아래와 같이 접근해봤다. 

 

  • 좌표요청->카카오맵api가 음식점 카테고리의 검색결과를 찾아옴->음식점 결과와 local data의 좌표를 비교함-> 좌표정보가 일치하는 data를 반환함

 

이렇게 되면 좌표를 입력해서 '검색'하는 시스템은 만들 수 있을 것 같았지만, 현재 사용자의 위치를 기반으로 주변 식당정보를 불러오기엔  html 즉 front 없이 서버에서만 구현하기가 너무 복잡했다. 결국 팀원과 논의하여 react를 직접 만져서 구현하기로 결론을 냈다. 

 

해결방법: react에서 '사용자 위치 이용 권한 허용'을 통해 좌표를 전달받고, 그 좌표를 기준하여 반경 1km 내에 있는 식당을 조회하기로 했다. 우선 임의의 좌표와 그 좌표 1km내에 있는 임의의 식당을 PostgreSQL에 추가하여 진행하기로했다. 

 

 

그리고 입력받은 좌표를 이용해서 data를 조회한다. 

 

stores.service.ts

  //사용자 위치 기반 반경 1km내의 식당 조회
  async findRestaurantsWithinRadius(
    southWestLatitude: number,
    southWestLongitude: number,
    northEastLatitude: number,
    northEastLongitude: number,
  ): Promise<{ 근처식당목록: Stores[] }> {
    const restaurants = await this.storesRepository.findAll();
    const restaurantsWithinRadius = restaurants.filter((restaurant) => {
      const withinLatitudeRange =
        restaurant.La >= southWestLatitude &&
        restaurant.La <= northEastLatitude;
      const withinLongitudeRange =
        restaurant.Ma >= southWestLongitude &&
        restaurant.Ma <= northEastLongitude;
      return withinLatitudeRange && withinLongitudeRange;
    });
    return { 근처식당목록: restaurantsWithinRadius };
  }

 

stores.repository.ts

  //사용자 위치 기반 반경 1km내의 식당 조회를 위해 전체 데이터와 비교
  async findAll(): Promise<Stores[]> {
    return this.find();
  }

 

stores.controller.ts

  //사용자 위치 기반 반경 1km내의 식당 조회
  //localhost:3000/places/within-radius?latitudeSW=37.74812040537091&longitudeSW=126.7688923363321&latitudeNE=37.74970428169939&longitudeNE=126.77258647785946
  @Public()
  @Get('/within-radius')
  findRestaurantsWithinRadius(
    @Query('latitudeSW') latitudeSW: number,
    @Query('longitudeSW') longitudeSW: number,
    @Query('latitudeNE') latitudeNE: number,
    @Query('longitudeNE') longitudeNE: number,
  ): Promise<{ 근처식당목록: Stores[] }> {
    return this.storesService.findRestaurantsWithinRadius(
      latitudeSW,
      longitudeSW,
      latitudeNE,
      longitudeNE,
    );
  }

 

user좌표를 통해 근처 식당 조회 성공!

 

✅오늘 알게된 점 및 추후 학습계획

원하는 정보만 효율적으로 출력하는 법, 그리고 리뷰와 평점을 대용량 data에 등록하며 handling 하는 기능을 구현할 예정이다. 

 

**postgresql사용하며 꼭 알아둬야할 query문 

SELECT *
FROM public.stores
WHERE "La" = 0 AND "Ma" = 0
ORDER BY "storeId" ASC;
//경도 위도가 0인것만 검색할 때 query문


SELECT *
FROM public.stores
WHERE "storeName" = '맛집';
//문자열 검색할 때는 작은 따옴표

 

**git stash 삭제 관련명령어

git stash drop. - 가장 최근에 만든 stash 삭제
git stash drop stash@{0} - 특정 stash id 삭제(git stash list 치면 나오는 id)
git stash clear. - 모든 stash를 삭제

반응형