Rails의 PostgreSQL 18 대응 전략

RailsのPostgreSQL 18対応 / Yasuo Honda - Kaigi on Rails 2025

작성자
Kaigi on Rails
발행일
2025년 11월 25일

핵심 요약

  • 1 Rails는 PostgreSQL 18 버전 호환성 및 신기능(가상 생성 열 등) 지원을 위해 PG Gem 의존성 관리 및 내부 API 변경 등 다각적인 업데이트를 진행했습니다.
  • 2 PostgreSQL 18의 프로토콜 변경(긴 취소 키 지원)에 따라 PG Gem 1.6.0 이상 버전 사용을 권장하며, Rails는 내부적으로 취소 로직을 조정하여 하위 PG Gem 버전과의 호환성도 유지했습니다.
  • 3 PostgreSQL 18의 가상 생성 열(Virtual Generated Columns) 지원으로 Rails는 데이터베이스 어댑터 간 생성 열 API 동작을 통일하고, Rails 8.1부터 해당 기능을 활용할 수 있게 되었습니다.

도입

본 프레젠테이션은 Rails 커미터인 혼다 야스오가 PostgreSQL 18 릴리스에 맞춰 Rails의 PostgreSQL 지원 현황을 설명합니다. 9월 25일 출시된 PostgreSQL 18에 대한 Rails의 버전 호환성 및 신기능 지원 방안이 주요 내용이며, Rails의 유지보수 정책에 따라 신기능 및 버그 수정 관점에서 '대응'의 의미를 정의합니다. Rails는 PostgreSQL 9.3 이상 버전을 지원하며, 새로운 버전 출시 시 기존 동작의 일관성을 유지하는 것을 목표로 합니다.

Rails의 PostgreSQL 지원은 PostgreSQL 어댑터, PG Gem(Ruby-C 바인딩), 그리고 libpq(PostgreSQL 클라이언트 라이브러리)의 세 가지 주요 요소로 구성됩니다. PostgreSQL 18에 대한 Rails의 대응은 크게 두 가지 관점에서 이루어졌습니다.

1. 버전 호환성 대응

  • 프로토콜 버전 업데이트 및 취소 키 길이 변경:
    • PostgreSQL은 오랫동안 프로토콜 버전 3.0을 사용해왔으나, 취소 키(Cancel Key)가 4바이트 고정으로 잠재적 취약점이 있었습니다.
    • PostgreSQL 18은 프로토콜 3.2를 도입하여 최대 256바이트의 긴 취소 키를 지원합니다.
    • PG Gem의 1.5.9 이하 버전은 긴 취소 키를 지원하지 않아 쿼리 취소 문제가 발생했습니다. PG Gem 1.6.0부터는 PQcancelStartPQcancel 함수를 사용하여 이 문제를 해결했습니다.
    • Rails는 PG Gem의 최소 버전을 1.6으로 강제하기 어려웠으므로, cancel_any_running_query와 같은 내부 비공개 API에서 `PG::Connection

cancel` 호출을 생략하는 방식으로 대응했습니다. 이는 트랜잭션 롤백이 주 목적이므로 쿼리 취소 실패가 큰 문제가 되지 않는다는 판단에 따른 것입니다.

*   이 변경 사항은 Rails 8.0.3 및 8.1.0 베타 1에 포함되었으며, PostgreSQL 18 사용자에게는 `PG Gem` 1.6 이상 버전 사용을 권장합니다.
  • 파티션 테이블 UNLOGGED 지원 제거:
    • PostgreSQL 18부터 파티션 테이블에 대한 UNLOGGED 모드 지원이 삭제되었습니다. UNLOGGED 테이블은 WAL(Write-Ahead Log)을 기록하지 않아 쓰기 성능은 좋지만, 충돌 시 데이터 손실 위험이 있습니다.
    • Rails는 프레임워크 테스트 속도 향상을 위해 파티션 테이블에 UNLOGGED를 사용했으나, PostgreSQL 18과의 호환성을 위해 LOGGED로 생성하도록 변경했습니다. 이 변경은 Rails 7.1까지 백포트되었습니다.

2. 신기능 대응

  • pg_stat_statements 개선:
    • PostgreSQL 18은 pg_stat_statements에서 IN 절 인수의 개수가 달라도 유사한 쿼리를 통합하여 통계 정보의 ‘오염’을 줄이는 기능을 도입했습니다. 발표자는 PostgreSQL 패치 검토 및 Rails 사용 사례 제공으로 이 개선에 기여했습니다.
  • 가상 생성 열(Virtual Generated Columns) 지원:
    • 생성 열(Generated Columns)은 다른 열의 값으로부터 계산된 값을 저장하는 열입니다. PostgreSQL 12는 저장 생성 열(Stored Generated Columns, 디스크에 저장)만 지원했으나, PostgreSQL 18부터는 가상 생성 열(Virtual Generated Columns, 정의만 저장하고 조회 시 계산)을 기본으로 지원합니다.
    • Rails는 기존 PostgreSQL 12 지원 시 store: true 옵션을 필수로 요구했으나, PostgreSQL 18의 가상 생성 열 지원을 통해 store: false 옵션 및 store 옵션 생략(가상 생성 열 기본)을 허용하여 다른 데이터베이스 어댑터와의 API 일관성을 확보했습니다.
    • 이 기능은 발표자가 직접 Pull Request(55142)를 통해 구현했으며, PostgreSQL 18의 정식 릴리스와 함께 Rails 8.1에 포함되었습니다.
    • Rails는 새로운 데이터베이스 기능 도입에 있어 PostgreSQL 커뮤니티의 충분한 논의와 안정성 검증 후 보수적으로 반영하는 전략을 취합니다.

결론

Rails는 PostgreSQL 18의 출시와 함께 버전 호환성 및 신기능 지원을 위한 적극적인 업데이트를 완료했습니다. 특히 PG Gem의 취소 키 문제 해결을 위한 내부 로직 조정과 PostgreSQL 18의 가상 생성 열 지원을 통한 Rails API 통일은 주목할 만합니다. 이러한 노력으로 Rails 개발자들은 PostgreSQL 18의 새로운 기능과 개선된 성능을 Rails 8.1부터 안정적으로 활용할 수 있게 되었습니다. 이는 Rails가 다양한 데이터베이스 환경에서 일관된 개발 경험을 제공하려는 지속적인 노력을 보여주는 사례입니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!