ServBay에서 PostGIS 사용하기: PostgreSQL에 공간 기능 추가
PostGIS
는 PostgreSQL 데이터베이스에 공간 데이터 타입, 함수, 인덱스 지원을 추가하는 강력한 확장 프로그램입니다. 이를 통해 데이터베이스에 점, 선, 폴리곤 등 다양한 지리 정보를 저장하고, 복잡한 공간 쿼리 및 분석 작업을 수행할 수 있습니다. 지도, 위치 서비스, 공간 웹 애플리케이션이 필요한 개발자에게 PostGIS는 필수 도구입니다.
macOS용 로컬 웹 개발 환경인 ServBay는 PostgreSQL 패키지를 기본 포함하고 있으며, PostGIS 확장도 기본으로 번들되어 있습니다. 덕분에 번거로운 컴파일이나 별도의 종속성 설치 없이도 로컬에서 PostGIS를 손쉽게 사용할 수 있습니다.
이 문서에서는 ServBay 환경에서 PostGIS 확장을 활성화하고 실전에서 사용하는 방법을 상세하게 안내합니다. 본문을 따라 하면서 여러분의 프로젝트에 공간 데이터 기능을 빠르게 추가해보세요.
사전 준비 사항
PostGIS를 사용하기 전에 아래 사항을 완료하셨는지 확인하세요.
- ServBay 설치 및 실행: macOS에 ServBay를 성공적으로 설치하세요.
- PostgreSQL 패키지 활성화 및 실행: ServBay 컨트롤 패널에서 PostgreSQL 패키지가 활성화되고 실행 중인지 확인합니다. 아직 활성화하지 않았다면, 컨트롤 패널에서 PostgreSQL을 선택해 활성화 후 실행하세요.
- PostgreSQL 데이터베이스 접속: 커맨드라인 도구(
psql
) 혹은 TablePlus, pgAdmin 같은 GUI 클라이언트로 ServBay 환경에 구축된 PostgreSQL에 접속할 수 있어야 합니다. 기본적으로psql -U postgres
명령어로 로컬 데이터베이스에 접속할 수 있습니다.
PostGIS 확장 설치 및 활성화
ServBay는 PostGIS 확장 파일을 이미 포함하고 있으므로, 별도 다운로드가 필요 없습니다. 원하는 데이터베이스에서 PostGIS 확장만 활성화하면 됩니다.
아래는 PostGIS를 활성화하는 단계입니다.
대상 PostgreSQL 데이터베이스에 접속: 터미널 앱을 열고,
psql
명령어로 데이터베이스에 접속하세요.your_username
을 실제 DB 계정명(예:postgres
)으로,your_database
를 확장을 활성화할 데이터베이스명으로 바꿔 입력합니다.bashpsql -U your_username -d your_database
1만약 기본
postgres
계정 및 데이터베이스 내에서 활성화한다면 아래처럼 입력합니다.bashpsql -U postgres
1데이터베이스에 PostGIS 확장 생성: 접속에 성공했다면,
psql
프롬프트에서 아래 SQL 명령을 실행하세요.sqlCREATE EXTENSION postgis;
1이 명령은 해당 데이터베이스에 PostGIS가 제공하는 데이터 타입, 함수, 연산자 등 필요한 객체들을 모두 설치 및 설정합니다.
PostGIS 설치 확인:
psql
에서 다음 명령으로 현재 데이터베이스에 설치된 확장 목록을 조회할 수 있습니다.sql\dx
1PostGIS가 제대로 활성화됐다면, 아래와 같이
postgis
항목과 버전 정보를 볼 수 있습니다.List of installed extensions Name | Version | Schema | Description -----------+---------+------------+-------------------------------------------------------------- plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language postgis | 3.3.2 | public | PostGIS geometry and geography spatial types and functions (2 rows)
1
2
3
4
5
6(참고: PostGIS 버전은 ServBay 버전에 따라 달라질 수 있습니다.)
이제 지정한 PostgreSQL 데이터베이스에 PostGIS 확장이 정상적으로 활성화되었습니다. 공간 데이터 기능을 자유롭게 사용할 수 있습니다.
PostGIS 데이터 구성하기
PostGIS를 활성화하면, 공간 데이터 컬럼이 포함된 새로운 테이블을 만들거나, 기존 테이블에 공간 컬럼을 추가할 수 있습니다. PostGIS는 geometry
와 geography
라는 두 가지 주요 공간 데이터 타입을 제공합니다.geometry
는 평면 좌표계 계산용, geography
는 지구 표면(위/경도) 기반 계산용으로, 보통 위도/경도 데이터를 다룰 때 더 적합합니다.
공간 컬럼이 포함된 테이블 생성
아래는 locations
라는 테이블을 만들어 점 타입의 공간 위치를 저장하는 컬럼을 추가하는 예시입니다.
테이블 생성: Database에 접속 후
psql
이나 GUI 클라이언트에서 다음 SQL을 실행하세요.sqlCREATE TABLE locations ( id SERIAL PRIMARY KEY, name VARCHAR(100), geom GEOMETRY(Point, 4326) );
1
2
3
4
5GEOMETRY(Point, 4326)
:geom
컬럼을GEOMETRY
타입(점 타입)으로 정의, SRID 4326은 GPS 및 온라인 지도(OpenStreetMap, Google Maps 등)에서 사용하는 표준 위경도 좌표계입니다.- 필요에 따라
LineString
,Polygon
,MultiPoint
등 다양한 지오메트리 타입과 SRID를 사용할 수 있습니다.
예시 데이터 삽입: PostGIS의 공간 객체 생성 함수로 데이터를 추가합니다.
ST_GeomFromText()
는 WKT(Well-Known Text) 문자열로부터 공간 객체를 생성할 때 사용합니다.sqlINSERT INTO locations (name, geom) VALUES ('ServBay Headquarters', ST_GeomFromText('POINT(116.4074 39.9042)', 4326)), -- 베이징 위치 예시 ('ServBay Shanghai Office', ST_GeomFromText('POINT(121.4737 31.2304)', 4326)); -- 상하이 위치 예시
1
2
3참고:
POINT(경도 위도)
순서는 WKT 표준을 따릅니다.
공간 인덱스 생성
많은 공간 데이터를 보유할수록 인덱스는 쿼리 성능에 필수입니다. 범위, 포함, 최근접 질의에 특히 효과적입니다. PostGIS에선 GiST(Generalized Search Tree) 인덱스를 가장 널리 사용합니다.
GiST 인덱스 생성: 아래 SQL을 실행하세요.
sqlCREATE INDEX idx_locations_geom ON locations USING GIST (geom);
1이 명령은
locations
테이블의geom
컬럼에 GiST 인덱스를 생성합니다. PostgreSQL은 공간 관련 쿼리에서 이 인덱스를 자동 사용해 성능을 높여줍니다.
PostGIS로 공간 쿼리 수행하기
PostGIS는 매우 다양한 공간 연산 함수를 제공합니다. 아래는 웹 개발 시 자주 사용하는 몇 가지 공간 쿼리 예시입니다.
두 지점 간 거리 계산
두 위치 간 직선 거리 구하기:
sql
SELECT ST_Distance(
ST_GeomFromText('POINT(116.4074 39.9042)', 4326), -- A 지점
ST_GeomFromText('POINT(121.4737 31.2304)', 4326) -- B 지점
);
1
2
3
4
2
3
4
ST_Distance()
: 두 공간 객체 간의 거리를 계산합니다. SRID 4326 등 지리좌표계geometry
타입에는 결과 단위가 '도'입니다. 미터 단위의 정밀한 거리가 필요하다면geography
타입 혹은ST_Distance(geography_a, geography_b, use_spheroid)
사용을 권장합니다.
포함관계 질의
특정 다각형 영역에 점이 포함되는지 체크하기:
sql
SELECT name FROM locations
WHERE ST_Contains(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326), -- 사각형 예시
geom
);
1
2
3
4
5
2
3
4
5
ST_Contains(geometry A, geometry B)
: A가 완전히 B를 포함하면 true를 반환합니다.
최근접 위치 찾기
특정 위치와 가장 가까운 장소를 찾기(GiST 인덱스 활용):
sql
SELECT name, ST_Distance(geom, ST_GeomFromText('POINT(116.4074 39.9042)', 4326)) AS distance
FROM locations
ORDER BY geom <-> ST_GeomFromText('POINT(116.4074 39.9042)', 4326) -- <-> 연산자: GiST 인덱스 이용
LIMIT 5;
1
2
3
4
2
3
4
<->
연산자는 PostGIS에서 GiST 인덱스와 결합해 지정 점에 가장 가까운 대상을 아주 빠르게 찾아주는 특수 연산자입니다.
PostGIS로 공간 분석하기
PostGIS는 단순 쿼리를 넘어, 버퍼 생성, 교차 및 합집합 등 다양한 공간 분석 기능도 지원합니다.
버퍼(buffer) 분석
지정 공간 객체 주위에 일정 거리의 버퍼(다각형 영역) 생성:
sql
SELECT ST_Buffer(geom, 0.01) -- 도 단위 버퍼(0.01도 ≈ 1.1km)
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
2
3
ST_Buffer(geometry, distance)
: 지정 거리(좌표계 단위)에 버퍼를 생성합니다.
교집합(intersection) 분석
여러 공간 객체의 중첩 영역 계산해 새 객체 반환:
sql
SELECT ST_Intersection(
ST_GeomFromText('POLYGON((116.0 39.0, 117.0 39.0, 117.0 40.0, 116.0 40.0, 116.0 39.0))', 4326),
geom
)
FROM locations
WHERE name = 'ServBay Headquarters';
1
2
3
4
5
6
2
3
4
5
6
ST_Intersection(geometry A, geometry B)
: 두 객체의 교집합 부분을 새 공간 객체로 반환합니다.
합집합(union) 분석
여러 공간 객체를 하나의 객체로 합치기:
sql
SELECT ST_Union(geom)
FROM locations;
1
2
2
ST_Union(geometry set)
: 입력된 모든 공간 객체를 하나로 결합합니다.
공간 데이터 시각화
PostGIS에 저장된 공간 데이터를 실제로 시각화하는 일은 웹 개발에서 매우 중요합니다. 데스크톱 GIS 프로그램이나 웹 지도 라이브러리를 활용할 수 있습니다.
데스크톱 GIS 툴(QGIS) 사용
QGIS는 오픈소스 GIS 소프트웨어로, PostGIS 데이터베이스에 직접 연결하여 공간 데이터를 시각화할 수 있습니다.
ServBay의 PostgreSQL 데이터베이스 연결:
- QGIS 실행
- 메뉴에서
Layer
(레이어) ->Add Layer
(레이어 추가) ->Add PostGIS Layers...
(PostGIS 레이어 추가..) 선택 - 팝업 창에서
New
(새로 만들기) 클릭해 연결 정보 입력:- Name (이름): 예를 들어
ServBay PostGIS
- Host (호스트):
localhost
또는127.0.0.1
- Port (포트): 기본
5432
(ServBay 역시 동일) - Database (데이터베이스): PostGIS를 활성화한 DB명
- Username (사용자명): DB 계정(예:
postgres
) - Password (비밀번호): 비밀번호(설정한 경우)
- Name (이름): 예를 들어
Test Connection
(연결 테스트) 버튼으로 정상 연결 확인 후,OK
클릭- 메인 창에서
Connect
(연결) 클릭해 접속
공간 데이터 불러오기:
- DB 접속에 성공하면 모든 테이블이 나옵니다.
- 공간 컬럼이 포함된 테이블(
locations
등)을 선택, QGIS에서 자동 인식합니다. - 원하는 테이블을 체크하고
Add
(추가) 클릭 후Close
(닫기) 누르면, 공간 데이터가 QGIS 맵 뷰에 나타납니다.
웹 지도 라이브러리(Leaflet 등) 사용
Leaflet, OpenLayers, Mapbox GL JS와 같은 JS 지도 라이브러리를 활용해, 백엔드에서 PostGIS 공간 데이터를 받아 웹 페이지에 지도 형태로 표시할 수 있습니다.
아래는 Leaflet의 기본 예시입니다. 실제로는 ServBay에서 PHP, Node.js, Python 등의 백엔드를 통해 PostGIS 데이터를 GeoJSON 등으로 변환, 프론트엔드로 반환하는 작업이 필요합니다.
아래 HTML 파일을 ServBay 사이트 루트(/Applications/ServBay/www
) 하위에 저장하고, 예를 들어 /Applications/ServBay/www/postgis-map/index.html
에 두었다면postgis-map.servbay.demo
등 ServBay 로컬 사이트 주소로 접속하여 확인할 수 있습니다.
html
<!DOCTYPE html>
<html>
<head>
<title>ServBay PostGIS Leaflet Example</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet/dist/leaflet.css" />
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
<style>
#map { height: 400px; width: 100%; } /* 지도 컨테이너 크기 지정 */
</style>
</head>
<body>
<h1>PostGIS 데이터 시각화 예제 (Leaflet)</h1>
<div id="map"></div>
<script>
// 지도 초기화, 중심점과 확대레벨 지정
// 베이징(北京) 근처를 예시 중심점으로 설정
var map = L.map('map').setView([39.9042, 116.4074], 10);
// OpenStreetMap 레이어 추가
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// 예시: 마커 직접 추가 (실전에서는 PostGIS 데이터로 동적 생성)
// 이 위치는 위에서 삽입한 'ServBay Headquarters' 위치와 동일
var marker = L.marker([39.9042, 116.4074]).addTo(map)
.bindPopup('<b>ServBay Headquarters</b><br>예시 위치')
.openPopup();
// 실제 개발에서는 Ajax 등을 통해 PostGIS 데이터를(보통 GeoJSON 포맷) 받아 지도에 표시합니다.
/*
fetch('/api/locations') // 백엔드가 /api/locations으로 GeoJSON 제공 가정
.then(response => response.json())
.then(data => {
L.geoJSON(data).addTo(map);
});
*/
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
위 예시는 Leaflet의 기본적 사용법을 보여주며, 실제로 PostGIS에서 데이터를 불러오려면 백엔드에서 데이터베이스와 연결, 공간 쿼리, GeoJSON 변환, HTTP API 구현 과정이 필요합니다.
ServBay는 다양한 백엔드 언어와의 통합에 유리하므로, 공간 시각화 API 구축이 쉽습니다.
자주 묻는 질문 (FAQ)
Q:
CREATE EXTENSION postgis;
실행 시 오류가 발생합니다. 해결 방법은?- A: 우선 정상적으로 PostgreSQL 데이터베이스에 연결되어 있는지, 그리고 DB 계정에 확장 생성 권한(주로
postgres
계정에 있음)이 있는지 확인하세요. 또한 ServBay에서 PostgreSQL 패키지가 실행 중인지 점검하세요. 문제가 계속된다면 ServBay/ PostgreSQL 로그 파일을 확인하면 원인 파악에 도움이 됩니다.
- A: 우선 정상적으로 PostgreSQL 데이터베이스에 연결되어 있는지, 그리고 DB 계정에 확장 생성 권한(주로
Q: SRID 4326이 무엇인가요? 다른 SRID를 써도 되나요?
- A: SRID(Spatial Reference Identifier)는 좌표계의 고유 번호입니다. 4326은 GPS/웹 지도에서 가장 많이 쓰는 WGS84 위경도 좌표계입니다. 물론 다른 SRID(예: Web Mercator 3857 등)도 사용할 수 있습니다. 적절한 SRID 선택은 데이터 원본과 목표 환경(웹 지도면 4326 또는 3857 추천)에 따라 달라집니다.
Q:
geometry
타입과geography
타입의 차이점은?- A:
geometry
는 평면(유클리드 공간) 좌표 기준, 거리/면적도 평면 공식으로 계산합니다.geography
는 타원체상 곡면(지구 표면) 위, 위경도 기반이므로 거리/면적이 훨씬 정확합니다.
소규모 영역 또는 곡률 무시가 가능하다면geometry
가 더 단순하고 빠르며, 대륙/세계 범위의 정밀 공간 연산에는geography
를 권장합니다.
- A:
마무리
PostGIS는 PostgreSQL 데이터베이스에 강력한 공간 데이터 처리 능력을 부여해줍니다. ServBay를 이용하면 macOS 로컬 환경에서 간편하게 PostGIS를 설정, 활용할 수 있어 복잡한 설치 없이 바로 개발에 집중할 수 있습니다.
이 글에서는 ServBay에서 PostGIS 확장 활성화, 공간 데이터 테이블 및 컬럼 생성, 주요 공간 쿼리와 분석 실습, 시각화 방법까지 핵심 내용을 아울렀습니다.
이제 PostGIS의 다양한 기능을 활용해, ServBay로 공간 기반의 풍부한 웹 애플리케이션을 개발해보세요.
더 많은 함수와 고급 기능은 공식 PostGIS 문서를 참고해 직접 탐구해보시기를 추천합니다.