[Database] MySQL과 PostgreSQL, 어느 것을 사용할까요?

DB의 트렌드

 

데이터베이스를 구분할 때, 보통 관계형 데이터베이스(RDBMS)비관계형 데이터베이스(NoSQL)로 나눠볼 수 있습니다. 이 두 가지 데이터베이스 모델은 각각 고유한 장점과 특성을 가지고 있기 때문에, 무엇이 더 좋다거나 나쁘다고 단정 짓기는 어렵습니다. 각각의 시스템은 사용 환경이나 요구 사항에 따라 다르게 선택되어야 하며, 어떤 데이터베이스가 더 적합할지는 상황에 따라 달라집니다.

 

이번 글에서는 그중 관계형 데이터베이스(RDBMS)에 대해 집중적으로 다뤄보겠습니다.

 

간단히 말하자면, RDBMS는 확장성과 유연성에서 부족함이 있을 수 있고, 대규모 데이터를 처리할 때 성능 문제도 발생할 수 있습니다. 하지만, 그럼에도 불구하고 RDBMS는 ACID 트랜잭션을 지원하고, 테이블 간 관계 설정을 통해 복잡한 쿼리를 처리할 수 있는 강력한 기능을 제공합니다. 또한, 권한 관리보안 기능이 잘 되어 있어 중요한 데이터를 안전하게 관리할 수 있습니다.

 

RDBMS에는 다양한 종류가 있지만, 그중에서 많이 사용되는 데이터베이스를 살펴보면, MySQLPostgreSQL이 대표적입니다. 이 두 데이터베이스는 오랜 시간 동안 사용되어 왔고, 그동안의 인기도 차이가 있었습니다.

 

출처 : https://survey.stackoverflow.co/2022/#technology
출처 : https://survey.stackoverflow.co/2023/#technology
출처 : https://survey.stackoverflow.co/2024/technology/

 

차례로 2022, 2023, 2024 년도의 StackOverFlow의 데이터베이스 선호도 조사입니다.

2022년 StackOverflow의 데이터베이스 선호도 조사에 따르면, MySQL이 약 3% 차이로 앞섰습니다. 그러나 2023년에는 PostgreSQL이 약 4.5%로 MySQL을 추월했고, 2024년에는 그 차이가 8.5%로 벌어지게 되었습니다. 이러한 추세는 PostgreSQL이 점점 더 많은 개발자들 사이에서 인기를 끌고 있음을 보여줍니다.

 

출처 : https://db-engines.com/en/ranking_trend

 

또한 DB-Engines 랭킹을 보면, 기존의 점유율이 높던 RDBMS의 비율이 점차 줄어드는 추세입니다. 이는 PostgreSQL로의 마이그레이션 비율이 늘어나고 있다는 것을 짐작할 수 있습니다.

 

그렇다면 MySQL과 PostgreSQL은 구체적으로 어떤 차이점이 있을지 알아보도록 하겠습니다.

 

 

 

기능 비교

 

MySQL과 PostgreSQL의 역사에 대해 간단히 살펴본 후, 두 데이터베이스의 기능적 차이를 비교해 보겠습니다.

 

MySQL은 1995년에 출시되었으며, 2008년에 Sun Microsystems에 인수되었고, 2010년에는 Oracle이 Sun Microsystems를 인수하면서 MySQL은 Oracle의 소유가 되었습니다. 현재는 Oracle에 의해 관리되지만, 여전히 오픈 소스 라이센스를 유지하고 있습니다.

 

PostgreSQL은 1996년에 출시되었으며, 확장성, SQL 표준 준수, 복잡한 데이터 구조 지원을 강점으로 하여 현재 가장 많이 사용되는 데이터베이스 중 하나로 자리 잡았습니다.

 

이제, 두 데이터베이스 시스템의 기능적 차이를 살펴보겠습니다.

 

 

데이터 타입

 

두 데이터베이스의 데이터 타입은 전체적으로 유사하지만, 배열, JSON, TIMESTAMP와 같은 일부 기능에서 차이가 있습니다. 이를 기준으로 살펴보겠습니다.

 

》 배열

MySQL은 배열을 기본적으로 지원하지 않지만, PostgreSQL ARRAY 타입을 제공하여 데이터를 배열 형태로 저장할 수 있습니다.

 

》 JSON

