RSS

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.overseas
CREATE 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
└── ltree

IoT·로그·모니터링

PostgreSQL
├── TimescaleDB
├── pg_partman
├── pg_cron
└── pg_stat_statements

모든 확장을 설치할 필요는 없다

확장 프로그램이 많다고 해서 처음부터 전부 설치하는 것은 좋지 않습니다.

각 확장은 다음과 같은 운영 부담을 추가할 수 있습니다.

  • PostgreSQL 버전 호환성
  • 확장 버전 업그레이드
  • 백업과 복구 검증
  • 클라우드 서비스 지원 여부
  • Docker 이미지 구성
  • 보안 업데이트
  • 마이그레이션 복잡도

따라서 다음 원칙이 좋습니다.

필요할 것 같은 확장
→ 설치하지 않는다

현재 문제를 명확히 해결하는 확장
→ 검토 후 설치한다

처음 익히기 좋은 확장 7개

  1. pg_stat_statements
  2. pg_trgm
  3. pgcrypto
  4. citext
  5. pgvector
  6. PostGIS
  7. pg_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_cron

PostgreSQL은 확장 가능한 데이터 플랫폼이다

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, 지도, 검색, 분석을 아우르는 강력한 서비스 기반이 됩니다.