Rails와 SQLite에서 UUID는 이렇게 어려워서는 안 됩니다 (그래서 gem을 만들었습니다)
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과 전혀 다르게 동작했습니다.
무엇이 깨졌는가
| 이슈 | PostgreSQL | SQLite (gem 사용 전) |
|---|---|---|
| 기본키 선언 | enable_extension 'pgcrypto' → id: :uuid | schema.rb에 id: false와 string 컬럼이 덤프됨 |
| 외래키 | UUID 타입을 자동 감지 | INTEGER 컬럼이 생성돼 조인 불일치 발생 |
User.first | 시간 순서대로 가장 첫 레코드 반환 | 무작위 UUID‑정렬 레코드 반환 (UUID v4는 시간 정렬되지 않음) |
| 보일러플레이트 | 없음 | type: :string, limit: 36와 커스텀 제너레이터를 일일이 지정해야 함 |
gem을 만들기 전에 해야 했던 일
-
상세한 마이그레이션 구문
create_table :users, id: false do |t| t.string :id, limit: 36, null: false, primary_key: true t.string :email t.timestamps end -
모든 외래키에 대한 수동 타입 지정
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 -
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을 알리는 데 큰 도움이 됩니다.
링크
- GitHub Repository – https://github.com/yourname/sqlite_crypto
- RubyGems – https://rubygems.org/gems/sqlite_crypto
- Changelog – https://github.com/yourname/sqlite_crypto/blob/main/CHANGELOG.md
기여
Ruby 생태계에 기여하고 싶지만 아직 시작하지 못한 분들에게—시작해 보라고 권하고 싶습니다. sqlite_crypto를 만들면서 나는 수년간의 애플리케이션 개발보다 Rails 내부 구조를 더 많이 배웠습니다. 커뮤니티는 도구가 필요하고, 여러분이 다음 도구를 만들 사람일 수도 있습니다.
Rails + SQLite 워크플로우에서 겪는 불편함이 있다면 언제든 공유해 주세요. 새로운 SQLite‑first 세계에서 다른 고충이 궁금합니다.
연락처
sqlite_crypto로 뭔가 만들고 있나요? 이야기를 듣고 싶습니다. 댓글을 남기거나 GitHub에서 찾아 주세요.