[PostgreSQL] Extension 만들어보기

PostgreSQL이 오픈소스의 스타로 군림하게 된 데는 여러가지 이유가 있지만, 그 중 대표적인 것이 확장성이다.
Postgres는 확장 도구들을 꽤 자유롭게 만들고 설치해서 쓸 수 있기 때문에 다용도로 사용하기 좋다.
대표적인 확장 도구로는 pgvector, postGIS 등이 있다.

여기서는 확장을 직접 만들고 설치해보는 방법을 간단히 정리해본다.

먼저 PostgreSQL의 공유 디렉터리를 찾아야 한다. 다음 명령으로 찾을 수 있다.

pg_config --sharedir

그러면 그 안에 extension이라는 디렉터리가 있을 텐데, 이게 가장 중요한 부분이다.

실제로 기본 탑재된 확장들이다. 우리도 여기에다가 확장을 만들어서 넣어두면 다른 확장들처럼 쓸 수 있다.

하나씩 만들어보자.
내 경우에는 그냥 간단한 함수를 만들어주는 확장을 구현해보려 한다.

sudo vim /usr/share/postgresql/extension/simpleext--1.0.sql
------

CREATE SCHEMA IF NOT EXISTS simpleext;

CREATE OR REPLACE FUNCTION simpleext.hello_world()
RETURNS text
LANGUAGE sql
AS $$
  SELECT 'hello from simpleext';
$$;

CREATE OR REPLACE FUNCTION simpleext.add_ints(a int, b int)
RETURNS int
LANGUAGE sql
AS $$
  SELECT a + b;
$$;

헬로월드 함수 하나와 덧셈 함수 하나를 적절히 정의했다.
그리고 이걸 방금의 확장 경로에 둔다.

그 다음에는 제어파일이다. 이게 있어야 방금 정의한 sql 파일을 찾아서 설치할 수 있게 된다.

sudo vim /usr/share/postgresql/extension/simpleext.control
---

comment = 'Simple PostgreSQL extension example for this project'
default_version = '1.0'
relocatable = true

마찬가지로 확장 경로에 둔다.

그러면 이제 정의한 저 확장 구성을 즉시 사용할 수 있게 될 것이다.
create extension 쿼리를 날려보면

extension이 만들어질 것이고

우리가 주문한대로 함수들도 만들어져서 사용 가능한 상태로 주어질 것이다.

삭제도 잘 된다.




FFI

하지만, 저런 SQL 수준의 단순 호출을 위해서 확장을 만들 일은 잘 없을 것이다.
PostgreSQL 확장의 가장 큰 강점은 자유도다.

C/C++을 사용하면 기존 DB 구조에 구애받지 않고 뭐든 만들어서 엮을 수 있다. PostGIS와 pgvector 같은 명물들도 그런 식으로 만들어지 ㄴ것이다.

postgres 헤더를 찾아서 적절히 C++ 코드를 작성한다.
매크로 떡칠이라 깔끔하진 않다.

이건 컴파일해서 /usr/share/postgresql 같은 공유 라이브러리용 경로에 둔다.

그리고 저걸 공유 라이브러리(.so)로 컴파일한 다음에, SQL에서 FFI로 호출하게 하면 된다.

control 파일에도 공유 라이브러리 로딩을 위한 경로 지정이 추가된다.

그러면 마찬가지로 extension을 설치해서 사용할 수 있게 될 것이다.

코드 구성 참조
https://github.com/myyrakle/oddments/tree/master/SQL_Boilerplates/PostgreSQL/extensions/hello-with-ffi




Rust

Rust에는 PostgreSQL 확장 개발만을 위한 라이브러리까 따로 또 있다.
매크로 범벅 C의 번잡스런 구성을 좀 더 간편하게 구현하고 배포할 수 있게끔, 예쁘게 말아준 것이다.
https://github.com/pgcentralfoundation/pgrx
꽤 괜찮은 것 같더라.



참조
https://github.com/IshaanAdarsh/Postgres-extension-tutorial/blob/main/SGML/intro_and_toc.md
https://oneuptime.com/blog/post/2026-01-30-postgresql-extension-development/view