MySQL은 기본적인 JSON 타입만 지원하는 반면, PostgreSQL은 JSON 데이터를 이진 형식으로 저장할 수 있는 JSONB를 지원하여 읽기, 쓰기 및 쿼리 성능이 뛰어납니다.

 

》 TIMESTAMP

MySQL의 TIMESTAMP는 자동으로 UTC 타임존으로 저장되며, 클라이언트의 시간대에 맞게 자동으로 변환되어 읽습니다. 반면, PostgreSQLTIMESTAMPTZ는 시간대 정보를 명시적으로 지정하여 저장할 수 있어, 시간대 일관성을 유지할 수 있습니다.

 

 

복제(Replication)

 

복제(Replication)이란 데이터베이스의 데이터를 다른 서버에 복사하여 동일한 데이터를 여러 곳에 유지하는 기술로, 이를 통해 데이터의 가용성과 안정성을 높일 수 있습니다.

 

MySQL은 기본적으로 마스터-슬레이브 복제 모델을 제공하며, 마스터 서버에서 발생한 모든 데이터 변경 사항을 실시간으로 슬레이브 서버에 복제합니다. 또한, 두 개 이상의 마스터 서버가 서로 데이터를 복제하는 마스터-마스터 복제 모델도 지원합니다. 복제 환경을 설정하는 것이 비교적 간단하고 빠르게 구축할 수 있다는 장점이 있습니다.

 

PostgreSQL스트리밍 복제를 통해 기본적인 마스터-슬레이브 복제 모델을 제공하며, 추가적으로 Logical Replication을 통해 특정 테이블이나 데이터베이스를 선택적으로 복제할 수 있는 유연성을 제공합니다. 이로 인해 더 세밀한 복제 옵션과 유연성을 제공한다는 장점이 있습니다.

 

 

스토리지 엔진

 

스토리지 엔진이란 데이터베이스에서 데이터를 저장하고 관리하는 방식을 정의하는 소프트웨어 구성 요소입니다.

 

MySQLInnoDBMyISAM 이라는 두 가지 엔진을 제공합니다. 반면, PostgreSQL단일 스토리지 엔진을 사용합니다. 이 세 가지 엔진을 다음의 표를 통해 간단히 비교해 보겠습니다.

 

 

Row 레벨 Lock과 MVCC Lock의 차이점과 ACID 지원의 차이를 좀 더 명확히 설명하겠습니다.

 

Row 레벨 Lock은 특정 행에 대해 잠금을 적용하여 동시에 여러 트랜잭션이 서로 다른 행을 수정할 수 있도록 하는 방식입니다. 이 방식은 주로 단순한 쓰기 작업에서 성능이 뛰어나며, 특정 데이터에 대한 수정이 필요할 때 유리합니다. 그러나 읽기 작업 중에도 쓰기 잠금이 발생할 수 있어 동시성에서 다소 제약이 있을 수 있습니다.

 

MVCC는 다중 버전 동시성 제어(Multi-Version Concurrency Control)를 의미하며, 데이터베이스에서 트랜잭션 간의 충돌을 최소화하고 읽기 성능을 향상하기 위해 데이터의 여러 버전을 유지합니다. MVCC는 주로 복잡한 쿼리에서의 읽기 작업에서 강력한 성능을 발휘하며, 트랜잭션 간에 충돌을 피하기 위해 각 트랜잭션이 특정 데이터의 독립적인 버전을 읽도록 합니다. 이 방식은 트랜잭션이 데이터를 수정할 때만 잠금이 발생하므로 읽기 작업은 다른 트랜잭션에 영향을 주지 않습니다.

 

ACID 지원 트랜잭션의 4가지 특성(Atomicity, Consistency, Isolation, Durability)을 보장하는 것을 의미합니다. 이와 달리  ACID 완벽 지원이란, 트랜잭션 처리 시 더 정교하고 강력한 동시성 제어 및 격리 수준을 제공하여 데이터의 일관성과 안정성을 보장하는 것이라고 할 수 있습니다. 완벽 지원을 통해 시스템은 높은 수준의 동시성 제어를 제공하며, 트랜잭션 간의 충돌을 최소화하고, 데이터가 항상 정확하고 일관되게 유지되도록 합니다.

 

 

GIS 지원 및 확장성

 

GIS(Geographic Information System)는 지리적 데이터를 수집, 저장, 분석하고 시각화하는 시스템입니다.

