16.1 확장 시스템
PostgreSQL의 가장 강력한 차별점 중 하나 = 확장 가능한 코어 아키텍처. C·SQL로 작성된 extension을 CREATE EXTENSION 한 줄로 활성화합니다. 데이터 타입·함수·연산자·인덱스 메서드·언어·외부 데이터·전체 도구까지 더할 수 있습니다.
구조
extension은 다음 묶음으로 배포:
| 파일 | 역할 |
|---|---|
<name>.control | 메타데이터 (버전, 의존성, requires) |
<name>--<version>.sql | 객체 생성 SQL |
<name>--<from>--<to>.sql | 버전 업그레이드 스크립트 |
<name>.so | C 코어 라이브러리 (선택) |
설치 후 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 |
| FDW | postgres_fdw, file_fdw, oracle_fdw, mysql_fdw |
| 분산·sharding | citus, 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_trgm | trigram·유사도 검색 |
| btree_gin / btree_gist | B-tree 타입을 GIN/GiST에 (exclusion constraint) |
| hstore | key-value 컬럼 (jsonb 이전 표준) |
| uuid-ossp | UUID 생성 (v4 등) |
| tablefunc | crosstab, normal_rand |
| dblink | 다른 PG 데이터베이스 호출 |
| postgres_fdw | foreign data wrapper |
| file_fdw | CSV 등 파일을 테이블로 |
의존성
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 RDS | 200+ 확장, 콘솔에서 enable |
| Aurora PostgreSQL | RDS 와 유사 |
| Azure Flexible Server | 100+ 확장 |
| 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 DEFINER | 9.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 등을 봅니다.