PostgreSQL에서 오라클 사용자를 위한 가이드. 0 0 2,899

by 임군 [PostgreSQL 노하우/팁/자료] POstgreSQL Oracle Migration [2024.07.09 17:14:53]


1. PostgreSQL 과 Oracle의 태생적 차이

PostgreSQL과 Oracle DBMS는 각각의 태생적 배경과 철학에 따라 다른 방향으로 발전해왔습니다. PostgreSQL은 커뮤니티 중심의 오픈 소스 프로젝트로 유연성과 확장성이 뛰어나며, Oracle은 상업용 데이터베이스로서 고가용성과 보안을 중시하는 방향으로 발전했습니다. 이러한 차이는 두 DBMS의 기능과 사용 사례에 영향을 미치며, 사용자가 선택하는 기준이 되기도 합니다.

 

1.1 PostgreSQL의 태생

1.1.1.역사와 배경

 PostgreSQL은 1986년 캘리포니아 대학교 버클리에서 시작된 POSTGRES 프로젝트에서 기원했습니다.

 원래의 목적은 기존의 Ingres 데이터베이스 시스템을 개선하는 것이었으며, 1996년에 SQL을 지원하게 되면서 PostgreSQL로 이름이 변경되었습니다.

 그 태생적인 배경은 유연성과 확장성, 높은 표준 준수 및 안정성을 강조하는 설계 철학을 반영하고 있습니다. 

오픈 소스 커뮤니티에 의해 개발되었으며, 현재도 글로벌 커뮤니티 중심으로 발전하고 있습니다.

이러한 오픈소스 특성 덕분에 PostgreSQL은 다양한 데이터베이스 애플리케이션에서 널리 사용되고 있습니다.
 

1.1.2.철학과 설계 원칙

 PostgreSQL은 BSD 라이선스로 시작하여 그를 계승한 독자적인 PostgreSQL License 를 만들어 사용하고 있습니다. 이는 누구나 자유롭게 소스 코드를 수정하고 배포할 수 있다는 것을 의미하며, 오픈 소스 철학을 따르기에 아래와 같은 특징이 있습니다.

 

 확장성: 사용자 정의 데이터 타입, 함수, 연산자 등을 지원하여 확장이 용이합니다.

 표준 준수: SQL 표준에 대한 높은 준수율을 자랑합니다.

 ACID 준수: 트랜잭션의 원자성, 일관성, 격리성, 지속성을 철저히 준수합니다.

 커뮤니티 중심 개발: 다수의 개발자와 사용자에 의해 지속적으로 기능이 추가되고 개선됩니다.

 PostgreSQL은 개발자 성향을 가진 사용자들을 대상으로 하기에 다양한 확장성을 지원합니다.

기본적으로 데이터 타입, 연산자들의 확장을 지원하고 또한 엔진부분에서 일부 사용자가 개입을 할수 있도록 Hook 메커니즘을 지원합니다. 아래는 PostgreSQL이 지원하는 Hook의 종류들입니다. 이런 Hook 및 다양한 확장 메커니즘을 통하여 다양한 Extension들이 존재하며 이련 Extension들과 함께 아래 그림과 같은 PostgreSQL Ecosystem을 이루고 있습니다.

General Hooks

Security Hooks

Function Manager Hooks

Planner Hooks

Executor Hooks

PL/pgsql Hooks

 

[PostgreSQL이 지원하는 확장 Hook]

[PostgreSQL Ecosystem]

 표준준수는 확장성과 함께 이야기 될 수 있습니다.

 오픈 소스 철학을 바탕으로 다양한 확장을 제공하기 위하여 DBMS Core 자체는 철저한 표준을 준수 하여야 합니다. 철저한 원칙 준수를 통하여 이를 확장 하였을시 이상 동작에 대한 위험성을 줄일 수 있습니다. PostgreSQL은 이런 SQL 과 같은 질의 표준 외에도 다음 장에서 설명할 데이터 처리에 대한 원칙도 철저히 준수하고 있습니다.

 

