๋ฐ์ํ

1. PostGIS๋ ๋ฌด์์ธ๊ฐ?
- PostGIS๋ ์คํ์์ค ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ PostgreSQL์์ ๊ณต๊ฐ ๋ฐ์ดํฐ(Spatial Data)๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํ๋ ํ์ฅ ๊ธฐ๋ฅ์ด๋ค.
- PostgreSQL์ ๋จ์ํ ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ ๋์ด, ์์น์ ํํ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ๊ฐ๋ ฅํ ๊ณต๊ฐ ์ ๋ณด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ํ์ฅ์ํจ๋ค.
์ฃผ์ ๊ธฐ๋ฅ ๋ฐ ํน์ง
| ๊ตฌ๋ถ | ์ค๋ช | ๋ํ์ ์ธ ์ |
| ๊ณต๊ฐ ๋ฐ์ดํฐ ํ์ | ์์น์ ํํ๋ฅผ ์ ์ํ๋ OGC ํ์ค ๋ฐ์ดํฐ ํ์ ์ ์ ๊ณตํ๋ค. ํ๋ฉด(Cartesian) ์ขํ๊ณ(GEOMETRY)์ ๊ตฌ๋ฉด(Spherical) ์ขํ๊ณ(GEOGRAPHY)๋ฅผ ๋ชจ๋ ์ง์ํ๋ค. | POINT (์ ), LINESTRING (์ ), POLYGON (๋ฉด) MULTIPOLYGON (์ฌ๋ฌ ๋ฉด์ ์งํฉ) ๋ฑ |
| ๊ณต๊ฐ ์ธ๋ฑ์ค | ๋์ฉ๋ ๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ๊ธฐ ์ํ ๊ณ ์ฑ๋ฅ ์ธ๋ฑ์ค ๊ตฌ์กฐ๋ฅผ ์ง์ํ๋ค. R-Tree ๊ธฐ๋ฐ์ GiST ์ธ๋ฑ์ค๊ฐ ๋ํ์ ์ด๋ค. | ํน์ ์ง์ ์ฃผ๋ณ ๊ฒ์, ํน์ ์์ญ ๋ด ๊ฐ์ฒด ๊ฒ์ ๋ฑ์์ ํ ์ด๋ธ ํ ์ค์บ์ ๋ฐฉ์งํ๊ณ ์ฟผ๋ฆฌ ์๋๋ฅผ ์๋ฐฑ ๋ฐฐ ์ด์ ํฅ์์ํจ๋ค. |
| ๊ณต๊ฐ ์ฒ๋ฆฌ ํจ์ | ๊ณต๊ฐ ๋ฐ์ดํฐ ๊ฐ์ ๊ด๊ณ ๋ถ์, ๊ฑฐ๋ฆฌ ๊ณ์ฐ, ํํ ๋ณํ ๋ฑ 500๊ฐ ์ด์์ ํ๋ถํ ๋ด์ฅ ํจ์๋ฅผ ์ ๊ณตํ๋ค. | ST_Distance (๊ฑฐ๋ฆฌ ๊ณ์ฐ), ST_Contains (ํฌํจ ๊ด๊ณ ํ์ธ), ST_Intersects (๊ต์ฐจ ๊ด๊ณ ํ์ธ), ST_DWithin (๋ฐ๊ฒฝ ๋ด ๊ฒ์) ๋ฑ |
2. ์ปค๋จธ์ค(E-commerce) ์๋น์ค์์์ ํ์ฉ ์ฌ๋ก
- PostGIS๋ ๋ฌผ๋ฅ, ๋ฐฐ๋ฌ ๋ฑ ์์น ๊ธฐ๋ฐ ์๋น์ค๊ฐ ๊ฒฐํฉ๋ ํ๋ ์ปค๋จธ์ค ํ๊ฒฝ์์ ์๋น์ค ๊ฒฝ์๋ ฅ์ ๋์ด๋ ํต์ฌ ๊ธฐ์ ๋ก ์ฌ์ฉ๋๋ค.
์ฌ๋ก 1: ๋ฐฐ์ก ๊ฐ๋ฅ ์ง์ญ ์กฐํ
- ๋ฌธ์ ์ํฉ
- ๊ณ ๊ฐ์ ์ฃผ์์ง๊ฐ ์๋น์ค์ ‘์๋ฒฝ ๋ฐฐ์ก‘, ‘๋น์ผ ๋ฐฐ์ก’ ๋ฑ ํน์ ๋ฐฐ์ก ์ ์ฑ ์ ๋์ ์ง์ญ์ธ์ง ์ค์๊ฐ์ผ๋ก ํ๋ณํด์ผ ํ๋ค.
- PostGIS
- ํด๊ฒฐ ๋ฐฐ์ก ๊ฐ๋ฅ ๊ถ์ญ์ POLYGON ๋๋ MULTIPOLYGON ๋ฐ์ดํฐ๋ก ์ ์ฅํ๋ค.
- ๊ณ ๊ฐ ์ฃผ์๋ฅผ ์ง์ค์ฝ๋ฉํ์ฌ POINT ์ขํ๋ก ๋ณํํ๋ค.
- ST_Contains ํจ์๋ฅผ ์ฌ์ฉํด ๊ณ ๊ฐ์ ์ขํ๊ฐ ๋ฐฐ์ก ๊ถ์ญ ๋ด์ ํฌํจ๋๋์ง ๋น ๋ฅด๊ฒ ํ์ธํ๋ค.
์ฟผ๋ฆฌ ์์:
-- ์ฌ์ฉ์์ ์ขํ(POINT)๊ฐ ‘์๋ฒฝ๋ฐฐ์ก_์๋๊ถ’ ๊ถ์ญ(POLYGON)์ ํฌํจ๋๋์ง ํ์ธ
SELECT zone_name FROM delivery_zones
WHERE zone_name = ‘์๋ฒฝ๋ฐฐ์ก_์๋๊ถ’
AND ST_Contains(geom, ST_SetSRID(ST_MakePoint(127.027, 37.497), 4326));
์ฌ๋ก 2: ์ฃผ๋ณ ๋งค์ฅ/ํฝ์ ์ฅ์ ์ฐพ๊ธฐ
- ๋ฌธ์ ์ํฉ
- ๊ณ ๊ฐ์ ํ์ฌ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ๋งค์ฅ N๊ณณ์ ์ฐพ์์ฃผ๊ฑฐ๋, ์จ๋ผ์ธ ์ฃผ๋ฌธ ํ ํฝ์ ๊ฐ๋ฅํ ์ฃผ๋ณ ์ฅ์๋ฅผ ์๋ดํด์ผ ํ๋ค.
- PostGIS
- ์ ๊ตญ ๋งค์ฅ์ ์์น๋ฅผ POINT๋ก ์ ์ฅํ๊ณ GiST ๊ณต๊ฐ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๋ค.
- ๊ณ ๊ฐ ์์น(POINT)์ ๋งค์ฅ ์์น ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ K-NN(K-Nearest Neighbor) ํ์์ ์ต์ ํ๋ <-> ์ฐ์ฐ์๋ก ์ ๋ ฌํ์ฌ ์์ N๊ฐ๋ฅผ ์กฐํํ๋ค.
์ฟผ๋ฆฌ ์์:
-- ์ฌ์ฉ์ ์์น(๊ฒฝ๋, ์๋)์์ ๊ฐ์ฅ ๊ฐ๊น์ด ๋งค์ฅ 5๊ณณ ๊ฒ์
SELECT id, store_name, address FROM stores
-- GiST ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ๋ ๊ฑฐ๋ฆฌ ์ ๋ ฌ ์ฐ์ฐ์
ORDER BY geom <-> ST_SetSRID(ST_MakePoint(127.105, 37.514), 4326)
LIMIT 5;
์ฌ๋ก 3: ์ง์ญ ๊ธฐ๋ฐ ํ๊ฒ ๋ง์ผํ
- ๋ฌธ์ ์ํฉ
- ‘๊ฐ๋จ์ ’ ๋ฐ๊ฒฝ 2km ๋ด์ ์๋ ํ์ฑ ์ฌ์ฉ์์๊ฒ๋ง ํน๋ณ ํ ์ธ ์ฟ ํฐ ํธ์ ์๋ฆผ์ ๋ฐ์กํ๋ ๋ฑ ํ๊ฒ ๋ง์ผํ ์ ์ํํด์ผ ํ๋ค.
- PostGIS
- ์ฌ์ฉ์์ ๋ง์ง๋ง ์ ์ ์์น ๋๋ ์ฃผ์ ์ ๋ณด๋ฅผ POINT ๋ฐ์ดํฐ๋ก ๊ด๋ฆฌํ๋ค.
- ST_DWithin ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ง์ (๊ฐ๋จ์ )์ผ๋ก๋ถํฐ ์ผ์ ๊ฑฐ๋ฆฌ(2km) ๋ด์ ์๋ ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ์ธ๋ฑ์ค๋ฅผ ํตํด ํจ์จ์ ์ผ๋ก ์ ๋ณํ๋ค.
์ฟผ๋ฆฌ ์์:
-- ๊ฐ๋จ์ ์ขํ๋ก๋ถํฐ 2km ๋ฐ๊ฒฝ ๋ด์ ์๋ ๋ชจ๋ ์ฌ์ฉ์ ID ์กฐํ
-- (ํ์
์ผ๋ก geography๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฏธํฐ(m) ๋จ์๋ก ์ ํํ ๊ณ์ฐ ๊ฐ๋ฅ)
SELECT user_id FROM users
WHERE ST_DWithin(
user_location_geog, -- ์ฌ์ฉ์ ์์น (geography ํ์
)
‘SRID=4326;POINT(127.027 37.497)‘::geography, -- ๊ฐ๋จ์ ์์น (geography ํ์
)
2000 -- ๊ฑฐ๋ฆฌ (๋จ์: ๋ฏธํฐ)
);
3. AWS RDS for PostgreSQL ์ค์น ๊ฐ์ด๋
- PostGIS ์ค์น๋ RDS ์ธ์คํด์ค๊ฐ ์๋, ์ฐ๊ฒฐ๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ๋ณ์ ์ผ๋ก ํ์ฅ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ ๊ณผ์ ์ด๋ค.
์ค์น ์ ์ฐจ
Step 1: ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์
PostGIS๋ฅผ ์ค์นํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ psql์ด๋ DataGrip ๋ฑ์ ํด๋ผ์ด์ธํธ๋ก ์ ์ํ๋ค.
Step 2: ํ์ฅ ๊ธฐ๋ฅ(Extension) ์ค์น
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ ์ํ์์, ์๋ ํ๋ฅผ ์ฐธ๊ณ ํ์ฌ ํ์ํ ํ์ฅ ๊ธฐ๋ฅ์ ์ค์นํ๋ CREATE EXTENSION ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค.
| ํ์ฅ ๊ธฐ๋ฅ | ์ค๋ช | ์ค์น ์ฟผ๋ฆฌ | ํ์ ์ฌ๋ถ |
| postgis | ๊ณต๊ฐ ๋ฐ์ดํฐ ํ์ , ํจ์, ์ธ๋ฑ์ค ๋ฑ PostGIS์ ๋ชจ๋ ํต์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. | CREATE EXTENSION postgis; | ํ์ |
| postgis_topology | ๋ ธ๋, ์ฃ์ง, ํ์ด์ค ๊ธฐ๋ฐ์ ํ ํด๋ก์ง ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ง์ํ๋ค. (์: ๋คํธ์ํฌ ๋ถ์) | CREATE EXTENSION postgis_topology; | ์ ํ |
| postgis_raster | ์์ฑ ์ด๋ฏธ์ง์ ๊ฐ์ ๋์คํฐ(Grid) ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ๊ณ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. | CREATE EXTENSION postgis_raster; | ์ ํ |
| postgis_tiger_geocoder | ๋ฏธ๊ตญ TIGER ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ์ง์ค์ฝ๋ฉ/๋ฆฌ๋ฒ์ค ์ง์ค์ฝ๋ฉ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. | CREATE EXTENSION postgis_tiger_geocoder; | ์ ํ |
Step 3: ์ค์น ํ์ธ
1. ์ค์น๋ ํ์ฅ ๊ธฐ๋ฅ ๋ชฉ๋ก ์กฐํ
SELECT extname, extversion FROM pg_extension WHERE extname LIKE 'postgis%';
2. PostGIS ๋ฒ์ ํ์ธ ํจ์ ์คํ
SELECT postgis_full_version();
-- POSTGIS="3.5.1 48ab069" [EXTENSION] PGSQL="170" GEOS="3.13.0-CAPI-1.19.0" PROJ="9.5.0 NETWORK_ENABLED=OFF URL_ENDPOINT=https://cdn.proj.org USER_WRITABLE_DIRECTORY=/tmp/proj DATABASE_PATH=/rdsdbbin/postgres-17.4.R2/share/proj/proj.db" (compiled against PROJ 9.5.0) LIBXML="2.9.1" LIBJSON="0.18" LIBPROTOBUF="1.3.2" WAGYU="0.5.0 (Internal)"

๋ฐ์ํ
'Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ ผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๋ง โ Relation(๊ด๊ณ)์ ๋ชจ๋ ๊ฒ (0) | 2026.01.03 |
|---|---|
| ๋ ผ๋ฆฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ธ๋ง โ ํค(Key)์ ๋ชจ๋ ๊ฒ (0) | 2026.01.03 |
| ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์์ฑ ์ ์ด (0) | 2026.01.01 |
| ๊ฐ๋ ์ ๋ชจ๋ธ๋ง (2) - ์ํฐํฐ ๊ด๊ณ์ ERD ์ค์ต (0) | 2025.10.07 |
| ๊ฐ๋ ์ ๋ชจ๋ธ๋ง (1) - ์๊ตฌ์ฌํญ ๋ถ์๊ณผ ์ํฐํฐ์ ์ดํด (1) | 2025.10.07 |