MySQL은 기본적인 공간 연산을 지원하지만, PostgreSQLPostGIS라는 확장 모듈을 통해 강력한 GIS 기능을 제공합니다. 또한, 고급 기능 면에서도 MySQL은 제한적인 확장만을 지원하는 반면, PostgreSQL다양한 확장을 지원하여 훨씬 더 유연하고 강력한 기능을 제공합니다.

 

 

보안

 

》 인증 방식

PostgreSQL이 더 많은 인증 방식을 제공하며, 외부 인증 방법도 지원합니다.

 

》 암호화

MySQL은 SSL/TLS를 통한 통신 암호화는 제공하지만, 데이터베이스 자체 암호화 기능은 제공하지 않습니다.

반면 PostgreSQL은 SSL/TLS를 통한 통신 암호화뿐만 아니라, 확장 모듈을 이용하여 데이터 암호화가 가능합니다.

 

》 권한 관리

MySQL은 비교적 간단하고 직관적인 권한 관리 시스템을 제공하지만, 일부 세부적인 권한 제어에서 제한이 있을 수 있습니다.

PostgreSQL은 더 세밀한 권한 관리 기능을 지원하며, 특히 행 수준 보안(RLS) 기능을 통해 사용자가 특정 행에만 접근할 수 있도록 제한할 수 있습니다.

 

》 감사 로그

MySQL은 기본적으로 감사 로그 기능을 제공하지 않지만, 플러그인을 통해 활성화할 수 있습니다.

PostgreSQL기본적으로 감사 로그 기능을 제공하며, 추가적인 확장 모듈을 통해 더 상세한 감사 로그를 기록할 수 있습니다.

 

 

 

라이센스 비교

 

앞서 데이터 타입, 복제, 엔진, 확장성, 보안 측면에서 두 데이터베이스를 비교했으니, 이번에는 라이센스 측면에서 MySQL과 PostgreSQL을 비교해 보겠습니다.

 

라이센스(License)란 소프트웨어의 사용, 수정, 배포에 대한 조건을 정의하는 법적 계약입니다.

MySQLGNU General Public License(GPL) V2 라이센스를 채택하고 있으며, PostgreSQLPostgreSQL License를 채택하고 있습니다. 이제 각 라이센스에 대해 좀 더 자세히 살펴보겠습니다.

 

 

GNU General Public License(GPL) V2

 

GPL V2 라이센스는 오픈 소스 라이센스 중 하나로, 사용자가 소프트웨어를 자유롭게 사용, 수정, 배포할 수 있지만, 수정된 코드를 배포할 경우 그 수정본도 반드시 GPL V2 라이센스 하에 배포해야 합니다. 또한, 다른 소프트웨어와 결합하여 배포할 경우, 해당 소프트웨어의 수정본도 오픈 소스로 제공해야 합니다.

또한, 법적 책임은 소프트웨어 제공자에게 부과되지 않으며, 사용자가 이를 부담하게 됩니다.

 

Oracle에서는 MySQL의 상용 버전도 제공하지만, 이 상용 버전은 GPL 조건을 따르지 않아 소스 코드 공개 의무가 없습니다. 

 

 

 

PostgreSQL License

 

PostgreSQL License는 MIT 라이센스와 유사한 매우 자유로운 오픈 소스 라이센스입니다. 사용자는 소프트웨어를 자유롭게 사용, 수정, 배포할 수 있으며, 수정된 소프트웨어를 상용 소프트웨어에 포함시키거나 소스 코드를 공개하지 않고 배포할 수 있습니다. 이는 GPL V2와 달리 수정된 소프트웨어의 소스 코드 공개 의무가 없기 때문입니다. 다만, 원본 저작권과 라이센스를 명시해야 합니다.

또한, 법적 책임은 소프트웨어 제공자에게 부과되지 않으며, 사용자가 이를 부담하게 됩니다.

 

 

 

마치며

 

이번 글에서는 가장 많이 사용되는 관계형 데이터베이스인 MySQL과 PostgreSQL을 비교해 보았습니다. 비교를 통해 PostgreSQL의 선호도가 증가하는 이유를 알 수 있었지만, 결국 중요한 것은 상황에 맞는 데이터베이스를 선택하는 것이라고 생각합니다. 각 데이터베이스의 특징을 잘 살펴보고, 프로젝트의 요구사항에 맞는 적합한 선택을 하는 것이 중요하다고 여겨집니다.