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

230613 실전프로젝트13 [GPS 기반 데이터 조회 속도개선!★]

by 코딩하는짱구 2023. 6. 14.
반응형

✅오늘학습 Keyword

거리계산 함수를 이용하여 user의 위치를 기반으로 식당 목록을 조회, 출력해주는 과정에서 시간이 너무 오래 걸렸다. 

나와 우리 팀은 GeoRedis, ElasticSearch, PostGis 세 가지의 방법을 연구,조사하여 gps 서비스를 제공해보기로 했다. 

 

✅오늘 겪은 문제

Postgis에러 

 

문제 1. 

location을 indexing 할 파일은 어떻게 어디에 만들어야 하는가?

처음엔 postgresql에서 따로 indexing 할 table을 만들었고 테이블의 컬럼은 storeId, coordinates, address로 설정했다. 

하지만 굳이 table을 분리할 필요가 없겠다는 생각이 들었고, stores테이블 안에 coordintaes 컬럼을 추가해서 진행하기로했다. 

 

문제 2.  

접근 방식에 대해 고민해보고 구글링해봤고 구현 단계는 정리하면 아래와 같았다.

  1. postgis extension 설치 : CREATE EXTENSION postgis
  2. Geometry 컬럼 추가 : ALTER TABLE stores ADD COLUMN coordinates geometry(Point, 4326)
  3. 좌표 데이터 입력 : La, Ma 좌표를 이용하여 Geometry 컬럼에 좌표 데이터 입력
  4. UPDATE stores SET coordinates = ST_SetSRID(ST_MakePoint(Ma, La), 4326)
  5. 공간 인덱스 생성: CREATE INDEX idx_coordinates ON stores USING GIST(coordinates)

여기서 1,2,3,4번까지도 잘 입력했는데, 문제가 발생했다. 

나는 nest.js에서 migration 을 이용하지 않고 postgresql에 직접 column을 추가해서 진행했는데, 

좌표가 잘 들어가다가 중간에 geo column이 자동으로 삭제되버리는 현상이 반복됐다.

좌표를 받아야할 column이 사라지니 서버도 끊기고 아래와 같은 에러 메세지를 출력함. 

[Nest] 24192  - 2023. 06. 14. 오후 4:26:27   ERROR [ExceptionsHandler] column Stores.coordinates does not exist
QueryFailedError: column Stores.coordinates does not exist
    at QueryFailedError.TypeORMError [as constructor] (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\실전프로젝트\matwaiting\backend\backend-1\src\error\TypeORMError.ts:7:9)
    at new QueryFailedError (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\실전프로젝트\matwaiting\backend\backend-1\src\error\QueryFailedError.ts:9:9)
    at PostgresQueryRunner.<anonymous> (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\실전프로젝트\matwaiting\backend\backend-1\src\driver\postgres\PostgresQueryRunner.ts:263:19)
    at step (C:\Users\cryst\OneDrive\바탕 화면\sparta\NODE JS\주특기주차\실전프로젝트\matwaiting\backend\backend-1\node_modules\tslib\tslib.js:193:27)
[오후 4:28:12] File change detected. Starting incremental compilation...

[오후 4:28:12] Found 0 errors. Watching for file changes.

 

아마도 컬럼 옆에 있는 자물쇠 모양이 권한의 문제가 아닐까 싶어 찾아봤는데 해당 컬럼에 대한

권한을 수정하거나 보완할 방법은 찾지 못했다. 

 

이런 에러가 일어나는 데에는 마이그레이션 문제, 데이터베이스 설정, 코드 변경 등의 원인이 있을 수 있다고 하는데, 

내 생각엔 높은 확율로 마이그레이션 문제인 것 같다..

현재 프로젝트 코드의 typeorm.config에는 nest.js 마이그레이션 설정이 되어있지 않아서 수정할 예정이다. 

 

 

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

1. 팀원도 유사한 문제를 겪었고 그로 인해 postgis 적용에 실패했다고 한다. 

데이터베이스 마이그레이션 파일을 생성, 파일 안에서 stores테이블의 coordinates 컬럼을 추가하는 코드를 작성하고

마이그레이션을 실행해서 데이터베이스의 스키마를 변경하면 정상 작동하지 않을까 싶다. 

-- 테이블 목록 조회
SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

-- -- 인덱스 목록 조회
-- SELECT indexname FROM pg_indexes WHERE tablename = 'stores';

coordinates 컬럼은 geometry 형식입니다. 
따라서 해당 값은 지오메트리 형식인 
POINT(127.149038057796 37.4424960470608)로 표현됩니다.

https://velog.io/tags/postgis

 

#postgis - velog

[Django] Django로 지도 만들기 Maps with Django (2): GeoDjango, PostGIS, Leaflet를 참고해서 작성된 게시글이다. 위에 블로그에너무 정리가 잘 되어 있어서 그저 잘 따라하기만 하면 지도를 만들어 낼수 있었다

velog.io

 

 

2. postgis 에러와는 별개로 우리 팀은 geo redis, elastic search로 위치기반 식당 목록 조회의 성능을

대폭 개선했다! 아래는 비교 수치이다. 

 

반응형