1.1.3.주요 특징

 PostgreSQL은 Vacuum 기반의 MVCC(다중 버전 동시성 제어)를 통한 높은 동시성 처리를 지원하고, JSON 및 JSONB 타입을 통한 NoSQL 기능을 제공합니다. 또한, JSONB는 빠른 검색을 위해 INDEX를 지원하며, 관련된 다양한 함수와 연산자를 제공합니다.(->, ->>, #>>, jsonb_set, jsonb_each)

 현재 PostgreSQL은 GIS 데이터 처리를 위한 PostGIS Extension과 AI 처리를 위한 Vector DB 확장을 제공하는 pgVector extension이 오픈 소스 커뮤니티에서 개발되고 있습니다.

 

1.2 Oracle의 태생

1.2.1. 역사

Oracle Corporation은 1977년 래리 엘리슨(Larry Ellison), 밥 마이너(Bob Miner), 에드 오츠(Ed Oates)에 의해 설립되었으며 설립 당시 회사의 이름은 Software Development Laboratories(SDL) 였습니다.

이 회사는 미국 중앙정보국(CIA)의 데이터베이스 프로젝트를 위해 설립되었으며, 이 프로젝트의 코드명이 “Oracle”로 시작되었습니다.

 초기 개발을 위해 설립자들은 관계형 데이터베이스의 가능성을 보고 IBM의 논문을 기반으로 한 관계형 데이터베이스 시스템을 개발하기로 하였고 이 논문은 에드거 F. 커드(Edgar F. Codd)의 관계형 모델에 대한 개념을 설명하고 있었습니다. 

 초기 버전은 IBM의 SQL 언어를 구현했으며, 상업적 목적으로 발매되었습니다.

 

1.2.2. 제품의 발전과 상용화

1979년, Oracle은 Oracle Version 2를 출시했습니다. 이는 세계 최초의 상용 SQL 기반 관계형 데이터베이스 관리 시스템이었습니다. 재미있게도, Version 1은 내부적으로 존재했지만 공식적으로 출시되지는 않았습니다.

1983년, Oracle은 Version 3를 출시했습니다. 이는 C 언어로 다시 작성되었고, 주요 운영 체제에서 사용할 수 있도록 설계되었습니다. 이 버전은 트랜잭션 처리와 다중 사용자 환경을 지원하는 기능을 포함하고 있었습니다.

 

1.2.3. 글로벌 확장과 기능 강화

Oracle은 계속해서 새로운 기능과 성능 개선을 포함한 버전을 출시했습니다. 특히 Oracle Version 4에서는 읽기 일관성을 제공했고, Version 5에서는 분산 쿼리를 지원했습니다. 1986년, Oracle은 주식 상장을 통해 자본을 확보하고 글로벌 시장으로의 확장을 가속화했습니다.

1992년에 출시된 Oracle 7은 성능과 관리 기능을 크게 향상시켰으며, 저장 프로시저와 트리거, PL/SQL 등 고급 기능을 도입했습니다. 이 버전은 기업 환경에서 널리 채택되어 Oracle을 주요 상용 DBMS로 자리매김하게 했습니다.

 

1.2.4. 21세기와 클라우드 컴퓨팅

2001년에 출시된 Oracle 9i는 인터넷 애플리케이션을 위한 기능을 강화했으며, Real Application Clusters(RAC)를 도입하여 고가용성과 확장성을 제공했습니다. 이 버전부터 Oracle은 “i”를 통해 “Internet”을 강조했습니다.

2013년에 출시된 Oracle 12c는 “c”가 클라우드를 의미하며, 멀티 테넌트 아키텍처를 도입하여 클라우드 환경에서의 효율성을 극대화했습니다. 이는 하나의 데이터베이스 인스턴스 내에서 여러 데이터베이스를 호스팅할 수 있는 기능을 제공하여 클라우드 서비스 제공자와 대규모 데이터 센터에서 유용했습니다.

Oracle은 지속적으로 새로운 기능과 보안 개선을 도입하고 있으며, 최근 버전에서는 인공지능(AI)과 머신러닝(ML) 기능을 데이터베이스에 통합하는 데 주력하고 있습니다. Oracle Autonomous Database는 자율 운영 기능을 통해 관리 작업을 자동화하고, 성능과 보안을 최적화합니다.

 

1.2.5 Oracle DBMS의 철학과 설계 원칙

 Oracle은 상업용 소프트웨어로서 안정성과 성능을 최우선으로 여깁니다. 이는 대기업과 금융기관 등에서 요구하는 성능과 신뢰성을 충족시키기 위해 설계되었습니다. 그 결과, Oracle은 다양한 산업 분야에서 상업적으로 큰 성공을 거두었습니다.

 Oracle은 RAC(Real Application Clusters)와 같은 고가용성 기능을 통해 대규모 트랜잭션을 처리할 수 있도록 설계되었습니다. 이를 통해 사용자들은 중단 없이 안정적으로 시스템을 운영할 수 있습니다.

 Oracle은 데이터 보안에 중점을 두어 다양한 보안 기능을 제공합니다. 이는 금융, 의료 등 민감한 데이터를 다루는 산업에서 특히 중요하며, Oracle의 보안 기능은 이러한 요구를 완벽히 충족시킵니다.

 Oracle은 ERP, CRM 등 다양한 기업 솔루션과의 통합을 고려하여 개발되었습니다. 이를 통해 기업은 하나의 통합된 시스템에서 모든 데이터를 관리할 수 있어 효율성을 극대화할 수 있습니다.

 Oracle은 또한 지속적인 기술 혁신을 통해 클라우드 기반 솔루션을 제공하며, 기업들이 더욱 유연하고 비용 효율적으로 데이터 관리를 할 수 있도록 지원하고 있습니다. 이를 통해 Oracle은 미래의 IT 환경 변화에도 능동적으로 대응하며, 고객들에게 최상의 서비스를 제공하고 있습니다.

 

2. PostgreSQL에서 데이터 핸들링

2.1 형(Type) 캐스팅에 대한 원칙

PostgreSQL은 개발된 언어인 C 언어와 유사한 원칙을 가지고 있습니다.

C 언어는 Low Level 언어로서, 철저한 표준과 원칙을 준수하여 이를 사용하는 사용자에게 이상 동작을 하지 않도록 유도합니다.

그중 형 캐스팅은 원래의 데이터 타입을 다른 데이터 타입으로 사용하였을때 명시적 혹은 암시적으로 내부에서 일어 나게 됩니다.

 

다음은 두 DBMS에서 타입 변환의 원칙입니다.

Oracle:

숫자와 문자열 간의 연산 및 비교에서 암시적 타입 변환을 허용합니다.

문자열을 날짜로 암시적으로 변환할 수 있습니다.

 

PostgreSQL:

숫자와 문자열 간의 연산 및 비교에서 암시적 타입 변환을 허용하지 않으며, 명시적 타입 변환을 요구합니다.

문자열을 날짜로 암시적으로 변환하지 않으며, 명시적 타입 변환을 요구합니다.

그밖의 예시는 아래와 같습니다.

 

예) 날짜와 숫자간의 연산

