Rails와 SQLite에서 UUID는 이렇게 어려워서는 안 됩니다 (그래서 gem을 만들었습니다)

발행: (2025년 12월 22일 오후 09:07 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

TL;DR – Rails + SQLite 앱에서 UUID / ULID

# Gemfile
gem "sqlite_crypto"
# migration
create_table :users, id: :uuid do |t|
  t.string :email
  t.timestamps
end

그게 전부입니다.
외래키는 자동으로 감지되고, schema.rb는 깔끔하게 유지되며, 모든 것이 바로 동작합니다.

[→ GitHub] | [→ RubyGems]

내가 마주한 문제

나는 Rails 8 앱을 만들고 있었고, SQLite를 프로덕션 데이터베이스로 사용했습니다(새로운 WAL‑mode 기본값, 향상된 busy‑handler 처리 등 덕분에). UUID 기본키를 추가하려고 했을 때, SQLite는 PostgreSQL과 전혀 다르게 동작했습니다.

무엇이 깨졌는가

이슈PostgreSQLSQLite (gem 사용 전)
기본키 선언enable_extension 'pgcrypto'id: :uuidschema.rbid: falsestring 컬럼이 덤프됨
외래키UUID 타입을 자동 감지INTEGER 컬럼이 생성돼 조인 불일치 발생
User.first시간 순서대로 가장 첫 레코드 반환무작위 UUID‑정렬 레코드 반환 (UUID v4는 시간 정렬되지 않음)
보일러플레이트없음type: :string, limit: 36와 커스텀 제너레이터를 일일이 지정해야 함

gem을 만들기 에 해야 했던 일

  1. 상세한 마이그레이션 구문

    create_table :users, id: false do |t|
      t.string :id, limit: 36, null: false, primary_key: true
      t.string :email
      t.timestamps
    end
  2. 모든 외래키에 대한 수동 타입 지정

    create_table :api_keys, id: false do |t|
      t.string :id, limit: 36, null: false, primary_key: true
      t.references :user, null: false, foreign_key: true,
                        type: :string, limit: 36
    end
  3. ApplicationRecord에 커스텀 UUID 생성 로직

    class ApplicationRecord
      # example UUID
      "550e8400-e29b-41d4-a716-446655440000"
    end
    
    user.tracking_id  #=> "01ARZ3NDEKTSV4RRFFQ69G5FAV"

벤치마크

궁금하다면 각 ID 타입의 성능을 확인하는 스펙을 준비했습니다. 직접 하드웨어에서 실행해 보세요:

bundle exec rspec --tag performance

커스텀 타입 등록

ActiveRecord::Type.register(:uuid, SqliteCrypto::Type::Uuid, adapter: :sqlite3)

가장 어려웠던 부분은 스키마 덤퍼가 상세 컬럼 정의 대신 깔끔한 id: :uuid를 출력하도록 만드는 것이었습니다. 이를 위해 Rails 초기화 순서의 정확한 지점에 모듈을 프리펜딩해야 했습니다.

CI 매트릭스

내 CI 매트릭스는 다음을 테스트합니다:

  • Ruby 3.1 – 3.4
  • Rails 7.1 – 8.1

특정 조합에서만 나타나는 엣지 케이스를 발견했습니다—Rails 8.0의 스키마 덤퍼는 7.2와 미묘하게 다르게 동작했습니다.

설치

# Gemfile
gem "sqlite_crypto"

문제가 발생하면 GitHub 이슈를 열어 주세요. 프로젝트에 도움이 된다면 별표를 눌러 주세요—다른 사람들에게 gem을 알리는 데 큰 도움이 됩니다.

링크

기여

Ruby 생태계에 기여하고 싶지만 아직 시작하지 못한 분들에게—시작해 보라고 권하고 싶습니다. sqlite_crypto를 만들면서 나는 수년간의 애플리케이션 개발보다 Rails 내부 구조를 더 많이 배웠습니다. 커뮤니티는 도구가 필요하고, 여러분이 다음 도구를 만들 사람일 수도 있습니다.

Rails + SQLite 워크플로우에서 겪는 불편함이 있다면 언제든 공유해 주세요. 새로운 SQLite‑first 세계에서 다른 고충이 궁금합니다.

연락처

sqlite_crypto로 뭔가 만들고 있나요? 이야기를 듣고 싶습니다. 댓글을 남기거나 GitHub에서 찾아 주세요.

Back to Blog

관련 글

더 보기 »

Ruby 4.0.0 출시

번역할 텍스트를 제공해 주시겠어요? 해당 내용이 있으면 한국어로 번역해 드리겠습니다.