← 모든 글

PostgreSQL 과 MariaDB — 결제 도메인 선택

결제와 정산을 다루는 서비스에서 PostgreSQL 과 MariaDB 중 무엇을 선택할지 고민하는 과정과 우리가 최종적으로 선택한 이유를 정리한다.

왜 다시 고민했는가

기존에 MariaDB를 사용하던 서비스 일부를 재설계하면서 “지금 다시 선택한다면 어느 쪽인가”를 검토할 기회가 생겼다. 특히 결제와 정산처럼 금액 정밀도와 동시성이 중요한 도메인에서의 판단이 필요했다.

짧게 말하면, 우리는 결제 도메인에서 PostgreSQL을 선택했다. 이 글은 그 이유를 설명한다.

PostgreSQL 을 선택한 이유

DECIMAL 처리의 일관성: PostgreSQL의 NUMERIC 타입은 정밀도 손실 없이 금액을 저장한다. MariaDB의 DECIMAL도 명목상 비슷하지만 특정 연산에서 부동소수점으로 넘어가는 경우가 있었다. 금액 계산에서 0.01원 단위의 오차는 허용할 수 없다.

트랜잭션 격리 수준: PostgreSQL은 기본적으로 Read Committed이고, Serializable까지 표준을 잘 따른다. 특히 SELECT FOR UPDATE SKIP LOCKED를 사용한 작업 큐 패턴이 결제 처리에서 매우 유용했다. 동일 레코드를 여러 워커가 처리하지 않도록 하는 데 이 기능이 깔끔하게 동작했다.

JSON 지원과 인덱싱: 일부 결제 이력에서 PG사 응답을 JSON으로 저장하는데, PostgreSQL의 jsonb 타입과 GIN 인덱스 조합이 조회 성능에서 훨씬 유리했다.

MariaDB 가 더 나은 경우도 있다

공정하게 이야기하면 MariaDB가 더 적합한 상황도 있다.

팀 내 MariaDB 운영 경험이 훨씬 많고, 기존 레거시 시스템과 연동이 필요한 경우에는 MariaDB를 유지하는 것이 전환 비용보다 낫다. 또한 단순한 CRUD와 집계 정도의 요구사항이면 두 DB의 차이가 실질적으로 느껴지지 않는다.

마이그레이션에서 주의한 점

두 DB 간 마이그레이션은 생각보다 세밀한 부분이 많다. AUTO_INCREMENT vs SEQUENCE, DATETIME vs TIMESTAMPTZ, 문자셋 차이, 스토어드 프로시저 문법 차이 등이 있다. 우리가 마이그레이션 과정에서 가장 많이 소비한 시간은 타임존 처리였다. MariaDB의 DATETIME은 타임존 정보가 없고, PostgreSQL의 TIMESTAMPTZ는 UTC로 변환해 저장한다. 이 차이를 무시하면 나중에 이력 조회에서 시간이 어긋나는 문제가 생긴다.

결론

DB 선택은 기술 선호가 아니라 도메인 요구사항이 결정해야 한다. 결제와 정산 도메인에서는 정밀도, 동시성 제어, 트랜잭션 보장 수준이 핵심이었고, 그 기준에서 PostgreSQL이 우리 요구사항을 더 잘 충족했다.

— by slecs