SELECT '2024/07/08'::date +1

결과]

2024-07-09

 

예) 날짜형 문자와 숫자간의 연산

SELECT '2024/07/08' + 1

결과]

ERROR:  invalid input syntax for type integer: "2024/07/08"

LINE 1: SELECT '2024/07/08' + 1

               ^ 

SQL state: 22P02

Character: 8

 

예) 실수형 문자와 숫자간의 비교

SELECT '1.23' = 1;

결과]

ERROR:  invalid input syntax for type integer: "1.23"

LINE 1: SELECT '1.23' = 1;

               ^ 

SQL state: 22P02

Character: 8

 

예)숫자와 Boolean 의 비교

SELECT 1 = true;

결과]

ERROR:  operator does not exist: integer = boolean

LINE 1: SELECT 1 = true;

                 ^

HINT:  No operator matches the given name and argument types. You might need to add explicit type casts. 

SQL state: 42883

Character: 10


2.2 Schema명에 대한 대소문자 처리

PostgreSQL은 Schema명에 대해 소문자로 처리하며, Oracle은 대문자를 우선하여 처리합니다.

Oracle:

PostgreSQL:

Schema명에 대해 특정하여 저장의 원한다면 따옴표로 묶어서 처리 해야 합니다.

예)

CREATE TABLE "TestTable" ("Column1" VARCHAR(20));

