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 Gem1.6.0부터는PQcancelStart및PQcancel함수를 사용하여 이 문제를 해결했습니다.- 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까지 백포트되었습니다.
- PostgreSQL 18부터 파티션 테이블에 대한
2. 신기능 대응
pg_stat_statements개선:- PostgreSQL 18은
pg_stat_statements에서IN절 인수의 개수가 달라도 유사한 쿼리를 통합하여 통계 정보의 ‘오염’을 줄이는 기능을 도입했습니다. 발표자는 PostgreSQL 패치 검토 및 Rails 사용 사례 제공으로 이 개선에 기여했습니다.
- PostgreSQL 18은
- 가상 생성 열(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 커뮤니티의 충분한 논의와 안정성 검증 후 보수적으로 반영하는 전략을 취합니다.