1 Rails 8.0으로 업그레이드하기
기존 애플리케이션을 업그레이드하는 경우, 진행하기 전에 충분한 테스트 커버리지를 확보하는 것이 좋습니다. 또한 아직 하지 않았다면 먼저 Rails 7.2로 업그레이드하고, Rails 8.0으로 업데이트를 시도하기 전에 애플리케이션이 예상대로 작동하는지 확인해야 합니다. 업그레이드 시 주의해야 할 사항 목록은 Ruby on Rails 업그레이드하기 가이드에서 확인할 수 있습니다.
2 주요 기능
3 Railties
자세한 변경 사항은 Changelog를 참조하세요.
3.1 제거사항
더 이상 사용되지 않는
config.read_encrypted_secrets
제거.더 이상 사용되지 않는
rails/console/app
파일 제거.더 이상 사용되지 않는
rails/console/helpers
파일 제거.Rails::ConsoleMethods
를 통해 Rails console을 확장하는 더 이상 사용되지 않는 지원 제거.
3.2 지원 중단
Deprecating a feature gives users a chance to update their code before a change is made permanent. Features are deprecated by emitting a warning that includes a deprecation horizon: either the Rails version the feature will be removed in or a date.
한 기능의 지원을 중단하는 것은 변경사항이 영구적으로 이루어지기 전에 사용자들이 그들의 코드를 업데이트할 기회를 제공합니다. 각 기능들은 deprecation horizon을 포함하는 경고를 표시하면서 지원이 중단됩니다: 기능이 제거될 Rails 버전이나 날짜가 이에 해당합니다.
Deprecation horizons should be: - The next major release for feature removals - At least 2 major releases for syntax changes (since the syntax needs to be supported simultaneously during the deprecation cycle) - At least 3 major releases for API changes that would require significant refactoring - Based on a specific date for significant breaking changes (e.g. dropping support for an old version of Ruby)
지원 중단 기간은 다음과 같아야 합니다: - 기능이 제거되는 다음 주요 릴리스 - 문법 변경의 경우 최소 2개의 주요 릴리스(지원 중단 주기 동안 문법이 동시에 지원되어야 하기 때문) - 상당한 리팩토링이 필요한 API 변경의 경우 최소 3개의 주요 릴리스 - 중요한 변경사항의 경우 특정 날짜 기준(예: 오래된 Ruby 버전에 대한 지원 중단)
For example:
예시:
def old_method
ActiveSupport::Deprecation.warn(
"old_method is deprecated and will be removed from Rails #{Rails.version.to_f + 1.0}"
)
new_method
end
3.3 주목할 만한 변경사항
- Regexp Denial-of-Service 공격에 대한 보안을 향상시키기 위해
Regexp.timeout
을 기본값1
초로 설정했습니다.
4 Action Cable
자세한 변경사항은 Changelog를 참조하세요.
4.1 제거 옵션
The following modules are considered removed in Active Support:
다음 모듈들은 Active Support에서 제거된 것으로 간주됩니다:
Module#reachable?
- 클래스와 모듈이remove_const
를 사용해서 제거될 수 있기 때문에, 이 메서드는 신뢰할 수 없어졌습니다.Module#anonymous?
- Ruby 내장 메서드인Module#name
을 대신 사용하세요.ActiveSupport::LogSubscriber#silence
- 더 이상 필요하지 않습니다.ActiveSupport::LogSubscriber.flush_all!
- 더 이상 필요하지 않습니다.ActiveSupport::Dependencies.explicitly_unloadable_constants
- 더 이상 필요하지 않습니다.
4.2 Deprecated(지원 중단 예정) 기능들
4.3 주목할 만한 변경사항
5 Action Pack
자세한 변경사항은 Changelog를 참조하세요.
5.1 제거사항
Rails.application.config.action_controller.allow_deprecated_parameters_hash_equality
제거.
5.2 지원 중단 사항들
As of Rails 7.1, using nested arrays with the :allow_destroy
option is deprecated:
Rails 7.1부터, :allow_destroy
옵션에서 중첩 배열을 사용하는 것이 지원 중단됩니다:
class Member < ActiveRecord::Base
has_many :posts
accepts_nested_attributes_for :posts, allow_destroy: [true, false]
end
You should now use a boolean value instead:
이제 boolean 값을 대신 사용해야 합니다:
class Member < ActiveRecord::Base
has_many :posts
accepts_nested_attributes_for :posts, allow_destroy: true
end
5.3 주요 변경 사항
6 Action View
자세한 변경 사항은 Changelog를 참조하세요.
6.1 제거사항
form_with
의model:
인자에nil
을 전달하는 deprecated된 지원을 제거했습니다.tag
빌더에서 void tag 엘리먼트에 content를 전달하는 deprecated된 지원을 제거했습니다.
6.2 지원 중단 대상들 (Deprecations)
6.3 주목할 만한 변경사항
7 Action Mailer
자세한 변경사항은 Changelog를 참조하시기 바랍니다.
7.1 제거사항
Removed support for using unsafe raw SQL in the following query methods:
select_rows
,pluck
, andids
. You can still use raw SQL by wrapping it inArel.sql()
to make it explicit that using raw SQL is intended and secure. CVE-2022-32224안전하지 않은 raw SQL을 다음의 query method에서 사용하는 것에 대한 지원이 제거되었습니다:
select_rows
,pluck
, 그리고ids
. raw SQL을 의도적이고 안전하게 사용한다는 것을 명시적으로 표현하기 위해Arel.sql()
로 감싸서 raw SQL을 계속 사용할 수 있습니다. CVE-2022-32224
7.2 지원 종료(Deprecations)
7.3 주목할 만한 변경사항
8 Active Record
자세한 변경사항은 Changelog를 참조해주세요.
8.1 제거된 기능
deprecated된
config.active_record.commit_transaction_on_non_local_return
제거.deprecated된
config.active_record.allow_deprecated_singular_associations_name
제거.Active Record에 등록되지 않은 database adapter를 찾는 deprecated된 기능 제거.
keyword argument를 사용하여
enum
을 정의하는 deprecated된 기능 제거.deprecated된
config.active_record.warn_on_records_fetched_greater_than
제거.deprecated된
config.active_record.sqlite3_deprecated_warning
제거.deprecated된
ActiveRecord::ConnectionAdapters::ConnectionPool#connection
제거.cache_dump_filename
에 database 이름을 전달하는 deprecated된 기능 제거.ENV["SCHEMA_CACHE"]
를 설정하는 deprecated된 기능 제거.
8.2 지원 중단(Deprecations)
8.3 주요 변경사항
9 Active Storage
자세한 변경 사항은 Changelog를 참조하세요.
9.1 제거
9.2 기능 폐기(Deprecations)
9.3 주목할 만한 변경사항
10 Active Model
자세한 변경사항은 Changelog를 참조하세요.
10.1 제거
10.2 지원 중단 예정(Deprecations)
config.action_dispatch.return_only_media_type_on_content_type
구성이 Rails 7.1에서 제거될 예정입니다.ActionController::Live
모듈의#send_stream
이 제거될 예정입니다. 대신#send_stream_data
를 사용하세요. [#47493]Rails.application.middleware
를 직접 수정하는 것이 제거될 예정입니다. 대신config.middleware
를 사용하세요. [#47615]Application#default_middleware_stack=
가 제거될 예정입니다. 대신 middleware의 상속을 허용하지 않으려면config.load_defaults 7.1
없이 애플리케이션을 생성하세요. [#47615]
10.3 주목할 만한 변경사항
11 Active Support
자세한 변경사항은 Changelog를 참조하세요.
11.1 삭제된 기능
더 이상 사용되지 않는
ActiveSupport::ProxyObject
제거.더 이상 사용되지 않는
@
접두사를 사용한attr_internal_naming_format
설정 지원 제거.더 이상 사용되지 않는 문자열 배열을
ActiveSupport::Deprecation#warn
에 전달하는 기능 지원 제거.
11.2 Deprecations (지원 중단 예정)
config.after_initialize
block을 통한config.active_support.executor_around_test_case
의 변경은 더 이상 지원되지 않습니다.config/initializers
에서 이를 대신 구성하세요. (Pull Request)다중
--database
에 대한ENV['DATABASE_URL']
사용은 더 이상 지원되지 않습니다. 데이터베이스 URL은 데이터베이스 설정 대신ENV['PRIMARY_DATABASE_URL']
,ENV['SECONDARY_DATABASE_URL']
등을 사용해야 합니다. (Pull Request)ActiveSupport::TimeWithZone.name
에서ActiveSupport::TimeZone.find_tzinfo
를 호출하는 것은 더 이상 지원되지 않습니다.find_tzinfo
는 이제 private입니다. (Pull Request)Cache#fetch
를 통한 race condition 방지는 더 이상 지원되지 않습니다. 새로운Cache#fetch_multi
를 사용하세요. (Pull Request)스탠드얼론(standalone) migration은 더 이상 지원되지 않습니다. 애플리케이션은 이제
rails/all
또는active_record/railtie
를 필요로 합니다. (Pull Request)숫자가 아닌 값의 round, floor, ceil은 더 이상 지원되지 않습니다. (Pull Request)
config.active_support.use_message_serializer
의 기본값을 변경하는 것은 더 이상 지원되지 않습니다. 이 옵션은 Rails 7.1에서 제거될 예정입니다. (Pull Request)Active Model의
format
validator에서:multiline
옵션은 더 이상 지원되지 않습니다. (Pull Request)config.active_support.cache_format_version
2는 더 이상 지원되지 않습니다. 해당 옵션은 Rails 7.1에서 제거될 예정입니다. (Pull Request)일부 legacy connection handler 메소드는 더 이상 지원되지 않습니다. (Pull Request)
11.3 주목할 만한 변경사항
12 Active Job
자세한 변경사항은 Changelog를 참조하세요.
12.1 제거항목
- 더 이상 사용되지 않는
config.active_job.use_big_decimal_serializer
를 제거했습니다.
12.2 지원 중단(Deprecations)
12.3 주목할만한 변경사항
13 Action Text
자세한 변경사항은 Changelog를 참고하세요.
13.1 삭제하기
13.2 Deprecations (지원 중단 예정)
더 이상 사용되지 않는
DatabaseLimits.validate_string_size_limit
은 삭제될 예정입니다. 앞으로 string size validation이 항상 수행됩니다.DatabaseLimits.validate_string_size_limit = false
를 설정하더라도 효과가 없습니다.더 이상 사용되지 않는
DatabaseLimits.string_size_limit
은 삭제될 예정입니다.더 이상 사용되지 않는
Column.string_size_limit
은 삭제될 예정입니다.더 이상 사용되지 않는
ActiveRecord::ConnectionAdapters::SchemaCache#data_source_exists?
,#data_sources=
,#data_sources
메서드들은 삭제될 예정입니다. 대신#table_exists?
,#tables=
,#tables
를 사용하세요.더 이상 사용되지 않는
DatabaseConfig#to_hash_config
메서드는 삭제될 예정입니다.더 이상 사용되지 않는
DatabaseConfig.render_as_hash
메서드는 삭제될 예정입니다.
13.3 주목할 만한 변경사항
14 Action Mailbox
자세한 변경사항은 Changelog를 참조하세요.
14.1 제거
assert_template
/assert_select
assertions를rails-controller-testing
gem으로 추출했습니다.Action Pack의 xml parameters 파서를 제거했습니다.
ActionDispatch::Request.parameter_parsers
에서 xml 타입을 제거했습니다. XML 요청을 파싱하려면, parser를 다시 추가하셔야 합니다:
ActionDispatch::Request.parameter_parsers[:xml] = -> (raw_post) {
# Parser XML request여기에 구현
}
Controller에서 redirect할 때
*_filter
메소드를 제거했습니다.*_action
을 대신 사용하세요.ActionController::Parameters
인스턴스에서HashWithIndifferentAccess
메소드를 제거했습니다.ActionController::Parameters#[]
가nil
값을 가진 키에 대해 빈 hash를 반환하지 않습니다.respond_to
와respond_with
를responders
gem으로 추출했습니다. responders gem을 추가하세요.Rails에서 jQuery가 기본으로 포함되었던 것을 제거했습니다. 필요하다면
jquery-rails
gem을 추가하세요.config.static_cache_control
을 제거했습니다. 대신config.public_file_server.headers
를 사용하세요.config.serve_static_files
를 제거했습니다. 대신config.public_file_server.enabled
를 사용하세요.Rails::Rack::LogTailer
을 제거했습니다.Extension없이
bin/rails
생성이 제거되었습니다.debugger
를 제거했습니다. 대신byebug
를 사용하세요.doc:app
,doc:rails
,doc/app
,doc/api
를 제거했습니다.rails application
명령을 제거했습니다.Rack::ContentLength
미들웨어를 제거했습니다.Rails 내의 모든 모듈에서
Rails::Application
상수를 제거했습니다.기본 Gemfile에서
Bundler.with_clean_env
를 제거했습니다.Active Record의 counter cache에서
sanitize_sql_hash_for_conditions
를 제거했습니다.UUID 생성 시의
:limit
옵션을 제거했습니다.PostgreSQL adapter에서
:point
타입의 기본nil
값을 제거했습니다.connection_pool
에서prepared_statements
를 제거했습니다. 대신database.yml
을 사용하세요.ActiveRecord::Tasks::DatabaseTasks#load_schema
에서schema_migration_table_name
옵션을 제거했습니다.Mime::LOOKUP
를 제거했습니다. 대신Mime[]
를 사용하세요.email_validator
를 제거했습니다. 대신 메일박스 형식 검증 gem을 사용하세요.Active Model의 callstack에서 deprecated error를 제거했습니다.
14.2 지원 중단(Deprecations)
ActionDispatch::Session::SessionRestoreError
예외는 Ruby 3.0과 Rails 7.0에서 더 이상 지원하지 않습니다. [Rack::Session::Unpacker::MarshalError
나JSON::ParserError
]가 대신 발생할 것입니다. Gem이나 애플리케이션에서 이 예외를 rescue하고 있다면, 이 새로운 예외들도 같이 rescue하도록 업데이트해야 합니다. GH#43953Redis Session Store가 더 이상 내부적으로 Marshal을 사용하지 않을 것입니다. GH#44379
FileStore와 MemoryStore에서 기본 serializer로 Marshal을 사용하는 것이 지원 중단됩니다. GH#44379
expire_after
를 인스턴스 수준에서 지원하는 것이 지원 중단됩니다.Session#options
에서 대신 이를 설정하세요. GH#44379
14.3 주목할만한 변경사항
15 Ruby on Rails 가이드
자세한 변경사항은 Changelog를 참조하세요.
15.1 주목할 만한 변경사항
16 감사의 말
Rails를 안정적이고 견고한 프레임워크로 만들기 위해 수많은 시간을 투자한 많은 사람들을 보려면 Rails 전체 기여자 목록을 참조하세요. 이 모든 분들께 경의를 표합니다.