기존 schema.rb 컬럼 정렬의 문제점
Rails 8.1 이전에는 schema.rb 파일이 현재 데이터베이스 구조를 덤프할 때, 컬럼의 물리적 순서가 마이그레이션 이력을 반영했습니다. 이는 다음과 같은 상황을 초래했습니다.
-
컬럼 순서 불일치: 서로 다른 개발자가 동일한 테이블에 대해 마이그레이션을 적용하는 순서가 다를 경우,
schema.rb에 기록되는 컬럼 순서가 달라졌습니다. ```ruby # 머신 A의 posts 테이블 create_table “posts”, force: :cascade do |t| t.string “title” t.boolean “published” t.text “summary” end머신 B의 posts 테이블 (마이그레이션 순서가 다름)
create_table “posts”, force: :cascade do |t| t.string “title” t.text “summary” t.boolean “published” end ```
-
빈번한 병합 충돌: 동일한 테이블을 수정하는 두 브랜치가 병합될 때,
schema.rb파일의 컬럼 순서 차이로 인해 불필요한 충돌이 발생하여 개발 생산성을 저해했습니다.
Rails 8.1에서의 변경 사항
Rails 8.1부터는 schema.rb 덤프 시 테이블 컬럼이 알파벳순으로 정렬되도록 변경되었습니다. 이 동작은 설정할 수 없으며 비활성화할 수도 없습니다.
-
일관된 순서 보장: 마이그레이션 이력이나 물리적 저장 순서와 관계없이, 모든 환경에서 동일한
schema.rb컬럼 순서를 보장합니다.ruby # Rails 8.1 이후의 posts 테이블 (알파벳순 정렬) create_table "posts", force: :cascade do |t| t.boolean "published" t.text "summary" t.string "title" end -
병합 충돌 감소:
schema.rb파일의 불필요한 변경으로 인한 병합 충돌이 현저히 줄어들어 개발자들의 협업이 더욱 원활해집니다.
Rails 8.1로 업그레이드 시 유의사항
기존 애플리케이션을 Rails 8.1로 업그레이드할 경우, rails db:schema:dump 명령을 실행하면 모든 테이블의 컬럼 순서가 알파벳순으로 재정렬됩니다. 이로 인해 업그레이드 후 첫 커밋에서 schema.rb 파일에 대규모 diff가 발생할 수 있습니다. 이는 예상된 일회성 변경이며, 이후에는 일관성이 유지됩니다.