Rails 기본값: 업그레이드된 앱 속 시한폭탄 해체하기

RailsConf 2025 Rails Framework Defaults: Defusing the Time Bomb in Your Upgraded App by Josh Puetz

작성자
Ruby Central
발행일
2025년 07월 24일

핵심 요약

  • 1 Rails 업그레이드 시 `config.load_defaults` 설정과 `new_framework_defaults_*.rb` 파일 관리가 필수적이며, 이를 간과할 경우 잠재적 문제 발생 가능성이 높습니다.
  • 2 오래된 Rails 기본값을 유지하는 것은 기술 부채, 보안 취약점, Gem 호환성 문제 등으로 이어지는 '시한폭탄'과 같으므로, 적극적인 관리가 요구됩니다.
  • 3 새로운 Rails 기본값을 점진적으로 적용하고 철저히 테스트하는 '느리고 꾸준한' 전략을 채택하며, Rails 코어팀에는 문서 개선을 통한 개발자 지원을 제안합니다.

도입

본 강연은 Rails 애플리케이션 업그레이드 이후에 종종 간과되는, 프레임워크 기본값(defaults) 관리의 중요성을 다룹니다. 많은 개발자가 Rails 버전 업그레이드를 완료했다고 생각하지만, 실제로는 애플리케이션이 여전히 구버전의 기본 설정에 묶여 있어 잠재적인 문제점을 안고 있을 수 있습니다. 강연자는 이러한 현상을 '시한폭탄'에 비유하며, Rails 기본값이 무엇인지, 어떻게 로드되고 작동하는지, 그리고 왜 이들을 최신 상태로 유지해야 하는지에 대한 포괄적인 설명을 제공합니다. 궁극적으로는 이러한 기본값들을 효과적으로 업그레이드하기 위한 실용적인 계획을 제시합니다.

Rails 기본값이란 무엇인가?

Rails 기본값은 Rails의 동작에 영향을 미치는 설정값으로, Rails 팀이 제안하는 권장 값을 가집니다. 이는 config/application.rb 또는 초기화 파일에서 구성될 수 있으며, Rails 스택 전반에 걸쳐 영향을 미칩니다.

기본값 변경의 예시

  • Rails 5 이전 vs. 이후: config.active_record.belongs_to_required_by_default는 Rails 5 이전에는 false였으나, 이후 true로 변경되어 자식 레코드 저장 시 부모 연관 관계의 존재를 필수로 만듭니다.
  • Rails 6: action_dispatch.return_only_media_type_on_content_typefalse에서 true로 변경되어 HTTP 응답에 charset 정보를 포함하게 됩니다.
  • Rails 6.1: action_dispatch.cookies_same_site_protectionnull에서 lax로 변경되어 쿠키 보안 옵션이 기본으로 설정됩니다.
  • Rails 7: action_view.button_to_generates_button_tagfalse에서 true로 변경되어 button_to 헬퍼가 <input type="button"> 대신 적절한 <button> 태그를 생성합니다.

기본값이 변경되는 이유

  • 더 나은 관행 수용: 데이터베이스 제약 조건 활용 등 개발 방식을 개선합니다.
  • 상용구 코드 감소: 반복적인 설정 작업을 줄입니다.
  • 향후 Deprecation 대비: 특정 기능의 단계적 폐지를 준비합니다.

Rails 프레임워크 기본값 관리

Rails는 config.load_defaults 설정과 new_framework_defaults_*.rb 파일을 통해 기본값을 관리합니다.

  • config.load_defaults: application.rb에 설정되며, 애플리케이션이 어떤 버전의 기본값을 사용할지 고정합니다. 이 값은 Rails 업그레이드 시 자동으로 변경되지 않아 기존 앱의 갑작스러운 동작 변경을 방지합니다.
  • new_framework_defaults_*.rb 파일: Rails 업그레이드 과정에서 생성되며, 해당 버전에서 변경되거나 새로 추가된 기본값 목록을 포함합니다. 초기에는 모두 주석 처리되어 있으며, 개발자가 하나씩 주석을 해제하며 점진적으로 새로운 기본값을 적용하도록 유도합니다.
    • Rails 5.0 이전: 기본값이 주석 없이 이전 값으로 설정되어 수동으로 변경해야 했습니다.
    • Rails 5.1 이후: 기본값이 주석 처리된 채 새로운 값으로 설정되어 점진적인 채택이 용이해졌습니다.

왜 기본값을 업그레이드해야 하는가?

오래된 기본값을 유지하는 것은 애플리케이션을 ‘시간 속에 고정’시키는 것과 같습니다. 이는 다음과 같은 문제를 야기합니다. * 새로운 기능, 성능, 보안 개선 사항 미적용: 최신 Rails 버전의 이점을 누릴 수 없습니다. * Deprecation 및 삭제: Rails가 오래된 기본값을 제거할 경우 수동으로 설정을 지정해야 합니다. * Gem 및 튜토리얼 호환성 문제: 대부분의 Gem과 자료는 최신 기본값을 가정하고 작동합니다. * 향후 업그레이드 난이도 증가: 여러 버전의 기본값 변경 사항이 누적되면 한 번에 처리하기 매우 어려워집니다.

기본값 업그레이드 계획: ‘느리고 꾸준하게’

  1. 준비 작업: 테스트 스위트 커버리지를 확인하고 모든 테스트가 통과하는지 확인합니다.
  2. 조사: Rails 업그레이드 가이드, new_framework_defaults_*.rb 파일, Rails 소스 코드 및 Pull Request를 통해 각 기본값 변경의 맥락과 애플리케이션에 미칠 영향을 파악합니다.
  3. 실행:
    • new_framework_defaults_*.rb 파일에서 기본값을 하나씩 주석 해제하여 적용합니다.
    • 불확실한 변경 사항에는 기능 플래그(feature flags)를 활용하여 런타임에 제어할 수 있도록 합니다.
    • 애플리케이션에 특정 구버전의 동작이 필요한 경우, 해당 기본값을 application.rb나 별도의 초기화 파일에 명시적으로 설정하여 오버라이드합니다.
    • 각 변경 후 테스트, 배포, 모니터링을 통해 문제점을 확인합니다.
    • 모든 기본값이 적용되면 new_framework_defaults_*.rb 파일을 삭제하고 config.load_defaults 버전을 최신으로 업데이트합니다.

Rails 코어팀에 대한 제안

업그레이드 가이드 및 new_framework_defaults_*.rb 파일 내에서 변경 사항에 대한 설명을 개선하고, 관련 PR이나 이슈 링크를 제공하여 개발자들이 변경의 배경과 영향을 쉽게 이해할 수 있도록 지원해야 합니다. 개발자가 소스 코드를 직접 파고들지 않고도 이러한 중요한 변경 사항을 파악할 수 있도록 명확한 문서화가 필수적입니다.

결론

Rails 애플리케이션 업그레이드는 단순히 버전 번호를 올리는 것을 넘어, 프레임워크 기본값을 최신 상태로 관리하는 것까지 포함해야 비로소 '완료'됩니다. 오래된 기본값을 방치하는 것은 미래의 문제를 초래하는 '시한폭탄'을 방치하는 것과 다름없습니다. 적극적으로 기본값을 업데이트하는 것은 애플리케이션의 성능, 보안, 유지보수성을 향상시키고 미래의 기술 부채를 줄이는 '미래의 자신에게 베푸는 친절'입니다. 지금 당장 `application.rb`의 `config.load_defaults` 버전을 확인하고, `new_framework_defaults_*.rb` 파일들을 검토하여 팀과 함께 업그레이드 계획을 수립할 것을 권장합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

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