MySQL에서도 위치 정보, 거리 계산, 지도 기반 검색 같은 지리정보(GIS: Geographic Information System) 기능을 지원한다.
그 핵심은 바로 공간 데이터 타입이다. 이번 글에선 GIS 기능을 이해하는 데 꼭 필요한 공간 타입들을 정리하고, 기본적인 구조를 알아보겠다.

🌍 GIS란 무엇인가?
GIS는 지리적 객체를 DB에서 표현하고 다루는 기술이다.
좌표, 거리, 경로, 면적, 포함관계 등을 SQL로 처리할 수 있다.
MySQL은 GIS를 지원하며 대표적인 기능은 다음과 같다:
- 위치 좌표 저장
- 거리 계산
- 지역 포함 여부 판단
- 반경 검색 (예: 2km 이내 매장 찾기)
- 공간 인덱스를 통한 검색 최적화
MySQL 5.7부터 GIS 함수들이 많이 향상되었고, MySQL 8.0 이상에서는 더 강력한 성능을 발휘한다.
📌 MySQL이 지원하는 주요 공간 데이터 타입
🔹 POINT
- 하나의 좌표(x, y)를 저장하는 타입
- 주로 위도/경도 표현에 사용
CREATE TABLE locations (
name VARCHAR(100),
pos POINT,
SPATIAL INDEX(pos)
);
INSERT INTO locations (name, pos)
VALUES ('카페A', ST_GeomFromText('POINT(126.9784 37.5665)'));
✅ 위 예제는 경도 126.9784, 위도 37.5665 좌표를 저장한 것
🔹 LINESTRING
- 두 개 이상의 점을 이은 선을 표현
- 경로, 도로 정보 등에 활용
ST_GeomFromText('LINESTRING(126.9784 37.5665, 126.9820 37.5700)')
✅ 도보 경로나 이동 경로를 표현할 때 유용
🔹 POLYGON
- 닫힌 도형을 표현하는 타입
- 지역 범위(예: 행정구역, 마커 영역 등)를 나타낼 수 있음
ST_GeomFromText('POLYGON((126.97 37.56, 126.98 37.56, 126.98 37.57, 126.97 37.57, 126.97 37.56))')
✅ 처음과 마지막 좌표가 같아야 하고, 시계방향으로 좌표 나열
🔹 MULTIPOINT, MULTILINESTRING, MULTIPOLYGON
- 각각 POINT, LINESTRING, POLYGON의 다중 버전
- 여러 개의 공간 객체를 하나로 묶어서 저장
예:
ST_GeomFromText('MULTIPOINT((126.97 37.56), (126.98 37.57))')
📌 공간 좌표계(SRID)
SRID(Spatial Reference System Identifier)는 좌표계 정의를 의미한다.
기본값은 SRID = 0으로 Cartesian 평면 좌표계다.
지리 좌표계(WGS 84)를 사용할 경우 SRID = 4326을 사용한다.
SELECT ST_SRID(ST_GeomFromText('POINT(126.9784 37.5665)', 4326));
✅ 실무에선 대부분 SRID 4326 (위도/경도 사용)
🧠 GIS 타입 저장 시 주의사항
- 공간 컬럼은 반드시 SPATIAL INDEX를 설정해야 검색 최적화 가능
- 공간 연산을 위해선 ST_함수 사용 권장 (예: ST_Contains, ST_Distance 등)
- 공간 데이터 삽입 시 반드시 ST_GeomFromText() 또는 ST_GeomFromGeoJSON() 사용
- GEOMETRY 타입은 모든 공간 타입을 포괄할 수 있는 상위 개념
✅ 정리 요약
| 타입 | 설명 |
| POINT | 위도/경도 좌표 1개 |
| LINESTRING | 선(경로) |
| POLYGON | 다각형(지역 범위) |
| MULTI* | 여러 공간 객체 묶음 |
| GEOMETRY | 상위 추상 타입 (POINT, POLYGON 등 포함) |
GIS를 활용하면 MySQL에서도 지도 기반 서비스, 반경 검색, 공간 분석 등을 효과적으로 구현할 수 있다.
다음 글부터는 실제 공간 쿼리 작성과 거리 계산, 포함관계 검색 등을 실습해본다.
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html
'DB' 카테고리의 다른 글
| [MySQL] (GIS5️⃣) ST_Distance로 거리 계산하는 방법과 주의사항 (0) | 2025.07.18 |
|---|---|
| [MySQL] (GIS4️⃣) 공간 인덱스의 원리와 설정 방법 (1) | 2025.07.18 |
| [MySQL] (GIS3️⃣) POLYGON과 공간 포함관계 쿼리 실습 (4) | 2025.07.18 |
| [MySQL] (GIS2️⃣) 공간 데이터 저장 및 조회 실습: POINT, LINESTRING 활용법 (1) | 2025.07.18 |
| [MySQL] (JSON6️⃣) 실무에서 JSON 타입을 쓸 때 주의할 점 (4) | 2025.07.17 |
| [MySQL] (JSON5️⃣) JSON 쿼리 성능 튜닝 전략: 인덱싱과 최적화 팁 (0) | 2025.07.17 |
| [MySQL] (JSON4️⃣) WHERE 절에서 JSON 조건 처리하는 방법 (0) | 2025.07.17 |
| [MySQL] (JSON3️⃣) JSON_EXTRACT, JSON_UNQUOTE, JSON_CONTAINS 파헤치기 (0) | 2025.07.17 |