이번에 운이 좋게도 지원을 했던 회사에서 나에게 과제 테스트를 내주었다.
좌표 데이터(GeoJson)를 이용해서 데이터를 관리하는 서버를 구축하는 내용이었다.
신기하게도 지금 사이드 프로젝트로 GPS 데이터를 이용하기 위해 공부하고 있었는데
마침 이런 좋은 기회가 생겨 재밌게? 과제를 수행하면서 열심히 공부했던 적이 있어서 해당 내용들을 적어본다.
데이터 타입

총 7가지의 데이터 타입을 지원하는데,
여기서 Point(점), LineString(선), Polygon(면) 이 단일 타입이고 나머지는 이들을 조합했다고 보면 된다.
1. POINT (점)
- 단일 지점(좌표) 하나를 나타낸다.
- (X, Y) 즉 (위도, 경도) 의 한 쌍으로 구성되어 있다.
- 현재 나의 위치, 맛집 가게 위치 등
2. LINESTRING (선)
- 두 개 이상의 점을 연결하여 만든 선분이다. 즉 점과 점을 직선으로 연결한 경로이다.
- 최소 2개 이상의 점(Point) 으로 구성되어 있다.
- 도로 데이터, 마라톤 코스 등
3. POLYGON (면)
- 시작점과 끝점이 같은 선들로 둘러싸인 닫혀 있는 영역이다.
- 다수의 선분(LineString)으로 구성되어 있다.
- 반드시 시작점과 끝점이 일치한다. 즉 삼각형의 폴리곤 형태라면 총 4개의 점으로 이루어져 있다.
- 배달 가능 지역, 아파트 단지 등
GeoJson
위치 정보를 담은 JSON 형식의 표준 데이터 규격이라고 한다.
우리가 흔히 [위도, 경도]의 순서가 아니라, [경도, 위도] 순서로 작성되어 있다.
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [127.0276, 37.4979]
},
"properties": {
"name": "강남역 맛집",
}
}
- type: 객체의 성격을 나타낸다. 하나의 지점은 Feature, 여러 지점은 FeatureCollection이라고 표시된다.
- geometry: 실제 공간 정보가 담기는 핵심 부분입니다.
- type: Point, LineString, Polygon 등이다.
- coordinates: 좌표 값. [경도, 위도] 순서로 되어 있다.
- properties: 해당 장소에 대한 일반적인 속성(이름, 설명 등)을 나타낸다.
아래는 Polygon 형태의 GeoJson 예시 이다.
{
"type": "Feature",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[127.02, 37.49],
[127.05, 37.49],
[127.05, 37.51],
[127.02, 37.51],
[127.02, 37.49]
]
]
},
"properties": {
"area_name": "강남역 주변 핵심 상권",
}
}
- coordinates 를 잘 보면 [] 괄호가 3개나 있다.
- 첫 번째 괄호: Polygon은 배열이다.
- 두 번째 괄호: 면의 겉 테두리를 의미한다. 외곽선이다.
- 세 번째 괄호: 실제 좌표값들이다.
- 만약 폴리곤 안에 '구멍(Hole)'이 있다면, 두 번째 괄호 안에 또 다른 배열이 추가될 것이다.
- 잘 보면 첫번째 좌표와 마지막 좌표의 값이 동일하다.
과제 요구사항에서
마커는 POINT로 등록하고, 폴리곤형태의 geojson 파일을 이용해서 해당 면적 내의 마커들을 조회하라는 내용이 있었다.
이를 수행하기 위해서 MySQL의 공간 함수를 사용해야 했다.
사용했던 몇가지 함수들을 정리해본다.
ST_GeomFromText
Point 데이터를 등록하기 위해 이 함수를 사용한다.
WKT의 문자열을 읽어서(FromText) 공간 데이터 객체(Geometry)로 만드는 것이다.
WKT(Well-Known Text)
공간 데이터를 문자열 형태로 표현하는 규격이다.
즉, 사람이 읽을 수 있도록 공간 데이터를 나타내는 문자열이다.
ST_GeomFromText('POINT(${lng} ${lat})', 4326) 이런식으로 쿼리를 작성했었다.
여기서 WKT는 'POINT(경도 위도)' 부분이다.
중요한건, 좌표 사이에 쉼표(,) 가 없다.
이 POINT 문자열을 테이블에 넣기위해 객체로 만드는 작업인 것이다.
POINT 객체를 등록하면 테이블이 아래와 같이 나오게 된다.

ST_AsText
위에서 삽입한 공간 데이터를 표시하기 위해 사용되는 함수이다.
BLOB으로 보이던 것들이 POINT(127.0276 37.4979) 이런식으로 보이게 된다.
ST_AsGeoJSON
공간 데이터를 바로 GeoJSON 형태로 표시해준다.

ST_X ST_Y
X축(가로축, 경도) 값 또는 Y축(세로축, 위도) 값을 추출하는 것이다.
잠깐! 왜 경도=X축=가로축 일까...?
지구본을 보면 세로선이 경도, 가로선이 위도라고 배운다.
하지만 이 경도를 움직인다면 선들이 x축방향으로 이동한다. 즉 값은 좌우로 변한다.
이와 마찬가지로 위도도 위아래로 움직이기에 y축으로 이동한다는 것이다.
ST_X, ST_Y는 위/경도에만 쓰이는 것이 아니라 일반적인 2차원에서도 사용되는 함수다.
ST_CONTAINS
ST_CONTAINS(A, B) 이런식으로 사용한다.
즉, A가 Polygon 형태고, B가 POINT라면 A영역안에 B가 있는지? 라는 뜻이다.
이를 이용해 영역 안에 여러 마커들이 들어 있는지 빠르게 탐색할 수 있다.\\
이 밖에도 굉장히 많은 공간 함수들이 있다.
아래 MySQL 공식 사이트에서 확인해 볼 수 있으니 시간이 나면 하나씩 살펴 봐야겠다.
MySQL :: MySQL 5.7 Reference Manual :: 12.16.1 Spatial Function Reference
12.16.1 Spatial Function Reference The following table lists each spatial function and provides a short description of each one. Table 12.21 Spatial Functions Name Description Deprecated Area() Return Polygon or MultiPolygon area Yes AsBinary(), AsWKB()
dev.mysql.com
과제를 수행하고 제출하면서 잘했나? 라는 후회나 찝찝함은 없었다.
실제로 직접 서버를 구축하면서 좌표 데이터를 백엔드에서 어떻게 다루는지 알게 되었고,
이 분야에 대해 조금 더 지식을 쌓을 수 있었다는 것에 너무 좋은 경험이었다.
예전에 수행했던 프로젝트에서 건물들의 좌표 데이터들을 테이블에 등록해서 마커를 찍어 주는 기능이 있었는데,
이 때는 DEMICAL을 이용해서 위도와 경도를 따로 컬럼을 만들어 주었던 기억이 있다.
만약 건물들과의 거리, 어떤 면적 내의 건물들을 조회 같은 기능이 있었더라면 geometry 타입을 이용했었어야 했군...
이라는 생각이 든다,,.
'dev > db' 카테고리의 다른 글
| MySQL - View (0) | 2026.04.20 |
|---|---|
| LATERAL JOIN (0) | 2026.04.03 |
| mariadb - Access denied for user 'wlrn566'@'localhost' (using password: YES)" (0) | 2023.07.24 |
| mariaDB - 컬럼 insert, update 시간 (0) | 2023.07.22 |
| MySQL Workbench 테이블 생성 (0) | 2023.04.08 |