Postgres์˜ PostGIS ๊ฐœ๋…, ์ปค๋จธ์Šค ํ™œ์šฉ ์‚ฌ๋ก€ ๋ฐ ์„ค์น˜ ๊ฐ€์ด๋“œ

2026. 1. 1. 00:21ใ†Database

๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

 

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: ๋ฐฐ์†ก ๊ฐ€๋Šฅ ์ง€์—ญ ์กฐํšŒ

  1. ๋ฌธ์ œ ์ƒํ™ฉ 
    1. ๊ณ ๊ฐ์˜ ์ฃผ์†Œ์ง€๊ฐ€ ์„œ๋น„์Šค์˜ ‘์ƒˆ๋ฒฝ ๋ฐฐ์†ก‘, ‘๋‹น์ผ ๋ฐฐ์†ก’ ๋“ฑ ํŠน์ • ๋ฐฐ์†ก ์ •์ฑ…์˜ ๋Œ€์ƒ ์ง€์—ญ์ธ์ง€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒ๋ณ„ํ•ด์•ผ ํ•œ๋‹ค. 
  2. PostGIS 
    1. ํ•ด๊ฒฐ ๋ฐฐ์†ก ๊ฐ€๋Šฅ ๊ถŒ์—ญ์„ POLYGON ๋˜๋Š” MULTIPOLYGON ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅํ•œ๋‹ค.
    2. ๊ณ ๊ฐ ์ฃผ์†Œ๋ฅผ ์ง€์˜ค์ฝ”๋”ฉํ•˜์—ฌ POINT ์ขŒํ‘œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
    3. 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: ์ฃผ๋ณ€ ๋งค์žฅ/ํ”ฝ์—… ์žฅ์†Œ ์ฐพ๊ธฐ

  1. ๋ฌธ์ œ ์ƒํ™ฉ 
    1. ๊ณ ๊ฐ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋งค์žฅ N๊ณณ์„ ์ฐพ์•„์ฃผ๊ฑฐ๋‚˜, ์˜จ๋ผ์ธ ์ฃผ๋ฌธ ํ›„ ํ”ฝ์—… ๊ฐ€๋Šฅํ•œ ์ฃผ๋ณ€ ์žฅ์†Œ๋ฅผ ์•ˆ๋‚ดํ•ด์•ผ ํ•œ๋‹ค.
  2. PostGIS 
    1. ์ „๊ตญ ๋งค์žฅ์˜ ์œ„์น˜๋ฅผ POINT๋กœ ์ €์žฅํ•˜๊ณ  GiST ๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 
    2. ๊ณ ๊ฐ ์œ„์น˜(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: ์ง€์—ญ ๊ธฐ๋ฐ˜ ํƒ€๊ฒŸ ๋งˆ์ผ€ํŒ…

  1. ๋ฌธ์ œ ์ƒํ™ฉ 
    1. ‘๊ฐ•๋‚จ์ ’ ๋ฐ˜๊ฒฝ 2km ๋‚ด์— ์žˆ๋Š” ํ™œ์„ฑ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ํŠน๋ณ„ ํ• ์ธ ์ฟ ํฐ ํ‘ธ์‹œ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•˜๋Š” ๋“ฑ ํƒ€๊ฒŸ ๋งˆ์ผ€ํŒ…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
  2. PostGIS 
    1. ์‚ฌ์šฉ์ž์˜ ๋งˆ์ง€๋ง‰ ์ ‘์† ์œ„์น˜ ๋˜๋Š” ์ฃผ์†Œ ์ •๋ณด๋ฅผ POINT ๋ฐ์ดํ„ฐ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. 
    2. 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)"

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•