✅오늘학습 Keyword
공공 api에서 PostgreSQL에 저장한 db를 카카오맵 api와 연동하는 작업을 진행했다.
✅local data와 카카오맵API 연동하기 - 겪은 문제
1. 대용량 data 저장 문제
CSV파일의 공공data를 PostgreSQL에 다운로드 받는 과정에서 70만 건 정도에서 서버가 끊기는 현상이 일어났다.
또한 저장한 음식점들에 카카오맵api를 통해 좌표를 부여하는 작업에서, 쿼터 문제가 발생했다.
https://developers.kakao.com/docs/latest/ko/quota/common
간단히 말하면 카카오 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,
);
}
✅오늘 알게된 점 및 추후 학습계획
원하는 정보만 효율적으로 출력하는 법, 그리고 리뷰와 평점을 대용량 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를 삭제
'개발 > 프로젝트-식당 웨이팅 앱 FOOD LINE' 카테고리의 다른 글
230602 실전프로젝트7 [Node.js/Nest.js_sort별 목록조회, 에러] (0) | 2023.06.03 |
---|---|
230601 실전프로젝트6 [Node.js/Nest.js 공공 data저장, 좌표주입하기] (0) | 2023.06.01 |
230526 실전프로젝트4 [Node.js/Nest.js 와 카카오맵API 연동하기] (0) | 2023.05.26 |
230525 실전프로젝트3 [Node.js/Nest.js 환경 구축하기 2] (0) | 2023.05.25 |
230520 실전프로젝트2 [Node.js/Nest.js 환경 구축하기 1] (0) | 2023.05.20 |