INSERT INTO "TestTable" ("Column1") VALUES ('Hello');

SELECT * FROM "TestTable" WHERE "Column1" = 'Hello';


3. 오라클 사용자가  PostgreSQL 사용시 주의점

Oracle DBMS 사용자가 PostgreSQL을 사용할 때 주의해야 할 점은 여러 가지가 있습니다. 이 두 데이터베이스 시스템은 많은 기능과 개념을 공유하지만, 세부적인 동작 방식과 기능 구현에서 차이가 있습니다. 주요 주의점을 아래와 같이 정리할 수 있습니다.

3.1  데이터 타입 관리

Oracle은 다양한 자동 형변환을 지원하지만, PostgreSQL은 엄격한 형변환 규칙을 따릅니다. PostgreSQL에서는 명시적 형변환을 더 자주 사용해야 합니다.

3.2. Null 처리와 ‘’(Empty String) 처리

 Oracle은 빈 문자열(’’)은 Null로 취급됩니다. 즉, 빈 문자열을 삽입하면 Null이 삽입되고, 빈 문자열을 비교하면 Null과 동일하게 취급됩니다.
예를 들어, 빈 문자열을 삽입하려고 하면 그 값은 Null로 저장됩니다. '' IS NULL은 참(True)입니다.

 PostgreSQL은 빈 문자열(’’)과 Null은 별개의 값으로 취급됩니다. 빈 문자열을 삽입하면 빈 문자열이 저장되고, 빈 문자열을 비교할 때는 실제로 빈 문자열과 비교됩니다.
빈 문자열은 빈 문자열로 저장되고, Null은 Null로 저장됩니다.’’' IS NULL은 거짓(False)입니다.

3.3. 함수와 패키지

Oracle의 패키지는 PostgreSQL에서는 기본적으로 제공되지 않습니다. PostgreSQL에서 비슷한 기능을 구현하려면 스키마와 여러 함수로 구성해야 합니다.
예시:

Oracle 패키지 예제:
CREATE OR REPLACE PACKAGE my_package AS
  PROCEDURE my_procedure;
END my_package;

PostgreSQL에서는 개별 함수로 구현:
CREATE FUNCTION my_function() RETURNS void AS $$
BEGIN
  -- 함수 본문
END;
$$ LANGUAGE plpgsql;

3.4. 시스템 뷰와 메타데이터

Oracle의 데이터 사전 뷰(ALL_TABLES, USER_TABLES, DBA_TABLES 등)와 PostgreSQL의 시스템 카탈로그(pg_tables, information_schema.tables 등) 간에 차이가 있습니다.
예시:

Oracle:
SELECT * FROM ALL_TABLES;

PostgreSQL:
SELECT * FROM pg_tables WHERE schemaname = 'public';

3.5. 데이터베이스 링크

Oracle의 DB 링크는 PostgreSQL에서 FDW(Foreign Data Wrapper)로 대체할 수 있습니다.
예시:

Oracle DB 링크:
CREATE DATABASE LINK my_link CONNECT TO remote_user IDENTIFIED BY password USING 'remote_db';

PostgreSQL FDW:
CREATE EXTENSION postgres_fdw;
CREATE SERVER foreign_server FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'remote_host', dbname 'remote_db');
CREATE USER MAPPING FOR local_user SERVER foreign_server OPTIONS (user 'remote_user', password 'password');
IMPORT FOREIGN SCHEMA public FROM SERVER foreign_server INTO local_schema;

4. 결론

이렇게 오라클과 PostgreSQL은 태생의 차이로 PostgreSQL은 표준과 원칙을 준수하며 확장위주로 발전하였으며 오라클은 상업용 용도로 편의성과 시장의 확장(Internet/Cloud/Grid)을 중심으로 발정 하였습니다.

Oracle 및 PostgreSQL의 사용자들은 타 DBMS를 사용할 때 이런 특징을 이해하고 사용한다면 한단계 더 발전된 DBMS 사용자가 될것입니다.

 

>> 참고 : 비트나인 블로그

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입