공간 조인과 포함 관계
어떤 점이 어떤 영역에 속하는지 알아봅니다
공간 조인과 포함 관계은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
공간 조인이란 무엇인가요?
공간 조인은 일치하는 키가 아니라 지리적 관계를 기준으로 두 테이블을 결합합니다. "이 ID가 저 ID와 같은가요?"라고 묻는 대신 "이 점이 저 다각형 안에 있나요?" 또는 "이 두 도형이 겹치나요?"와 같은 질문을 합니다.
PostGIS는 기하 도형 유형과 공간 함수를 사용해 이러한 조인을 가능하게 하는 기능을 PostgreSQL에 추가합니다. 결과는 일반적인 JOIN과 마찬가지로 양쪽 테이블의 행을 결합하지만, 조건이 기하학적이라는 점이 다릅니다.
샘플 테이블 설정
함께 사용할 테이블 두 개를 만들어 보겠습니다. cities에는 점 위치를 저장하고, countries에는 다각형 경계를 저장합니다. 두 테이블 모두 PostGIS의 GEOMETRY 타입과 SRID 4326(표준 WGS84 위도/경도)을 사용합니다.
SRID(공간 참조 ID)는 PostGIS에 사용할 좌표계를 알려 줍니다. SRID 4326은 GPS 데이터에 가장 일반적으로 사용됩니다.
CREATE TABLE countries (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
border GEOMETRY(POLYGON, 4326)
);
CREATE TABLE cities (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
location GEOMETRY(POINT, 4326)
);샘플 데이터 삽입
ST_GeomFromText를 사용하여 잘 알려진 텍스트(WKT) 형식의 도형 값을 삽입하겠습니다. WKT는 도형을 표현하는 표준 텍스트 형식입니다. 점에는 POINT(lon lat)을, 다각형에는 POLYGON((...))을 사용합니다.
WKT에서는 경도보다 위도를 먼저 쓰지 않고 경도를 먼저 씁니다. 이는 수학에서 사용하는 X, Y 규칙과 일치합니다.
INSERT INTO countries (name, border) VALUES
('France', ST_GeomFromText('POLYGON((-5 42, 8 42, 8 51, -5 51, -5 42))', 4326)),
('Spain', ST_GeomFromText('POLYGON((-9 36, 3 36, 3 44, -9 44, -9 36))', 4326));
INSERT INTO cities (name, location) VALUES
('Paris', ST_GeomFromText('POINT(2.35 48.85)', 4326)),
('Madrid', ST_GeomFromText('POINT(-3.70 40.42)', 4326)),
('Bordeaux', ST_GeomFromText('POINT(-0.58 44.84)', 4326)),
('Lisbon', ST_GeomFromText('POINT(-9.14 38.72)', 4326));ST_Contains: 핵심 함수
ST_Contains(geometry A, geometry B)는 도형 A가 도형 B를 완전히 포함할 때 TRUE를 반환합니다. 이 사용 사례에서는 ST_Contains(country.border, city.location)가 도시 점이 국가 다각형 안에 있을 때 참을 반환합니다.
이 함수는 PostGIS에서 포함 조인의 핵심입니다. OGC 표준의 일부이며, 어떤 도형 유형 조합에도 사용할 수 있습니다.
SELECT
ci.name AS city,
co.name AS country
FROM cities ci
JOIN countries co
ON ST_Contains(co.border, ci.location);ST_Within: 반대 관점
ST_Within(geometry A, geometry B)는 ST_Contains의 정확히 반대입니다. 도형 A가 도형 B 안에 완전히 들어 있을 때 TRUE를 반환합니다. ST_Within(city, country)는 논리적으로 ST_Contains(country, city)와 동일합니다.
이 경우 두 함수는 같은 결과를 만듭니다. 둘 중 무엇을 선택할지는 가독성의 문제이므로, 질의에서 더 자연스럽게 읽히는 함수를 사용하십시오.
-- These two queries return identical results:
-- Using ST_Contains (country contains city)
SELECT ci.name, co.name
FROM cities ci
JOIN countries co ON ST_Contains(co.border, ci.location);
-- Using ST_Within (city is within country)
SELECT ci.name, co.name
FROM cities ci
JOIN countries co ON ST_Within(ci.location, co.border);일치하지 않는 점 찾기에 LEFT JOIN 사용
일반적인 JOIN은 어떤 국가 다각형에도 들어 있지 않은 도시를 제외합니다. LEFT JOIN과 WHERE ... IS NULL 검사를 함께 사용하면 포함하는 다각형이 전혀 없는 점을 찾을 수 있습니다. 이는 데이터 품질 문제나 대상 범위 밖에 있는 점을 감지할 때 유용합니다.
SELECT
ci.name AS city,
co.name AS country
FROM cities ci
LEFT JOIN countries co
ON ST_Contains(co.border, ci.location)
ORDER BY co.name NULLS LAST;다각형별 점 개수 세기
공간 조인은 집계와 함께 사용할 때 특히 유용합니다. 도시를 국가에 조인한 다음 국가별로 그룹화하면 각 다각형 안에 몇 개의 점이 있는지 셀 수 있습니다. 이 패턴은 지리 분석에서 매우 흔합니다. 예를 들어 지역별 매장 수, 구역별 이벤트 수, 영역별 센서 수 등을 셀 때 사용합니다.
SELECT
co.name AS country,
COUNT(ci.id) AS city_count
FROM countries co
LEFT JOIN cities ci
ON ST_Contains(co.border, ci.location)
GROUP BY co.name
ORDER BY city_count DESC;성능을 위한 공간 인덱스 사용
대규모 데이터 세트에서는 모든 점을 모든 다각형과 비교해야 하므로 공간 조인이 느릴 수 있습니다. GIST 인덱스(일반화 검색 트리)를 사용하면 PostGIS가 경계 상자 사전 필터를 적용하여 정확한 ST_Contains 검사를 수행하기 전에 대부분의 비교를 건너뛸 수 있습니다.
조인하거나 필터링할 도형 열에는 항상 GIST 인덱스를 생성하십시오. 쿼리 계획 수립기가 이를 자동으로 사용합니다.
-- Create GIST indexes on both geometry columns
CREATE INDEX idx_countries_border
ON countries USING GIST (border);
CREATE INDEX idx_cities_location
ON cities USING GIST (location);
-- The same join now benefits from index acceleration
SELECT ci.name, co.name
FROM cities ci
JOIN countries co
ON ST_Contains(co.border, ci.location);ST_Intersects: 겹치는 도형
ST_Intersects(A, B)는 두 도형이 경계에서 맞닿기만 하는 경우를 포함하여 공통된 점을 하나라도 공유하면 TRUE를 반환합니다. 이는 ST_Contains보다 허용 범위가 넓습니다. 두 다각형이 서로 겹치면 어느 한쪽이 다른 쪽을 완전히 포함하지 않더라도 교차하는 것으로 판단합니다.
점이 다각형 안에 있는지 검사할 때 ST_Intersects와 ST_Contains는 동일하지만, ST_Intersects가 GIST 인덱스를 더 효율적으로 사용하므로 실제로는 이를 더 자주 선택합니다.
-- ST_Intersects is index-friendly and equivalent
-- to ST_Contains for point-in-polygon tests
SELECT
ci.name AS city,
co.name AS country
FROM cities ci
JOIN countries co
ON ST_Intersects(co.border, ci.location);가장 가까운 다각형에 점 조인
점이 경계 위에 정확히 놓이거나 여러 다각형에 매우 가까이 있을 때는 모든 일치 항목 대신 가장 가까운 다각형을 찾고 싶을 수 있습니다. ST_Distance는 두 도형 사이의 거리를 측정하므로 ORDER BY + LIMIT 패턴이나 LATERAL 조인과 ORDER BY ... LIMIT 1을 사용할 수 있습니다.
이를 최근접 이웃 조인이라고 하며, GPS 궤적을 도로 구간에 맞추거나 점을 가장 가까운 영역에 할당할 때 흔히 사용합니다.
-- For each city, find the single closest country centroid
SELECT DISTINCT ON (ci.name)
ci.name AS city,
co.name AS nearest_country,
ST_Distance(ci.location, ST_Centroid(co.border)) AS dist
FROM cities ci
CROSS JOIN countries co
ORDER BY ci.name, dist;실전 예제: 구역 내 레스토랑
다음은 전체 과정을 보여 주는 현실적인 예제입니다. 각 레스토랑이 어느 도시 구역에 속하는지 찾은 다음 구역별 레스토랑 수를 셉니다. 이 패턴은 모든 점-다각형 시나리오에 적용할 수 있습니다. 예를 들어 동네별 현금자동입출금기, 관할 구역별 사고, 배송 영역별 주문을 찾을 때 사용할 수 있습니다.
이 질의는 공간 조인 안에서 ST_Within을 사용하고, 요약 보고서를 위해 결과를 그룹화합니다.
-- Assume tables: districts(id, name, boundary GEOMETRY)
-- restaurants(id, name, location GEOMETRY)
SELECT
d.name AS district,
COUNT(r.id) AS restaurant_count,
STRING_AGG(r.name, ', ' ORDER BY r.name) AS names
FROM districts d
LEFT JOIN restaurants r
ON ST_Within(r.location, d.boundary)
GROUP BY d.name
ORDER BY restaurant_count DESC;빠른 확인
PostGIS의 공간 조인과 포함 관계에 대한 이해도를 확인해 보십시오.
복습: 공간 조인과 포함 관계
이 레슨에서는 PostGIS의 공간 조인을 사용하여 "어떤 점이 어떤 영역에 속하는가?"라는 질문에 답하는 방법을 배웠습니다.
핵심 내용:
- ST_Contains(다각형, 점) — 다각형이 점을 완전히 포함할 때 참을 반환합니다.
- ST_Within(점, 다각형) — 그 반대이며, 논리적으로 ST_Contains와 동일합니다.
- ST_Intersects — 더 일반적인 겹침 검사이며, 점이 다각형 안에 있는지 검사할 때 인덱스를 사용하기에 유리합니다.
- 도형 열에 생성한 GIST 인덱스는 대규모 환경에서 성능을 위해 필수적입니다.
- 공간 조인을 GROUP BY와 결합하여 영역별 점을 세거나 집계할 수 있습니다.
- LEFT JOIN을 사용하여 모든 다각형의 바깥에 있는 점을 감지할 수 있습니다.
공간 조인을 사용하면 외부 GIS 도구 없이 SQL에서 직접 지리 분석을 수행할 수 있습니다.
자주 묻는 질문
“공간 조인과 포함 관계” 강의는 무료인가요?
네 — “공간 조인과 포함 관계” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“공간 조인과 포함 관계”에서 뭘 배우나요?
어떤 점이 어떤 영역에 속하는지 알아봅니다 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“공간 조인과 포함 관계” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 공간 데이터 유형
- 거리와 최근접 이웃
- 공간 조인과 포함 관계
- 공간 인덱스(GiST)