본문으로 건너뛰기
16.1 확장 시스템

16.1 확장 시스템

PostgreSQL의 가장 강력한 차별점 중 하나 = 확장 가능한 코어 아키텍처. C·SQL로 작성된 extensionCREATE EXTENSION 한 줄로 활성화합니다. 데이터 타입·함수·연산자·인덱스 메서드·언어·외부 데이터·전체 도구까지 더할 수 있습니다.

구조

extension은 다음 묶음으로 배포:

파일역할
<name>.control메타데이터 (버전, 의존성, requires)
<name>--<version>.sql객체 생성 SQL
<name>--<from>--<to>.sql버전 업그레이드 스크립트
<name>.soC 코어 라이브러리 (선택)

설치 후 pg_extension 카탈로그에 등록되며, 하나의 단위로 dump·restore·drop 가능합니다.

설치 절차

# 1. OS 패키지로 (PGDG 저장소)
sudo dnf install -y postgresql17-contrib   # 표준 contrib 묶음
sudo dnf install -y pgvector_17             # 개별 확장

# Debian
sudo apt-get install -y postgresql-17-pgvector
-- 2. DB 단위 활성
CREATE EXTENSION pgvector;

-- 또는 이름 충돌 회피 + 스키마 지정
CREATE EXTENSION pgvector WITH SCHEMA app_ext;

종류

분류예시
contrib (PostgreSQL 함께 배포)pg_stat_statements, pgcrypto, pg_trgm, btree_gist, hstore, pgaudit (별도)
데이터 타입·인덱스pgvector, postgis, citext, ip4r
FDWpostgres_fdw, file_fdw, oracle_fdw, mysql_fdw
분산·shardingcitus, postgres-bdr
운영·관리pg_partman, pg_repack, pg_cron
모니터링pg_stat_statements, pg_stat_kcache, pg_qualstats
언어plpython3u, plperl, plv8
암호화pgcrypto, pgsodium
기타hypopg(가상 인덱스), pg_hint_plan

자주 쓰는 contrib 묶음

SELECT name, default_version, installed_version, comment
  FROM pg_available_extensions
 ORDER BY name;
확장용도
pg_stat_statements쿼리 통계 (10.5)
pgcrypto해시·암호화 함수
pg_trgmtrigram·유사도 검색
btree_gin / btree_gistB-tree 타입을 GIN/GiST에 (exclusion constraint)
hstorekey-value 컬럼 (jsonb 이전 표준)
uuid-osspUUID 생성 (v4 등)
tablefunccrosstab, normal_rand
dblink다른 PG 데이터베이스 호출
postgres_fdwforeign data wrapper
file_fdwCSV 등 파일을 테이블로

의존성

CREATE EXTENSION pg_partman REQUIRES pgcrypto;

requires로 정의된 다른 확장이 먼저 설치돼야.

업그레이드

-- 새 버전 확인
SELECT * FROM pg_available_extension_versions WHERE name = 'pgvector';

-- 업그레이드
ALTER EXTENSION pgvector UPDATE TO '0.7.0';

업그레이드 스크립트가 카탈로그 객체를 변경. 새 버전 SQL은 OS 패키지로 함께 들어와야 합니다.

스키마와의 관계

확장이 만든 객체는 확장 소유. drop하면 같이 사라짐.

DROP EXTENSION pgvector;        -- 사용 안 함
DROP EXTENSION pgvector CASCADE; -- 의존하는 객체까지

보안 — shared_preload_libraries

일부 확장은 서버 시작 시 로드 필요합니다.

# postgresql.conf
shared_preload_libraries = 'pg_stat_statements,auto_explain,pgaudit'

restart 후에야 적용합니다. 부적합 모듈을 넣으면 기동 실패 — 신중히 진행합니다.

보안 — TRUSTED vs UNTRUSTED

분류의미
TRUSTED (PG 13+)슈퍼유저 아니어도 CREATE EXTENSION 가능
UNTRUSTED슈퍼유저만

pg_extension 카탈로그의 extowner가 확장 소유자.

extension의 한계

한계메모
logical replication subscriber에 자동 동기화 안 됨양쪽 같은 확장·버전 필요
메이저 업그레이드 시 재설치 필요pg_upgrade가 처리하지만 확장 별 호환성 확인
클라우드 매니지드는 허용 확장 목록RDS·NCP·Azure 모두 일부만
-- RDS에서 사용 가능한 확장
SHOW rds.allowed_extensions;

매니지드 클라우드의 확장

클라우드확장 지원
AWS RDS200+ 확장, 콘솔에서 enable
Aurora PostgreSQLRDS 와 유사
Azure Flexible Server100+ 확장
GCP Cloud SQL일부, version-locked
NCP Cloud DB클라우드별 정책

pgvector·pg_partman·postgis 같은 인기 확장은 대부분 지원합니다. 일부 쓰기 권한이 필요한 확장(pgaudit·pg_repack)은 제한.

확장 자체 만들기

C 또는 SQL로 작성합니다. 디렉토리 구조:

myext/
├── Makefile
├── myext.control
├── myext--1.0.sql
└── myext.c
# Makefile
MODULES = myext
EXTENSION = myext
DATA = myext--1.0.sql

PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
make
sudo make install
psql -c "CREATE EXTENSION myext;"

PGXS 빌드 시스템이 표준입니다. 자세한 가이드는 PostgreSQL 공식 문서.

확장 보안

위험대응
확장 자체 보안 취약신뢰할 수 있는 출처에서만 (PGDG, 공식 GitHub)
확장 함수의 SECURITY DEFINER9.4 참고
C 확장의 shared library 손상매니지드 환경 사용 권장
확장의 신선도 (정기 업데이트)메이저 PG 호환성 추적

정리

  • extension = PostgreSQL의 확장 가능한 코어의 패키지 형식
  • CREATE EXTENSION 한 줄로 활성
  • contrib (PostgreSQL 함께 배포) + 외부 (PGDG·GitHub) 두 종류
  • shared_preload_libraries로 일부 로드, restart 필요
  • 메이저 업그레이드·매니지드 클라우드는 확장 호환성 별도 확인

다음 절(16.2)에서는 실전에서 자주 쓰는 확장 — pgvector·pg_trgm·pg_partman·pgcrypto 등을 봅니다.