[당근 마켓 클론] 지역 정보와 DB 선택

hclee·2021년 1월 6일
4
post-thumbnail

ERD 링크

https://www.erdcloud.com/d/2mDmcrHWY3CqW4Rrp

지난 글에서 작성된 구현 기능 목록을 바탕으로 데이터 모델링을 수행했다.

데이터 모델링에 대한 이야기는 특별히 할게 없지만 이런 저런 삽질하면서 발견한 정보들을 공유한다.

행정동 지역 경계, 중심 좌표 정보

유저들과 중고 물품들을 구분하기 위한 지역 정보가 필요하다.
통계청 데이터 대신 미리 변환해 놓은 것이 있어서 사용했다.

행정동 정보 출처 : https://github.com/vuski/admdongkor

  • 통계청 통계지리정보서비스에서 제공하는 행정동 경계 파일을 바탕으로 작성
  • 좌표계 EPSG:4326 기준으로 작성된 지역 경계 정보를 geojson로 제공
  • 좌표계 EPSG:4326 기준으로 작성된 지역 중심 좌표를 csv로 제공

공간 데이터를 관리하기 위한 RDBMS 선택

결론만 먼저 말하면 Postgresql + PostGIS 플러그인을 사용한다.

특정 지역 범위를 계산하는 ST_Buffer와 교차 지역들을 계산하는 ST_Intersects를 MySQL8에서 사용하기가 영 불편하기 때문이다.

그 이유는 다음과 같다.

  • ST_Buffer가 4326 좌표계를 지원하지 않음
  • ST_Buffer 호출 결과를 ST_Intersects가 사용하기 위해서 변환 함수를 여러번 호출해야 됨
  • ST_Buffer 전달 인자의 범위 값에 대한 단위를 알 수 없음

특정 범위와 교차되는 지역들을 구하는 쿼리를 비교해보면 Postgresql의 쿼리가 더 짧고 범위에 대한 설정 값(미터 단위)이 직관적이다.

// In MySQL8 
SELECT
    *
FROM
    "행정동 테이블"
WHERE
    ST_Intersects("행정동 지역 경계값", ST_GeomFromText(ST_AsText(ST_Buffer(ST_GeomFromText(ST_AsText(ST_GeomFromText('POINT(129.075041 35.179768)', 4326))), 0.005)), 4326)); // 0.005 ??
// In Postgresql
SELECT
    *
FROM
    "행정동 테이블" 
WHERE
    ST_Intersects("행정동 지역 경계값", ST_Buffer(ST_GeomFromText('POINT(129.075041 35.179768)', 4326)::geography, 500)::geometry); // 500 미터

Mikro-ORM

그동안 typeorm을 써왔는데 mikro-orm이라는 것을 발견했다.

knex.js 쿼리 빌더를 기반으로 작성된 ORM 패키지인데

typeorm보다 인기가 적지만 성능이 좋은것 같아서 써보기로 한다.

0개의 댓글