PostgreSQL은 단순한 데이터베이스가 아니다: 알아두면 좋은 확장 프로그램 총정리
PostgreSQL을 처음 접하면 MySQL과 비슷한 관계형 데이터베이스라고 생각하기 쉽습니다.
물론 기본적으로는 데이터를 테이블에 저장하고 SQL로 조회하는 관계형 데이터베이스가 맞습니다. 하지만 PostgreSQL의 진짜 강점은 필요한 기능을 Extension, 즉 확장 프로그램 형태로 추가할 수 있다는 것입니다.
PostgreSQL
├── pgvector → AI 벡터 검색
├── PostGIS → 지도·공간 데이터
├── TimescaleDB → 시계열 데이터
├── pg_cron → 예약 작업
├── pg_trgm → 유사 문자열 검색
└── pg_stat_statements → SQL 성능 분석덕분에 PostgreSQL 하나를 기반으로 AI 검색, 지도 서비스, 로그 분석, 업무 자동화까지 상당히 넓은 영역을 구현할 수 있습니다.
이번 글에서는 실무에서 자주 언급되는 PostgreSQL 확장 프로그램과 각각의 활용 사례를 정리합니다.
PostgreSQL 확장 프로그램이란?
PostgreSQL 확장 프로그램은 데이터베이스에 새로운 자료형, 함수, 연산자, 인덱스 또는 관리 기능을 추가하는 모듈입니다.
확장 프로그램을 설치한 뒤에는 일반적으로 다음과 같이 활성화합니다.
CREATE EXTENSION extension_name;예를 들어 pgvector를 사용하려면 다음 명령을 실행합니다.
CREATE EXTENSION vector;PostGIS는 다음과 같이 활성화합니다.
CREATE EXTENSION postgis;주의할 점은 서버에 확장 프로그램 패키지가 설치되어 있어야 하며, 실제 사용할 데이터베이스마다 CREATE EXTENSION을 실행해야 한다는 것입니다.
현재 설치 가능한 확장은 다음 명령으로 확인할 수 있습니다.
SELECT *
FROM pg_available_extensions
ORDER BY name;현재 데이터베이스에 활성화된 확장은 다음과 같이 확인합니다.
SELECT *
FROM pg_extension;1. pgvector: AI 벡터 검색
무엇을 하는 확장인가?
pgvector는 PostgreSQL에 벡터 자료형과 벡터 유사도 검색 기능을 추가합니다.
텍스트, 이미지, 상품, 기업 정보 등을 임베딩 모델로 숫자 배열로 변환한 뒤 PostgreSQL에 저장할 수 있습니다.
"재고 관리 시스템"
↓ 임베딩
[0.012, -0.384, 0.721, ...]대표적인 사용 사례
- RAG 문서 검색
- 사내 AI 챗봇
- 의미 기반 검색
- 이미지 유사도 검색
- 상품 추천
- 사용자 취향 추천
- 유사 고객 또는 유사 업체 검색
테이블 예시
CREATE EXTENSION vector;
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT NOT NULL,
embedding VECTOR(1536)
);사용자의 질문과 가장 유사한 문서를 검색할 수 있습니다.
SELECT
id,
title,
content
FROM documents
ORDER BY embedding <=> '[0.12, -0.31, 0.84, ...]'
LIMIT 5;언제 사용하면 좋은가?
단순히 키워드가 일치하는 문서를 찾는 것이 아니라, 문장의 의미가 비슷한 자료를 찾고 싶을 때 사용합니다.
검색어: 공장에서 재고가 자꾸 맞지 않는다
키워드 검색
→ 문장에 '공장', '재고'가 포함된 자료 검색
벡터 검색
→ 재고 불일치, 입출고 누락, 창고 관리 문제와
의미상 유사한 자료 검색2. PostGIS: 지도와 공간 데이터 처리
무엇을 하는 확장인가?
PostGIS는 PostgreSQL에 지리 공간 데이터 저장, 공간 인덱싱, 거리 계산, 교차 및 포함 여부 판단 기능을 추가합니다.
PostGIS를 설치하면 다음과 같은 공간 자료형을 사용할 수 있습니다.
Point: 하나의 위치LineString: 도로 또는 이동 경로Polygon: 행정구역 또는 영업 구역MultiPolygon: 여러 개로 나뉜 복합 영역Geometry: 평면 좌표 중심의 공간 자료형Geography: 실제 지구 표면을 고려한 공간 자료형
대표적인 사용 사례
- 주변 업체 검색
- 배달 가능 지역 확인
- 지도 기반 리드 관리
- 차량과 기사 위치 추적
- 행정구역 내부 검색
- 상권 분석
- 이동 거리 계산
- 영업 담당자 구역 배정
테이블 예시
CREATE EXTENSION postgis;
CREATE TABLE companies (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
location GEOGRAPHY(Point, 4326)
);업체 위치를 저장합니다.
INSERT INTO companies (
name,
location
)
VALUES (
'듀오랩스',
ST_SetSRID(
ST_MakePoint(127.0000, 37.5000),
4326
)::geography
);여기서 주의할 점은 일반적으로 ST_MakePoint에 다음 순서로 값을 넣는다는 것입니다.
경도, 위도
longitude, latitude반경 검색 예시
특정 위치에서 3km 이내에 있는 업체를 찾을 수 있습니다.
SELECT
id,
name
FROM companies
WHERE ST_DWithin(
location,
ST_SetSRID(
ST_MakePoint(127.0276, 37.4979),
4326
)::geography,
3000
);geography 자료형에서 거리 단위는 일반적으로 미터를 사용하므로 3000은 3km를 의미합니다.
거리순 정렬
SELECT
name,
ST_Distance(
location,
ST_SetSRID(
ST_MakePoint(127.0276, 37.4979),
4326
)::geography
) AS distance_meters
FROM companies
ORDER BY distance_meters;3. TimescaleDB: 시계열 데이터 처리
무엇을 하는 확장인가?
TimescaleDB는 PostgreSQL을 시계열 데이터 처리에 적합하도록 확장합니다.
별도의 완전히 다른 데이터베이스가 아니라 PostgreSQL 확장으로 동작하기 때문에 기존 PostgreSQL용 SQL, 클라이언트, 드라이버를 계속 사용할 수 있습니다.
시계열 데이터란?
시간 순서대로 계속 쌓이는 데이터를 말합니다.
2026-08-06 10:00:00 온도 24.1℃
2026-08-06 10:01:00 온도 24.3℃
2026-08-06 10:02:00 온도 24.2℃대표적인 사용 사례
- 공장 센서 데이터
- IoT 데이터
- 서버 CPU·메모리 모니터링
- 주식·가상자산 가격
- 사용자 활동 로그
- 매출 추이
- 차량 위치 기록
- 장비 상태 기록
일반 테이블과 차이
일반 PostgreSQL 테이블에도 시간 데이터를 저장할 수 있습니다.
하지만 데이터가 수천만 건 이상 지속적으로 쌓이면 다음 문제가 생길 수 있습니다.
- 최근 데이터 조회가 느려짐
- 기간별 데이터 관리가 복잡해짐
- 오래된 데이터 삭제가 부담스러움
- 시간 단위 집계 비용이 커짐
- 파티셔닝 관리가 복잡해짐
TimescaleDB는 시간 기준으로 데이터를 관리하는 hypertable 구조를 제공합니다.
CREATE TABLE sensor_data (
recorded_at TIMESTAMPTZ NOT NULL,
sensor_id BIGINT NOT NULL,
temperature DOUBLE PRECISION
);
SELECT create_hypertable(
'sensor_data',
'recorded_at'
);4. pg_cron: 데이터베이스 예약 작업
무엇을 하는 확장인가?
pg_cron은 PostgreSQL 안에서 일정에 맞춰 SQL을 자동 실행할 수 있게 해주는 작업 스케줄러입니다.
리눅스의 cron과 비슷하지만 실행 대상이 SQL입니다.
대표적인 사용 사례
- 매일 통계 테이블 생성
- 오래된 로그 삭제
- 만료된 세션 정리
- 예약 상태 변경
- 매일 보고서 데이터 생성
- 임시 데이터 정리
- 주기적인 집계 작업
사용 예시
매일 새벽 3시에 오래된 로그를 삭제합니다.
SELECT cron.schedule(
'delete-old-logs',
'0 3 * * *',
$$
DELETE FROM logs
WHERE created_at < NOW() - INTERVAL '90 days'
$$
);매시간 통계를 갱신할 수도 있습니다.
SELECT cron.schedule(
'refresh-hourly-stats',
'0 * * * *',
$$
REFRESH MATERIALIZED VIEW CONCURRENTLY hourly_stats
$$
);주의할 점
pg_cron으로 모든 백그라운드 작업을 처리하는 것은 적합하지 않습니다.
다음과 같은 작업은 별도의 워커를 사용하는 것이 좋습니다.
- 외부 API 호출
- 이메일 대량 발송
- 이미지 변환
- OCR 처리
- 긴 AI 추론 작업
- 파일 업로드와 다운로드
- 실패 재시도가 중요한 작업
간단한 DB 정리·집계
→ pg_cron
외부 서비스와 연동하는 긴 작업
→ Redis Queue, BullMQ, Celery 등의 워커5. pg_trgm: 오타와 유사 문자열 검색
무엇을 하는 확장인가?
pg_trgm은 문자열을 세 글자 단위인 trigram으로 나누어 문자열 유사도를 계산합니다.
예를 들어 다음 단어가 있다고 가정해 보겠습니다.
PostgreSQL이를 일부 trigram으로 나누면 다음과 비슷한 형태가 됩니다.
pos
ost
stg
tgr
gre
res
...두 문자열이 공유하는 trigram이 많을수록 비슷한 문자열로 판단할 수 있습니다.
대표적인 사용 사례
- 회사명 오타 검색
- 상품명 유사 검색
- 검색 자동완성
- 사람 이름 유사 검색
- 주소 검색
- 부분 문자열 검색
- 한글 상호명 검색 보조
사용 예시
CREATE EXTENSION pg_trgm;유사도를 계산합니다.
SELECT similarity(
'듀오랩스',
'듀오렙스'
);유사한 업체명을 찾습니다.
SELECT
name,
similarity(name, '듀오렙스') AS score
FROM companies
WHERE name % '듀오렙스'
ORDER BY score DESC;GIN 인덱스를 추가하면 검색 성능을 높일 수 있습니다.
CREATE INDEX companies_name_trgm_idx
ON companies
USING GIN (name gin_trgm_ops);pgvector와 차이점
pg_trgm
→ 글자 모양이 비슷한 문자열 검색
pgvector
→ 의미가 비슷한 문장이나 문서 검색6. pg_stat_statements: 느린 SQL 찾기
무엇을 하는 확장인가?
pg_stat_statements는 PostgreSQL에서 실행된 SQL의 실행 횟수, 전체 실행 시간, 평균 실행 시간 등을 수집합니다.
대표적인 사용 사례
- 느린 쿼리 찾기
- 가장 자주 실행되는 SQL 확인
- 데이터베이스 부하 원인 분석
- 인덱스가 필요한 쿼리 탐색
- 배포 전후 성능 비교
사용 예시
CREATE EXTENSION pg_stat_statements;평균 실행 시간이 긴 쿼리를 찾습니다.
SELECT
calls,
total_exec_time,
mean_exec_time,
rows,
query
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 20;7. pgcrypto: 암호화와 해시
무엇을 하는 확장인가?
pgcrypto는 PostgreSQL에서 암호화, 복호화, 해시, 난수 생성 등의 기능을 사용할 수 있게 합니다.
대표적인 사용 사례
- 토큰 해시 저장
- 민감 데이터 암호화
- 비밀번호 해시
- 랜덤 UUID 생성
- 데이터 무결성 검증
SHA-256 해시 예시
CREATE EXTENSION pgcrypto;
SELECT encode(
digest('hello', 'sha256'),
'hex'
);UUID 생성
SELECT gen_random_uuid();8. uuid-ossp: UUID 생성
uuid-ossp는 여러 방식의 UUID 생성 함수를 제공합니다.
CREATE EXTENSION "uuid-ossp";랜덤 기반 UUID v4를 생성합니다.
SELECT uuid_generate_v4();단순히 랜덤 UUID가 필요한 경우에는 pgcrypto 또는 PostgreSQL이 제공하는 gen_random_uuid()로 충분한 경우가 많습니다.
9. citext: 대소문자를 구분하지 않는 문자열
citext는 대소문자를 구분하지 않는 문자열 자료형을 제공합니다.
CREATE EXTENSION citext;
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email CITEXT UNIQUE NOT NULL
);대표적인 사용 사례
- 이메일 주소
- 로그인 아이디
- 영문 사용자명
- 대소문자를 구분하지 않는 코드
10. ltree: 조직도와 카테고리 구조
ltree는 계층형 경로를 저장하고 검색하기 위한 확장입니다.
대표적인 사용 사례
- 조직도
- 상품 카테고리
- 게시판 분류
- 메뉴 구조
- 폴더 구조
- 댓글 계층
- 업무 분류 체계
company
company.sales
company.sales.domestic
company.sales.overseasCREATE EXTENSION ltree;
CREATE TABLE departments (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
path LTREE NOT NULL
);11. unaccent: 악센트 제거 검색
unaccent는 문자에서 발음 구별 기호를 제거합니다.
CREATE EXTENSION unaccent;
SELECT unaccent('café');결과:
cafe대표적인 사용 사례
- 다국어 검색
- 유럽 언어 이름 검색
- 외국인 사용자 이름 검색
- 주소 검색
- 검색어 정규화
12. fuzzystrmatch: 문자열 발음과 편집 거리
fuzzystrmatch는 문자열 간 차이를 계산하는 여러 함수를 제공합니다.
대표적으로 다음 기능이 있습니다.
- Levenshtein distance
- Soundex
- Metaphone
- Double Metaphone
CREATE EXTENSION fuzzystrmatch;
SELECT levenshtein(
'postgres',
'postgre'
);13. pg_partman: 파티션 자동 관리
데이터가 매우 많아지면 하나의 거대한 테이블 대신 데이터를 여러 파티션으로 나누어 관리할 수 있습니다.
events
├── events_2026_01
├── events_2026_02
├── events_2026_03
└── ...pg_partman은 시간 또는 숫자 범위를 기준으로 파티션 생성을 자동화하는 데 도움을 줍니다.
대표적인 사용 사례
- 접속 로그
- API 호출 기록
- 감사 로그
- 거래 내역
- 메시지 기록
- 대규모 이벤트 테이블
14. tablefunc: 피벗 테이블과 Crosstab
tablefunc는 행으로 저장된 데이터를 열 형태로 변환하는 Crosstab 기능 등을 제공합니다.
대표적인 사용 사례
- 월별 매출 보고서
- 부서별 실적
- 설문 결과
- 관리자 통계 화면
- 엑셀 형태의 리포트
15. postgres_fdw: 다른 PostgreSQL 연결
postgres_fdw는 다른 PostgreSQL 서버의 테이블을 현재 데이터베이스의 테이블처럼 조회할 수 있게 합니다.
대표적인 사용 사례
- 여러 서비스의 데이터 통합 조회
- 점진적인 DB 마이그레이션
- 레거시 시스템 연결
- 데이터 분석용 통합 DB
- 고객별 데이터베이스 조회
16. hstore: 간단한 Key-Value 데이터
hstore는 하나의 컬럼에 문자열 기반 Key-Value 데이터를 저장할 수 있게 합니다.
CREATE EXTENSION hstore;
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL,
attributes HSTORE
);현재는 PostgreSQL의 JSONB가 더 풍부한 기능을 제공하므로 신규 프로젝트에서는 JSONB를 선택하는 경우가 많습니다.
분야별 추천 확장 조합
AI·RAG 서비스
PostgreSQL
├── pgvector
├── pg_trgm
├── unaccent
├── pgcrypto
└── pg_stat_statements지도 기반 서비스
PostgreSQL
├── PostGIS
├── H3
├── pg_trgm
└── pg_stat_statements일반 SaaS·업무 시스템
PostgreSQL
├── pgcrypto
├── citext
├── pg_cron
├── pg_stat_statements
└── ltreeIoT·로그·모니터링
PostgreSQL
├── TimescaleDB
├── pg_partman
├── pg_cron
└── pg_stat_statements모든 확장을 설치할 필요는 없다
확장 프로그램이 많다고 해서 처음부터 전부 설치하는 것은 좋지 않습니다.
각 확장은 다음과 같은 운영 부담을 추가할 수 있습니다.
- PostgreSQL 버전 호환성
- 확장 버전 업그레이드
- 백업과 복구 검증
- 클라우드 서비스 지원 여부
- Docker 이미지 구성
- 보안 업데이트
- 마이그레이션 복잡도
따라서 다음 원칙이 좋습니다.
필요할 것 같은 확장
→ 설치하지 않는다
현재 문제를 명확히 해결하는 확장
→ 검토 후 설치한다처음 익히기 좋은 확장 7개
pg_stat_statementspg_trgmpgcryptocitextpgvectorPostGISpg_cron
듀오랩스 프로젝트에 적용한다면
| 우선순위 | 확장 | 적용 분야 |
|---|---|---|
| 1 | pgvector | RAG, AI 문서 검색, 추천 |
| 2 | PostGIS | 업체 위치, 반경 검색, 영업 지도 |
| 3 | pg_trgm | 회사명, 주소, 고객 검색 |
| 4 | pg_stat_statements | 운영 DB 성능 분석 |
| 5 | pg_cron | 통계 생성, 데이터 정리 |
| 6 | pgcrypto | UUID, 토큰, 데이터 보호 |
| 7 | citext | 이메일과 계정 관리 |
| 8 | ltree | 조직도와 업무 카테고리 |
| 9 | TimescaleDB | 센서, 로그, 상태 기록 |
| 10 | pg_partman | 초대용량 이벤트 데이터 |
예를 들어 지도 기반 AI 영업 시스템은 다음 구조로 만들 수 있습니다.
기업 기본 정보
→ PostgreSQL
기업 위치와 거리
→ PostGIS
영업 지역별 진행률
→ H3
기업 홈페이지와 소개 자료 검색
→ pgvector
상호명과 주소 오타 검색
→ pg_trgm
SQL 병목 분석
→ pg_stat_statements
매일 영업 통계 생성
→ pg_cronPostgreSQL은 확장 가능한 데이터 플랫폼이다
PostgreSQL은 단순히 데이터를 저장하는 관계형 데이터베이스에 그치지 않습니다.
필요한 확장을 조합하면 다음 역할까지 수행할 수 있습니다.
관계형 데이터베이스
+ 벡터 데이터베이스
+ 공간 데이터베이스
+ 시계열 데이터베이스
+ 검색 엔진 일부 기능
+ 예약 작업 시스템
+ 성능 모니터링 시스템물론 PostgreSQL 하나로 모든 전문 시스템을 무조건 대체해야 한다는 뜻은 아닙니다.
대규모 전문 검색에는 Elasticsearch나 OpenSearch가 더 적합할 수 있고, 매우 높은 처리량의 메시지 시스템에는 Kafka가 필요할 수 있습니다. 복잡한 백그라운드 작업은 별도의 워커 시스템이 더 안전합니다.
하지만 대부분의 초기 제품과 중소규모 업무 시스템에서는 PostgreSQL 확장을 활용해 아키텍처를 단순하게 유지할 수 있습니다.
서비스마다 새로운 데이터베이스를 추가하기 전에
PostgreSQL 확장으로 해결 가능한지 먼저 확인한다.요약
| 확장 | 핵심 기능 |
|---|---|
| pgvector | AI 벡터·유사도 검색 |
| PostGIS | 지도·공간 데이터 |
| TimescaleDB | 시계열 데이터 |
| pg_cron | SQL 예약 실행 |
| pg_trgm | 오타·유사 문자열 검색 |
| pg_stat_statements | SQL 실행 통계 |
| pgcrypto | 암호화·해시·UUID |
| citext | 대소문자 무시 문자열 |
| ltree | 계층형 데이터 |
| unaccent | 악센트 제거 |
| fuzzystrmatch | 문자열 거리·발음 검색 |
| pg_partman | 파티션 자동 관리 |
| tablefunc | 피벗·Crosstab |
| postgres_fdw | 다른 PostgreSQL 연결 |
| hstore | Key-Value 데이터 |
PostgreSQL을 제대로 활용하려면 SQL 문법만 익히는 것에서 끝나지 않고, 어떤 문제를 어떤 확장으로 해결할 수 있는지 파악하는 것이 중요합니다.
필요한 확장 몇 개만 잘 선택해도 PostgreSQL은 일반적인 데이터베이스를 넘어 AI, 지도, 검색, 분석을 아우르는 강력한 서비스 기반이 됩니다.
함께 읽기
- 직원 20명 사내 시스템, Supabase Micro면 충분할까?사내 시스템을 새로 만들 때 인프라를 처음부터 크게 잡아야 할지 고민하게 됩니다. 특히 Supabase Pro를 검토하면 Micro와 Small의 월 비용 차이는 크지 않지만, 어떤 기준으로 선택해야 하는지는 가격표만 보고 판단하기 어렵습니다.
- 지도를 육각형으로 나누면 무엇이 달라질까: H3로 영업 지역 관리하기지도 서비스를 만들다 보면 좌표를 저장하는 것 자체는 어렵지 않습니다. 업체 위치는 위도와 경도로 저장하면 되고, 지도 위에는 마커를 찍으면 됩니다.
- 배포 문서 한 줄이 AI 기능 전체를 막을 뻔한 이유새 기능의 코드와 테스트가 모두 준비되어도 데이터베이스 테이블이 운영에 만들어지지 않으면 서비스는 시작할 수 없습니다. 문서 RAG 기능을 배포하는 과정에서 실제 배포 스크립트는 마이그레이션 파일을 적용하고 있었지만, 개발 지침에는 마이그레이션 파일을 만들지 말라고 적혀 있는 불일치를 발견했습니다.
- 여러 회사를 지원하는 SaaS의 데이터는 어떻게 분리해야 할까?한 애플리케이션을 여러 회사가 함께 사용하는 SaaS에서는 로그인보다 테넌트 경계가 더 중요하다. 사용자가 정상적으로 로그인했더라도 다른 회사의 계약, 직원, 파일, 검색 결과를 볼 수 있다면 인증은 성공했지만 데이터 격리는 실패한 것이다.
- 한국어 RAG에서 벡터만 쓰면 안 되는 이유: 하이브리드 검색 설계처음 RAG를 짤 때는 벡터 검색만 썼습니다. 코사인 유사도 하나로 충분할 줄 알았죠. 그런데 한국어 질문에서 이상한 일이 잦았습니다. 분명 문서에 있는 단어를 물었는데 검색이 안 됩니다. 비슷한 의미의 다른 문서만 계속 위에 뜹니다. 원인을 찾다 보니, 벡터 검색이 "의미가 비슷한가"는 잘 재는데 "그 단어가 실제로 …