Rails 8의 복합 기본 키(CPK) 네이티브 지원: 진화와 활용 전략

Rails Native Composite Primary Keys: A Complete Evolution from Rails 3 to Rails 8

작성자
발행일
2025년 12월 10일

핵심 요약

  • 1 Rails 8은 기존 단일 컬럼 ID 방식의 한계를 극복하고, 여러 속성을 조합한 복합 기본 키(CPK)를 프레임워크 수준에서 네이티브로 지원합니다.
  • 2 새로운 CPK API는 ActiveRecord 모델의 식별자 정의부터 라우팅, 파라미터 처리까지 일관된 흐름을 제공하여 도메인 기반의 견고한 시스템 설계를 가능하게 합니다.
  • 3 기존 `composite_primary_keys` gem 사용자는 Rails 8 업그레이드 시 네이티브 CPK의 기능 범위와 사용 사례를 면밀히 검토하여 점진적인 마이그레이션 전략을 수립해야 합니다.

도입

복합 기본 키(CPK)는 엔터프라이즈 데이터베이스, 분석 시스템, 장부 테이블 등 많은 실제 환경에서 둘 이상의 속성을 사용하여 엔티티의 ID를 모델링할 때 필수적인 기능입니다. 오랫동안 Rails는 단일 정수 `id` 컬럼을 기본으로 가정하여 애플리케이션이 이에 맞춰야 했지만, Rails 8부터는 이러한 패러다임이 변화합니다. 이제 Rails는 외부 gem이나 기존 컨벤션을 크게 변경하지 않고도 다중 컬럼으로 구성된 ID를 기본적으로 이해하고 처리할 수 있게 되었습니다. 이 글에서는 Rails의 ID 모델 진화 과정, CPK의 중요성, 새로운 API 사용법, 그리고 기존 gem 기반 시스템에서 네이티브 CPK 지원으로의 마이그레이션 전략을 상세히 다룹니다.

Rails ID 모델의 간략한 역사

  • 초기 Rails: id라는 단일 정수 컬럼을 모든 테이블의 기본 키로 사용했으며, 이는 자동 증가하고 라우팅, 폼 바인딩, 연관 관계의 핵심 역할을 했습니다. 대부분의 CRUD 애플리케이션에는 효과적이었으나, invoice_id + line_number 또는 tenant_id + user_id와 같은 도메인 중심의 복합 식별자가 필요한 경우 문제가 발생했습니다.

  • composite_primary_keys Gem: Rails가 복합 식별자를 기본적으로 지원하지 않음에 따라, composite_primary_keys gem이 등장하여 이 간극을 메웠습니다. 이 gem은 복합 키의 필요성을 입증했지만, Rails 자체는 단일 id 정책을 고수했습니다.

Rails 6 및 7의 변화

  • UUID 기본 키: id: :uuid 옵션을 통해 기본 키를 비숫자형으로 선언할 수 있게 되었습니다.

  • 커스텀 기본 키 이름: self.primary_key = :iso_code와 같이 기본 키 이름을 사용자 정의할 수 있게 되어, ID가 기계 생성된 값이 아닌 의미 있는 값일 수 있음을 인정했습니다. 그러나 여전히 기본 키는 단일 스칼라 값으로 예상되었습니다.

Rails 8의 결정적인 변화

  • ActiveRecord의 CPK 수용: Rails 8은 ActiveRecord가 id= 및 파라미터 직렬화를 통해 복합 기본 키를 수용할 수 있도록 하는 핵심적인 아키텍처 변경을 도입했습니다. 이제 ID를 튜플로 정의할 수 있습니다.
    • 예시: create_table :users, id: false do |t| t.primary_key [:tenant_id, :user_id]class User < ApplicationRecord; self.primary_keys = :tenant_id, :user_id; end와 같이 모델과 DB에 복합 키를 정의할 수 있습니다.
    • User.find(["acme", "john_doe"])와 같이 복합 ID를 사용하여 레코드를 찾을 수 있으며, user.id["acme", "john_doe"]를 반환합니다.
  • 합리적인 라우팅: user.to_param"acme:john_doe"와 같이 인코딩되고, GET /users/acme:john_doe와 같은 URL을 통해 User.find(params[:id])로 복합 ID를 자동으로 디코딩하여 조회할 수 있게 되었습니다.

