아키텍처 개요

PostgreSQL의 Extension 소개

PostgreSQL은 확장성이 뛰어난 오픈소스 데이터베이스로 잘 알려져 있다. 이러한 명성을 이루는 데에는 PostgreSQL의 기능을 유연하게 확장할 수 있는 Extension Framework가 큰 역할을 한다. Extension을 활용한 기능 확장은 PostgreSQL의 다양한 데이터 타입 및 함수 지원을 가능하게 하며, 더 나아가 내부 기능의 개선도 가능하다.

Extension의 중요한 특징은 PostgreSQL 인스턴스에 동적으로 로딩 된다는 점이다. 즉, PostgreSQL에서는 Extension을 통해 새로운 기능을 추가할 때 소스를 다시 빌드하거나 실행 파일을 교체할 필요가 없다. 인스턴스 기동 시 초기화 작업이 필요한 Extension을 제외하면, Extension을 추가할 때 인스턴스를 다시 기동하는 일도 필요 없다. 이러한 점 때문에 PostgreSQL에서는 새로운 기능을 추가하는 작업이 매우 간편하다.


O2 Extensions 소개

O2는 OpenSQL for Oracle의 약어로, Oracle 데이터 타입, 뷰, 내장 함수 및 내장 패키지를 호환해주는 Extension의 집합이다. O2는 오픈소스 프로젝트인 Orafce를 기반으로 시작되었지만, 다양한 방면에서 많은 변화가 있다. 원래 하나의 Extension으로 관리되었던 Orafce를 여러 개의 Extension으로 분리했다.

O2 Extensions에는 아래 Extension이 포함되어 있다.

  • O2Types: Oracle 데이터 타입 호환 Extension

  • O2Views: Oracle 뷰 호환 Extension

  • O2Functions: Oracle 내장 함수 호환 Extension

  • Package Extensions: Oracle 내장 패키지 호환 Extension 모음

    • DBMS_ALERT

    • DBMS_OUTPUT

    • DBMS_PIPE

    • DBMS_RANDOM

    • DBMS_SQL

    • UTL_FILE

O2 프로젝트는 오픈소스 프로젝트인 Orafce를 기반으로 시작되었지만, 다양한 방면에서 많은 변화가 있었다. 원래 하나의 Extension으로 관리되었던 Orafce를 여러 개의 Extension으로 분리하여, 패치 작업의 유연성을 크게 향상 시켰다. 또한, 오랜 기간 동안 점진적으로 개발되면서 공통된 컨벤션이나 프레임워크의 부재가 문제였는데, 이를 통합하는 과정에서 개선시켰다.


O2 Extensions 장점과 개선 사항

SQL, PL/pgSQL로 작성된 사용자 정의 함수를 C 코드로 변경

O2 Extension에서 제공하는 내장 함수나 패키지는 내부적으로 사용자 정의 함수(UDF)로 구성되어 있다.PostgreSQL은 사용자 정의 함수를 작성할 때 SQL, PL/pgSQL뿐만 아니라 C/C++, Python, Perl, Rust 등 다양한 프로그래밍 언어를 지원한다. O2 Extension은 특히 SQL 및 PL/pgSQL로 작성된 사용자 정의 함수를 C 코드로 변경하여 성능을 향상시켰다. PostgreSQL Query 실행 엔진이 SQL이나 PL/pgSQL로 작성된 UDF를 실행할 때 내부적으로 커서를 생성하여 서브쿼리를 실행하지만, C 코드로 작성된 함수는 컴파일 된 라이브러리에서 직접 실행되므로 빠른 성능을 보장한다. 또한, C 코드로 구현하면 PostgreSQL 라이브러리를 활용하여 더 정교하고 유연한 구현이 가능하다.

Extension을 여러 개로 나누어 Blast Radius 감소

기존 Orafce는 하나의 Extension으로 관리되었기 때문에, 전체 구현 중 하나의 요소에 문제가 발생하면 전체 Extension을 업데이트해야 했다. 반면, O2는 여러 개의 Extension으로 나누어 관리함으로써, 문제가 발생한 Extension만 교체하면 된다. 예를 들어, DBMS_ALERT나 DBMS_PIPE와 같이 공유 메모리를 사용하는 패키지는 shared_preload_libraries에 추가하여 DB 인스턴스를 기동해야 하는데, O2의 경우 이들 Extension이 별도로 분리되어 있어 필요한 Extension만 shared_preload_libraries에 추가하면 되도록 개선했다. 이를 통해 업데이트 시 번거로움을 줄이고 유연성을 높였다.

이와 같은 개선 사항들은 O2 Extension이 PostgreSQL 사용자들에게 더 강력하고 유연한 Oracle 호환 기능을 제공할 수 있게 한다. O2 Extension의 도입으로 인해 성능, 유연성, 안정성이 크게 향상되었다.

Last updated