반응형
MySQL의 GIS 기능은 좌표 기반 서비스를 개발할 때 강력한 도구다.
하지만 공식 문서만 보고는 실무에 바로 적용하기 어렵다.
이 글에서는 실제로 자주 쓰이는 공간 쿼리 예제를 정리했다.
POINT 기반 매장 검색, 반경 검색, 경계 포함 여부 판단 등 다양한 상황에 대응할 수 있다.

📍 1. 특정 위치에 가장 가까운 매장 찾기
SELECT name,
ST_Distance_Sphere(location, ST_GeomFromText('POINT(126.98 37.56)', 4326)) AS distance_m
FROM stores
ORDER BY distance_m
LIMIT 1;
✅ 특정 위치에서 가장 가까운 매장을 찾는 실무에서 자주 사용됨
✅ ST_Distance_Sphere는 결과를 미터 단위로 반환
반응형
📍 2. 반경 1km 이내 매장 검색
SELECT name
FROM stores
WHERE ST_Distance_Sphere(location, ST_GeomFromText('POINT(126.98 37.56)', 4326)) < 1000;
✅ 배달 가능 범위, 주변 탐색 등에서 필수
✅ 거리 단위는 미터 기준 (1000m = 1km)
📍 3. 특정 영역(POLYGON) 안에 있는 매장 찾기
SELECT name
FROM stores
WHERE ST_Contains(
ST_GeomFromText('POLYGON((126.97 37.56, 126.99 37.56, 126.99 37.58, 126.97 37.58, 126.97 37.56))', 4326),
location
);
✅ 행정 구역 또는 특정 지역 범위 내 매장 필터링
📍 4. 두 위치 간 거리 계산
SELECT ST_Distance_Sphere(
ST_GeomFromText('POINT(126.9784 37.5665)', 4326),
ST_GeomFromText('POINT(126.9820 37.5700)', 4326)
) AS distance_m;
✅ 지도상 두 지점 간 거리 출력 (결과는 미터 단위)
📍 5. 좌표에서 위도, 경도 분리 추출
SELECT name,
ST_X(location) AS longitude,
ST_Y(location) AS latitude
FROM stores;
✅ 좌표를 분리해서 가공하거나 API에 전달할 때 유용
반응형
📍 6. 다각형(POLYGON) 외부 좌표 필터링
SELECT name
FROM stores
WHERE NOT ST_Contains(
ST_GeomFromText('POLYGON((126.97 37.56, 126.99 37.56, 126.99 37.58, 126.97 37.58, 126.97 37.56))', 4326),
location
);
✅ 특정 지역을 제외한 외곽 매장 찾기
📍 7. 두 POLYGON이 겹치는지 확인
SELECT ST_Intersects(
ST_GeomFromText('POLYGON((126.97 37.56, 126.98 37.56, 126.98 37.57, 126.97 37.57, 126.97 37.56))', 4326),
ST_GeomFromText('POLYGON((126.975 37.565, 126.985 37.565, 126.985 37.575, 126.975 37.575, 126.975 37.565))', 4326)
) AS is_overlap;
✅ 구역 간 충돌 검증, 서비스 범위 중첩 확인 등에 사용됨
📍 8. 라인과 점이 교차하는지 확인 (ex: 도로와 지점 교차 여부)
SELECT ST_Intersects(
ST_GeomFromText('LINESTRING(126.97 37.56, 126.99 37.58)', 4326),
ST_GeomFromText('POINT(126.98 37.57)', 4326)
) AS is_cross;
✅ 특정 위치가 도로 경로에 포함되는지 판단할 때 유용
📍 실무 팁 정리
- 검색 범위가 넓을수록 ST_Distance_Sphere 보다는 사전 필터 + 거리 계산 조합이 성능에 유리하다
- 다량의 좌표 데이터를 조회할 땐 SPATIAL INDEX 필수
- SRID를 정확히 지정하지 않으면 공간 연산이 실패하거나 성능이 저하됨
- 좌표값은 항상 경도(가로), 위도(세로) 순서로 작성할 것
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/gis-function-reference.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] (연결최적화4️⃣) 트랜잭션 전파 방식과 커넥션 이슈 분석 (0) | 2025.07.18 |
|---|---|
| [MySQL] (연결최적화3️⃣) 커넥션 타임아웃 설정과 오류 해결법 (0) | 2025.07.18 |
| [MySQL] (연결최적화2️⃣) 커넥션 풀의 개념과 실무 설정 가이드 (0) | 2025.07.18 |
| [MySQL] (연결최적화1️⃣) JDBC 드라이버 설정 핵심 옵션 정리 (0) | 2025.07.18 |
| [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 |