Rails 8 네이티브 CPK의 강점 및 한계

  • 강점: 다중 컬럼 기본 키 정의, id=를 통한 ID 처리, to_param 인코딩 및 파싱, 컨트롤러에서의 파라미터 재구성, findexists? 작업에서의 복합 ID 사용 등 ID 처리에 일관성을 제공합니다.

  • 한계: 단일 PK를 예상하는 연관 관계는 변경되지 않았으며, 깊게 중첩된 조인 테이블, 다형적 연관 관계, ActiveRecord 쿼리 헬퍼 등은 여전히 보수적으로 작동합니다. Rails 8은 마법 같은 CPK 프레임워크가 아닌, 견고한 네이티브 ID 기반을 제공하는 데 중점을 둡니다.

composite_primary_keys Gem에서 네이티브 Rails로의 마이그레이션 전략

  1. 데이터베이스에서 ID를 실제화: 대리(surrogate) 정수 키 대신 t.primary_key [:customer_id, :service_code]와 같이 데이터베이스 수준에서 복합 기본 키를 정의합니다.

  2. 모델로 ID 이동: self.primary_keys = :customer_id, :service_code를 설정하고, find_by_identity와 같은 사용자 정의 헬퍼를 제거합니다.

  3. 컨트롤러에서 파라미터 ID 활용: params[:customer]params[:service]를 개별적으로 사용하는 대신, @subscription = Subscription.find(params[:id])를 사용하여 Rails가 인코딩된 형식을 자동으로 해석하도록 합니다.

  4. Gem 의미론 점진적 폐지: ID 배열을 일급 객체로 취급하거나 추가적인 조인 구문, 사용자 정의 파인더 API 등 gem이 도입했던 패턴들을 점진적으로 제거합니다.

네이티브 지원의 충분성 및 Gem의 필요성

  • 네이티브 지원으로 충분한 경우: 2~3개 컬럼 키, 얕은 연관 관계, 스키마 소유, 다형적 CPK가 필요 없는 경우, ID가 비즈니스 의미를 전달하는 경우 등 대부분의 현대적인 사용 사례를 커버합니다.

  • Gem이 여전히 정당화되는 경우: Oracle/DB2 마이그레이션과 같은 레거시 엔터프라이즈 시나리오, 다차원 이력 키, 5개 이상의 컬럼 ID, 복합 외래 키를 사용하는 다대다 연관 관계 등 복잡한 도메인에서는 여전히 gem이 유용합니다.

Rails 8 호환성 참고

  • 2025년 12월 현재 composite_primary_keys gem은 Rails 8을 지원하지 않습니다. 따라서 Rails 8로 업그레이드할 팀은 네이티브 CPK 지원이 요구 사항에 부합하는지 평가하고, 필요한 경우 네이티브 지원으로 마이그레이션하는 것을 고려해야 합니다.

결론

Rails 8의 복합 기본 키 네이티브 지원은 Rails의 ID 모델에 있어 중요한 진보를 의미합니다. 이는 단순한 기능 추가를 넘어, 실제 세계의 복잡한 데이터 모델을 Rails 애플리케이션 내에서 보다 자연스럽고 일관되게 표현할 수 있는 견고한 기반을 제공합니다. 개발자는 이제 도메인 식별자를 명확하게 정의하고, 이를 모델, 라우팅, 컨트롤러 전반에 걸쳐 일관되게 활용할 수 있게 되어 애플리케이션의 견고성과 가독성을 향상시킬 수 있습니다. 기존 `composite_primary_keys` gem 사용자는 Rails 8로의 전환을 기회 삼아, 네이티브 CPK 지원의 이점을 활용하여 시스템을 단순화하고 장기적인 유지보수성을 높이는 방향을 모색해야 합니다. 이는 Rails 생태계가 실제 엔지니어링 요구사항에 발맞춰 진화하고 있음을 보여주는 중요한 사례입니다.

댓글 0

로그인이 필요합니다

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

로그인 하러 가기

아직 댓글이 없습니다

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