이 문제의 핵심은 Rails 초기화 과정과 이니셜라이저 실행 순서에 있습니다. Rails는 Rails::Railtie
의 initializer
메서드를 통해 프레임워크 컴포넌트를 설정하며, 이들은 특정 순서로 실행됩니다. active_record.set_configs
와 같은 이니셜라이저는 Rails.application.config.active_record
의 설정을 ActiveRecord::Base
에 적용합니다. 중요한 점은 ActiveSupport.on_load(:active_record)
콜백이 ActiveRecord::Base
클래스 로드 즉시 실행된다는 것입니다. 이 콜백은 config/initializers
파일을 로드하는 load_config_initializers
이니셜라이저보다 먼저 실행될 수 있습니다. 따라서 일부 서드파티 젬이 부팅 중 ActiveRecord::Base
등 설정 가능한 Rails 클래스를 미리 로드하면, ActiveSupport.on_load
콜백이 조기에 트리거되어 new_framework_defaults_*.rb
의 특정 설정들(예: belongs_to_required_by_default
, default_column_serializer
)이 무시될 수 있습니다. 글은 이러한 조기 로딩 문제를 감지하기 위한 간단한 Ruby 스크립트(premature_load_check.rb
)를 제공합니다.
더 이상 new_framework_defaults 이니셜라이저의 설정들을 맹목적으로 신뢰하지 않습니다.
I do not blindly trust setting things in new_framework_defaults initializers anymore | Arkency Blog
작성자
Short Ruby
발행일
2025년 06월 11일
핵심 요약
- 1 Rails 업그레이드 시 `new_framework_defaults_*.rb` 파일의 설정이 예상대로 적용되지 않을 수 있습니다.
- 2 이는 일부 서드파티 젬이 Rails 모듈을 너무 일찍 로드하여 발생하는 초기화 순서 문제입니다.
- 3 안전한 업그레이드를 위해 관련 설정을 `config/application.rb`로 옮기고, 각 변경 후 철저히 테스트해야 합니다.
도입
Rails 애플리케이션 업그레이드 시 `config/initializers/new_framework_defaults_*.rb` 파일의 설정을 점진적으로 적용하는 방식은 일반적이지만, 본 글은 이러한 접근이 예상치 못한 문제를 야기할 수 있음을 경고합니다. 특히 Rails 7.1 업그레이드 중 `config.active_record.default_column_serializer = nil` 설정이 기대와 달리 작동하지 않았던 사례를 통해, `new_framework_defaults` 이니셜라이저의 설정이 항상 제때 적용되지 않을 수 있다는 미묘한 설정 함정을 설명합니다. 이는 개발자들이 Rails 업그레이드 시 맹목적인 신뢰 대신 철저한 검증이 필요함을 시사합니다.
결론
`new_framework_defaults_*.rb`를 통한 Rails 설정은 강력하지만, 사용에 신중함이 요구됩니다. 특히 서드파티 젬에 의존하는 경우, 설정 적용에 대한 가정을 철저히 테스트해야 합니다. 안전한 업그레이드 경로로, `new_framework_defaults_*.rb`에서 활성화하려는 설정을 `config/application.rb` 파일 내 `config.load_defaults` 바로 뒤로 옮길 것을 강력히 권장합니다. 이 방법은 다른 젬 로딩 및 Rails 내부 구성 전에 올바른 설정이 적용되도록 보장합니다. 또한, 젬 개발자들에게는 Rails 컴포넌트 로드 시점에 유의하고, `ActiveSupport.on_load`를 사용하여 코드 로딩을 지연시킬 것을 당부합니다. 새로운 Rails 버전으로 전환 시 제시된 도구를 활용하고, 각 설정을 하나씩 활성화하며 변경 후 애플리케이션을 철저히 테스트하는 것이 중요함을 강조하며 마무리합니다.