1 초기화 코드의 위치
Rails는 초기화 코드를 넣을 수 있는 네 가지 표준 위치를 제공합니다:
config/application.rb
- 환경별 구성 파일
- Initializers
- After-initializers
2 Rails 이전에 코드 실행하기
드물게 애플리케이션이 Rails 자체가 로드되기 전에 일부 코드를 실행해야 하는 경우, config/application.rb
의 require "rails/all"
호출 위에 해당 코드를 넣으세요.
3 Rails 컴포넌트 구성하기
일반적으로 Rails를 구성하는 작업은 Rails 자체를 구성하는 것뿐만 아니라 Rails의 컴포넌트들을 구성하는 것을 의미합니다. 구성 파일 config/application.rb
와 환경별 구성 파일(예: config/environments/production.rb
)을 통해 모든 컴포넌트에 전달하고자 하는 다양한 설정을 지정할 수 있습니다.
예를 들어, config/application.rb
파일에 다음과 같은 설정을 추가할 수 있습니다:
config.time_zone = "Central Time (US & Canada)"
Rails 자체를 위한 설정입니다. 개별 Rails 컴포넌트에 설정을 전달하려면 config/application.rb
에서 동일한 config
객체를 통해 수행할 수 있습니다:
config.active_record.schema_format = :ruby
기본적으로 Rails는 Ruby 형식으로 schema를 덤프하지만, 설정에서 SQL 형식을 사용하도록 할 수 있습니다.
Rails는 Active Record를 구성하기 위해 해당 설정을 사용합니다.
관련 클래스를 직접 호출하는 대신 공개 구성 메서드를 사용하세요. 예를 들어 ActionMailer::Base.options
대신 Rails.application.config.action_mailer.options
를 사용하세요.
클래스에 직접 구성을 적용해야 하는 경우, 초기화가 완료되기 전에 클래스를 자동 로드하지 않도록 initializer에서 lazy load hook을 사용하세요. 초기화 중의 자동 로딩은 앱이 리로드될 때 안전하게 반복될 수 없기 때문에 문제가 발생할 것입니다.
3.1 Versioned Default Values
config.load_defaults
는 대상 버전과 이전의 모든 버전에 대한 기본 설정값을 로드합니다. 예를 들어, config.load_defaults 6.1
은 6.1 버전까지의 모든 기본값을 로드합니다.
아래는 각 대상 버전과 연관된 기본값들입니다. 값이 충돌하는 경우, 새로운 버전이 이전 버전보다 우선합니다.
3.1.1 대상 버전 8.1의 기본값
config.yjit
:!Rails.env.local?
3.1.2 대상 버전 8.0의 기본값
Regexp.timeout
:1
config.action_dispatch.strict_freshness
:true
config.active_support.to_time_preserves_timezone
::zone
3.1.3 대상 버전 7.2의 기본값
config.active_record.postgresql_adapter_decode_dates
:true
config.active_record.validate_migration_timestamps
:true
config.active_storage.web_image_content_types
:%w[image/png image/jpeg image/gif image/webp]
config.yjit
:true
3.1.4 대상 버전 7.1의 기본값
config.action_dispatch.debug_exception_log_level
::error
config.action_dispatch.default_headers
:{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }
config.action_text.sanitizer_vendor
:Rails::HTML::Sanitizer.best_supported_vendor
config.action_view.sanitizer_vendor
:Rails::HTML::Sanitizer.best_supported_vendor
config.active_record.before_committed_on_all_records
:true
config.active_record.belongs_to_required_validates_foreign_key
:false
config.active_record.default_column_serializer
:nil
config.active_record.encryption.hash_digest_class
:OpenSSL::Digest::SHA256
config.active_record.encryption.support_sha1_for_non_deterministic_encryption
:false
config.active_record.generate_secure_token_on
::initialize
config.active_record.marshalling_format_version
:7.1
config.active_record.query_log_tags_format
::sqlcommenter
config.active_record.raise_on_assign_to_attr_readonly
:true
config.active_record.run_after_transaction_callbacks_in_order_defined
:true
config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction
:false
config.active_record.sqlite3_adapter_strict_strings_by_default
:true
config.active_support.cache_format_version
:7.1
config.active_support.message_serializer
::json_allow_marshal
config.active_support.raise_on_invalid_cache_expiration_time
:true
config.active_support.use_message_serializer_for_metadata
:true
config.add_autoload_paths_to_load_path
:false
config.dom_testing_default_html_version
:defined?(Nokogiri::HTML5) ? :html5 : :html4
config.log_file_size
:100 * 1024 * 1024
3.1.5 Target Version 7.0의 기본값
config.action_controller.raise_on_open_redirects
:true
config.action_controller.wrap_parameters_by_default
:true
config.action_dispatch.cookies_serializer
::json
config.action_dispatch.default_headers
:{ "X-Frame-Options" => "SAMEORIGIN", "X-XSS-Protection" => "0", "X-Content-Type-Options" => "nosniff", "X-Download-Options" => "noopen", "X-Permitted-Cross-Domain-Policies" => "none", "Referrer-Policy" => "strict-origin-when-cross-origin" }
config.action_mailer.smtp_timeout
:5
config.action_view.apply_stylesheet_media_default
:false
config.action_view.button_to_generates_button_tag
:true
config.active_record.automatic_scope_inversing
:true
config.active_record.partial_inserts
:false
config.active_record.verify_foreign_keys_for_fixtures
:true
config.active_storage.multiple_file_field_include_hidden
:true
config.active_storage.variant_processor
::vips
config.active_storage.video_preview_arguments
:"-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"
config.active_support.cache_format_version
:7.0
config.active_support.executor_around_test_case
:true
config.active_support.hash_digest_class
:OpenSSL::Digest::SHA256
config.active_support.key_generator_hash_digest_class
:OpenSSL::Digest::SHA256
3.1.6 Target Version 6.1의 기본값
ActiveSupport.utc_to_local_returns_utc_offset_times
:true
config.action_dispatch.cookies_same_site_protection
::lax
config.action_dispatch.ssl_default_redirect_status
:308
config.action_mailbox.queues.incineration
:nil
config.action_mailbox.queues.routing
:nil
config.action_mailer.deliver_later_queue_name
:nil
config.action_view.form_with_generates_remote_forms
:false
config.action_view.preload_links_header
:true
config.active_job.retry_jitter
:0.15
config.active_record.has_many_inversing
:true
config.active_storage.queues.analysis
:nil
config.active_storage.queues.purge
:nil
config.active_storage.track_variants
:true
3.1.7 Target Version 6.0의 기본값
config.action_dispatch.use_cookies_with_metadata
:true
config.action_mailer.delivery_job
:"ActionMailer::MailDeliveryJob"
config.action_view.default_enforce_utf8
:false
config.active_record.collection_cache_versioning
:true
config.active_storage.queues.analysis
::active_storage_analysis
config.active_storage.queues.purge
::active_storage_purge
3.1.8 Target Version 5.2의 기본값
config.action_dispatch.use_authenticated_cookie_encryption
:true
config.active_support.hash_digest_class
:OpenSSL::Digest::SHA1
config.active_support.use_authenticated_message_encryption
:true
3.1.9 5.1 버전의 기본값
config.action_view.form_with_generates_remote_forms
:true
config.assets.unknown_asset_fallback
:false
3.1.10 5.0 버전의 기본값
config.action_controller.forgery_protection_origin_check
:true
config.action_controller.per_form_csrf_tokens
:true
config.active_record.belongs_to_required_by_default
:true
config.active_support.to_time_preserves_timezone
::offset
config.ssl_options
:{ hsts: { subdomains: true } }
3.2 Rails 일반 설정
다음 설정 메서드들은 Rails::Engine
이나 Rails::Application
의 하위 클래스와 같은 Rails::Railtie
객체에서 호출되어야 합니다.
3.2.1 config.add_autoload_paths_to_load_path
autoload paths를 $LOAD_PATH
에 추가해야 하는지 여부를 지정합니다. :zeitwerk
모드에서는 config/application.rb
에서 일찍 false
로 설정하는 것이 권장됩니다. Zeitwerk는 내부적으로 절대 경로를 사용하며, :zeitwerk
모드에서 실행되는 애플리케이션은 require_dependency
가 필요하지 않으므로 모델, 컨트롤러, 잡 등이 $LOAD_PATH
에 있을 필요가 없습니다. 이를 false
로 설정하면 Ruby가 상대 경로로 require
호출을 해결할 때 이러한 디렉토리를 확인하지 않아도 되며, Bootsnap이 이들의 인덱스를 작성할 필요가 없어 작업량과 RAM을 절약할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | true |
7.1 | false |
lib
디렉토리는 이 플래그의 영향을 받지 않으며, 항상 $LOAD_PATH
에 추가됩니다.
3.2.2 config.after_initialize
Rails가 애플리케이션 초기화를 완료한 후에 실행될 블록을 지정합니다. 여기에는 프레임워크 자체, 엔진, 그리고 config/initializers
의 모든 애플리케이션 이니셜라이저의 초기화가 포함됩니다. 이 블록은 rake 작업에 대해서도 실행될 것임을 참고하세요. 다른 이니셜라이저에 의해 설정된 값을 구성하는 데 유용합니다:
config.after_initialize do
ActionView::Base.sanitized_allowed_tags.delete "div"
end
초기화 이후에 sanitized_allowed_tags에서 "div" 태그를 삭제할 수 있습니다.
3.2.3 config.after_routes_loaded
Rails가 application routes 로딩을 완료한 후에 실행될 block을 지정합니다. 이 block은 routes가 다시 로드될 때마다 실행됩니다.
config.after_routes_loaded do
# Rails.application.routes를 사용하는 코드
end
3.2.4 config.allow_concurrency
요청을 동시에 처리할지 여부를 제어합니다. 애플리케이션 코드가 thread safe하지 않은 경우에만 false
로 설정해야 합니다. 기본값은 true
입니다.
3.2.5 config.asset_host
asset들의 host를 설정합니다. CDN을 사용하여 asset을 호스팅하거나, 다른 도메인 별칭을 사용하여 브라우저에 내장된 동시성 제약을 해결하고자 할 때 유용합니다. config.action_controller.asset_host
의 단축 버전입니다.
3.2.6 config.assume_ssl
모든 요청이 SSL을 통해 도착한다고 애플리케이션이 가정하도록 합니다. SSL을 종료하는 로드 밸런서를 통해 프록시할 때 유용합니다. 포워딩된 요청은 애플리케이션에 HTTPS 대신 HTTP로 나타납니다. 이로 인해 리다이렉트와 쿠키 보안이 HTTPS 대신 HTTP를 대상으로 하게 됩니다. 이 middleware는 프록시가 이미 SSL을 종료했고 실제로 요청이 HTTPS라고 서버가 가정하도록 합니다.
3.2.7 config.autoflush_log
로그 파일 출력을 버퍼링하지 않고 즉시 쓰기를 활성화합니다. 기본값은 true
입니다.
3.2.8 config.autoload_lib(ignore:)
이 메서드는 lib
를 config.autoload_paths
와 config.eager_load_paths
에 추가합니다.
일반적으로 lib
디렉토리에는 autoload나 eager load되지 않아야 하는 하위 디렉토리들이 있습니다. lib
를 기준으로 한 상대 경로를 필수 ignore
키워드 인자로 전달해 주세요. 예를 들어,
config.autoload_lib(ignore: %w(assets tasks generators))
lib/ 디렉터리를 Project Structure에 추가하지만, 자주 사용되는 몇 가지 예외사항들을 제외합니다. lib/assets, lib/tasks, 그리고 lib/generators는 포함되지 않습니다.
자세한 내용은 autoloading 가이드를 참조하세요.
3.2.9 config.autoload_lib_once(ignore:)
config.autoload_lib_once
메서드는 config.autoload_lib
와 비슷하지만, lib
를 config.autoload_once_paths
에 추가한다는 점이 다릅니다.
config.autoload_lib_once
를 호출하면 lib
의 클래스와 모듈을 애플리케이션 initializer에서도 autoload할 수 있지만, reload되지는 않습니다.
3.2.10 config.autoload_once_paths
Rails가 request마다 초기화되지 않는 상수들을 autoload할 경로들의 배열을 받습니다. reloading이 활성화된 경우에 관련이 있으며, development
환경에서는 기본적으로 활성화되어 있습니다. 그렇지 않으면 모든 autoloading은 한 번만 발생합니다. 이 배열의 모든 요소는 autoload_paths
에도 있어야 합니다. 기본값은 빈 배열입니다.
3.2.11 config.autoload_paths
Rails가 상수를 autoload할 경로들의 배열을 받습니다. 기본값은 빈 배열입니다. Rails 6 이후로는 이를 조정하는 것을 권장하지 않습니다. Autoloading and Reloading Constants를 참조하세요.
3.2.12 config.beginning_of_week
애플리케이션의 기본 주 시작일을 설정합니다. 심볼로 된 유효한 요일을 받습니다(예: :monday
).
3.2.13 config.cache_classes
!config.enable_reloading
와 동등한 이전 설정입니다. 하위 호환성을 위해 지원됩니다.
3.2.14 config.cache_store
Rails 캐싱에 사용할 캐시 스토어를 설정합니다. 옵션으로 :memory_store
, :file_store
, :mem_cache_store
, :null_store
, :redis_cache_store
심볼 중 하나 또는 캐시 API를 구현하는 객체를 사용할 수 있습니다. 기본값은 :file_store
입니다. 스토어별 설정 옵션은 Cache Stores를 참조하세요.
3.2.15 config.colorize_logging
로깅 정보에 ANSI 색상 코드를 사용할지 여부를 지정합니다. 기본값은 true
입니다.
3.2.16 config.consider_all_requests_local
플래그입니다. true
로 설정하면 모든 에러에 대해 상세한 디버깅 정보가 HTTP 응답에 출력되며, Rails::Info
컨트롤러가 /rails/info/properties
에서 애플리케이션 런타임 컨텍스트를 보여줍니다. development와 test 환경에서는 기본값이 true
이고 production 환경에서는 false
입니다. 더 세밀한 제어를 위해서는 이를 false
로 설정하고 컨트롤러에서 show_detailed_exceptions?
를 구현하여 어떤 요청에서 에러에 대한 디버깅 정보를 제공할지 지정할 수 있습니다.
3.2.17 config.console
bin/rails console
을 실행할 때 사용될 콘솔 클래스를 설정할 수 있습니다. console
블록 내에서 실행하는 것이 가장 좋습니다:
console do
# 이 블록은 console을 실행할 때만 호출되므로,
# pry를 안전하게 require 할 수 있습니다
require "pry"
config.console = Pry
end
3.2.18 config.content_security_policy_nonce_directives
보안 가이드의 Nonce 추가하기를 참조하세요
3.2.19 config.content_security_policy_nonce_generator
보안 가이드의 Nonce 추가하기를 참조하세요
3.2.20 config.content_security_policy_report_only
보안 가이드의 위반 보고하기를 참조하세요
3.2.21 config.credentials.content_path
암호화된 credential 파일의 경로입니다.
기본값은 config/credentials/#{Rails.env}.yml.enc
가 존재하면 해당 파일을, 그렇지 않으면 config/credentials.yml.enc
입니다.
bin/rails credentials
명령어가 이 값을 인식하려면 config/application.rb
또는 config/environments/#{Rails.env}.rb
에 설정해야 합니다.
3.2.22 config.credentials.key_path
암호화된 credential 키 파일의 경로입니다.
기본값은 config/credentials/#{Rails.env}.key
가 존재하면 해당 파일을, 그렇지 않으면 config/master.key
입니다.
bin/rails credentials
명령어가 이 값을 인식하려면 config/application.rb
또는 config/environments/#{Rails.env}.rb
에 설정해야 합니다.
3.2.23 config.debug_exception_response_format
개발 환경에서 오류가 발생했을 때 응답에 사용되는 포맷을 설정합니다. API 전용 앱의 경우 기본값은 :api
이고 일반 앱의 경우 :default
입니다.
3.2.24 config.disable_sandbox
sandbox 모드에서 콘솔을 시작할 수 있는지 여부를 제어합니다. 이는 데이터베이스 서버의 메모리 부족을 초래할 수 있는 오랫동안 실행되는 sandbox 콘솔 세션을 방지하는데 도움이 됩니다. 기본값은 false
입니다.
3.2.25 config.dom_testing_default_html_version
Action View, Action Dispatch, rails-dom-testing
의 테스트 헬퍼가 기본적으로 HTML4 파서를 사용할지 HTML5 파서를 사용할지 제어합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
Starting with version | The default value is |
---|
| (원본) | :html4
|
| 7.1 | :html5
(NOTE 참조) |
Nokogiri의 HTML5 파서는 JRuby에서 지원되지 않으므로, JRuby 플랫폼에서 Rails는 :html4
로 폴백됩니다.
3.2.26 config.eager_load
true
로 설정하면, 등록된 모든 config.eager_load_namespaces
를 eager load합니다. 여기에는 애플리케이션, 엔진, Rails 프레임워크 및 다른 모든 등록된 네임스페이스가 포함됩니다.
3.2.27 config.eager_load_namespaces
config.eager_load
가 true
로 설정되었을 때 eager load되는 네임스페이스를 등록합니다. 목록의 모든 네임스페이스는 eager_load!
메서드에 응답해야 합니다.
3.2.28 config.eager_load_paths
config.eager_load
가 true일 때 Rails가 부팅 시 eager load할 경로들의 배열을 받습니다. 기본값은 애플리케이션의 app
디렉토리 내의 모든 폴더입니다.
3.2.29 config.enable_reloading
config.enable_reloading
이 true이면, 웹 요청 사이에 애플리케이션 클래스와 모듈이 변경되었을 때 다시 로드됩니다. development
환경에서는 기본값이 true
이고, production
환경에서는 false
입니다.
config.reloading_enabled?
프레디킷도 정의되어 있습니다.
3.2.30 config.encoding
애플리케이션 전역 인코딩을 설정합니다. 기본값은 UTF-8입니다.
3.2.31 config.exceptions_app
예외가 발생했을 때 ShowException
미들웨어에 의해 호출되는 예외 애플리케이션을 설정합니다.
기본값은 ActionDispatch::PublicExceptions.new(Rails.public_path)
입니다.
예외 애플리케이션은 클라이언트가 잘못된 Accept
또는 Content-Type
헤더를 보낼 때 발생하는 ActionDispatch::Http::MimeNegotiation::InvalidType
에러를 처리해야 합니다.
기본 ActionDispatch::PublicExceptions
애플리케이션은 이를 자동으로 처리하여, Content-Type
을 text/html
로 설정하고 406 Not Acceptable
상태를 반환합니다.
이 에러를 처리하지 않으면 500 Internal Server Error
가 발생합니다.
예외 애플리케이션으로 Rails.application.routes
RouteSet
을 사용할 때도 이러한 특별한 처리가 필요합니다.
다음과 같은 형태일 수 있습니다:
# config/application.rb
config.exceptions_app = CustomExceptionsAppWrapper.new(exceptions_app: routes)
# lib/custom_exceptions_app_wrapper.rb
class CustomExceptionsAppWrapper
def initialize(exceptions_app:)
@exceptions_app = exceptions_app
end
def call(env)
request = ActionDispatch::Request.new(env)
# 유효하지 않은 mime type인 경우 HTML 포맷으로 fallback
fallback_to_html_format_if_invalid_mime_type(request)
@exceptions_app.call(env)
end
private
def fallback_to_html_format_if_invalid_mime_type(request)
request.formats
rescue ActionDispatch::Http::MimeNegotiation::InvalidType
request.set_header "CONTENT_TYPE", "text/html"
end
end
3.2.32 config.file_watcher
config.reload_classes_only_on_change
가 true
일 때 파일 시스템의 파일 업데이트를 감지하는 데 사용되는 클래스입니다. Rails는 기본값인 ActiveSupport::FileUpdateChecker
와 ActiveSupport::EventedFileUpdateChecker
를 제공합니다. 커스텀 클래스는 ActiveSupport::FileUpdateChecker
API를 준수해야 합니다.
ActiveSupport::EventedFileUpdateChecker
를 사용하려면 listen gem이 필요합니다:
group :development do
gem "listen", "~> 3.5"
end
Linux와 macOS에서는 추가 gem이 필요하지 않지만, *BSD와 Windows에서는 일부 gem이 필요합니다.
일부 설정은 지원되지 않는다는 점에 유의하세요.
3.2.33 config.filter_parameters
로그에 표시하고 싶지 않은 파라미터(예: 비밀번호나 신용카드 번호)를 필터링하는 데 사용됩니다. Active Record 객체에서 #inspect
를 호출할 때 데이터베이스 컬럼의 민감한 값도 필터링합니다. 기본적으로 Rails는 config/initializers/filter_parameter_logging.rb
에 다음 필터를 추가하여 비밀번호를 필터링합니다.
Rails.application.config.filter_parameters += [
:passw, :email, :secret, :token, :_key, :crypt, :salt, :certificate, :otp, :ssn, :cvv, :cvc
]
Parameters filter는 정규표현식의 부분 매칭으로 작동합니다.
3.2.34 config.filter_redirect
애플리케이션 로그에서 리다이렉트 URL을 필터링하는데 사용됩니다.
Rails.application.config.filter_redirect += ["s3.amazonaws.com", /private-match/]
redirect 필터는 url이 문자열을 포함하거나 정규식과 일치하는지 테스트하여 동작합니다.
3.2.35 config.force_ssl
모든 요청이 HTTPS를 통해 제공되도록 강제하고, URL을 생성할 때 "https://"를 기본 프로토콜로 설정합니다. HTTPS 적용은 ActionDispatch::SSL
middleware에 의해 처리되며, 이는 config.ssl_options
를 통해 구성할 수 있습니다.
3.2.36 config.helpers_paths
view helper를 로드할 추가 경로들의 배열을 정의합니다.
3.2.37 config.host_authorization
HostAuthorization middleware를 구성하기 위한 옵션 해시를 받습니다.
3.2.38 config.hosts
Host
헤더를 검증하는 데 사용되는 문자열, 정규식, 또는 IPAddr
의 배열입니다. DNS rebinding 공격을 방지하는 데 도움이 되는 HostAuthorization middleware에서 사용됩니다.
3.2.39 config.javascript_path
앱의 JavaScript가 위치한 경로를 app
디렉토리를 기준으로 설정하며 기본값은 javascript
입니다.
앱에서 구성된 javascript_path
는 autoload_paths
에서 제외됩니다.
3.2.40 config.log_file_size
Rails 로그 파일의 최대 크기를 바이트 단위로 정의합니다. development와 test 환경에서는 104_857_600
(100 MiB)가 기본값이며, 다른 모든 환경에서는 무제한입니다.
3.2.41 config.log_formatter
Rails 로거의 포매터를 정의합니다. 이 옵션은 모든 환경에서 기본적으로 ActiveSupport::Logger::SimpleFormatter
의 인스턴스로 설정됩니다. config.logger
에 값을 설정하는 경우, 로거가 ActiveSupport::TaggedLogging
인스턴스로 래핑되기 전에 포매터 값을 수동으로 로거에 전달해야 합니다. Rails는 이를 자동으로 처리하지 않습니다.
3.2.42 config.log_level
Rails 로거의 상세 수준을 정의합니다. 이 옵션은 production을 제외한 모든 환경에서 기본적으로 :debug
로 설정되며, production에서는 :info
가 기본값입니다. 사용 가능한 로그 레벨은 :debug
, :info
, :warn
, :error
, :fatal
, :unknown
입니다.
3.2.43 config.log_tags
request
객체가 응답하는 메서드 목록, request
객체를 받는 Proc
, 또는 to_s
에 응답하는 것을 받습니다. 이를 통해 서브도메인이나 요청 ID와 같은 디버그 정보로 로그 라인에 태그를 지정할 수 있으며, 이는 다중 사용자 production 애플리케이션을 디버깅하는 데 매우 유용합니다.
3.2.44 config.logger
Rails.logger
와 ActiveRecord::Base.logger
와 같은 관련 Rails 로깅에 사용될 로거입니다. 기본적으로 log/
디렉토리에 로그를 출력하는 ActiveSupport::Logger
인스턴스를 래핑하는 ActiveSupport::TaggedLogging
인스턴스입니다. 사용자 정의 로거를 제공할 수 있으며, 완전한 호환성을 위해서는 다음 지침을 따라야 합니다:
포매터를 지원하려면
config.log_formatter
값에서 로거에 수동으로 포매터를 할당해야 합니다.태그된 로그를 지원하기 위해서는 로그 인스턴스가
ActiveSupport::TaggedLogging
으로 감싸져야 합니다.silence를 지원하기 위해서는 logger가
ActiveSupport::LoggerSilence
module을 include해야 합니다.ActiveSupport::Logger
클래스는 이미 이러한 모듈들을 포함하고 있습니다.
class MyLogger < ::Logger
include ActiveSupport::LoggerSilence
end
mylogger = MyLogger.new(STDOUT)
mylogger.formatter = config.log_formatter
config.logger = ActiveSupport::TaggedLogging.new(mylogger)
필요한 경우에는, 기존 logger를 상속하고 ActiveSupport::LoggerSilence
를 포함하여 커스텀 logger를 생성할 수 있습니다.
3.2.45 config.middleware
애플리케이션의 middleware를 설정할 수 있습니다. 이것은 아래의 Configuring Middleware 섹션에서 자세히 다룹니다.
3.2.46 config.precompile_filter_parameters
true
일 경우, ActiveSupport::ParameterFilter.precompile_filters
를 사용하여 config.filter_parameters
를 미리 컴파일합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(원본) | false |
7.1 | true |
3.2.47 config.public_file_server.enabled
Rails가 public 디렉토리에서 정적 파일을 제공해야 하는지 설정합니다.
기본값은 true
입니다.
서버 소프트웨어(예: NGINX 또는 Apache)가 대신 정적 파일을 제공해야 하는 경우,
이 값을 false
로 설정하세요.
3.2.48 config.railties_order
Railties/Engines가 로드되는 순서를 수동으로 지정할 수 있습니다.
기본값은 [:all]
입니다.
config.railties_order = [Blog::Engine, :main_app, :all]
3.2.49 config.rake_eager_load
true
로 설정하면, Rake 태스크를 실행할 때 애플리케이션을 eager load합니다. 기본값은 false
입니다.
3.2.50 config.relative_url_root
Rails에게 하위 디렉토리에 배포한다는 것을 알려주기 위해 사용할 수 있습니다. 기본값은 ENV['RAILS_RELATIVE_URL_ROOT']
입니다.
3.2.51 config.reload_classes_only_on_change
추적된 파일이 변경될 때만 클래스를 리로딩하는 기능을 활성화하거나 비활성화합니다. 기본적으로 autoload paths의 모든 것을 추적하며 true
로 설정되어 있습니다. config.enable_reloading
이 false
인 경우, 이 옵션은 무시됩니다.
3.2.52 config.require_master_key
ENV["RAILS_MASTER_KEY"]
또는 config/master.key
파일을 통해 master key가 제공되지 않은 경우 앱이 부팅되지 않도록 합니다.
3.2.53 config.sandbox_by_default
true
일 때, rails console이 sandbox 모드로 시작됩니다. sandbox 모드가 아닌 상태로 rails console을 시작하려면 --no-sandbox
를 지정해야 합니다. 이는 프로덕션 데이터베이스에 실수로 쓰기 작업을 하는 것을 방지하는 데 도움이 됩니다. 기본값은 false
입니다.
3.2.54 config.secret_key_base
애플리케이션의 key generator를 위한 입력 secret을 지정하는 대체 수단입니다. 이 값을 설정하지 않고 대신 config/credentials.yml.enc
에 secret_key_base
를 지정하는 것이 권장됩니다. 더 자세한 정보와 대체 설정 방법은 secret_key_base
API 문서를 참조하세요.
3.2.55 config.server_timing
true
일 때, ServerTiming
미들웨어를 미들웨어 스택에 추가합니다. 기본값은 false
이지만, 기본 생성된 config/environments/development.rb
파일에서는 true
로 설정되어 있습니다.
3.2.56 config.session_options
config.session_store
에 전달되는 추가 옵션입니다. 직접 수정하는 대신 config.session_store
를 사용하여 이를 설정해야 합니다.
config.session_store :cookie_store, key: "_your_app_session"
config.session_options # => {key: "_your_app_session"}
3.2.57 config.session_store
세션을 저장하는 데 사용할 클래스를 지정합니다. 가능한 값은 :cache_store
, :cookie_store
, :mem_cache_store
, 커스텀 store, 또는 :disabled
입니다. :disabled
는 Rails에게 세션을 처리하지 않도록 지시합니다.
이 설정은 setter 대신 일반 메서드 호출을 통해 구성됩니다. 이를 통해 추가 옵션을 전달할 수 있습니다:
config.session_store :cookie_store, key: "_your_app_session"
만약 커스텀 store가 심볼로 지정되면, ActionDispatch::Session
네임스페이스로 해석됩니다.
# ActionDispatch::Session::MyCustomStore를 세션 저장소로 사용
config.session_store :my_custom_store
The default store는 애플리케이션 이름을 session key로 사용하는 cookie store입니다.
3.2.58 config.silence_healthcheck_path
로그에서 무시되어야 하는 health check의 경로를 지정합니다. 무시 기능을 구현하기 위해 Rails::Rack::SilenceRequest
를 사용합니다. 특히 초기 단계의 애플리케이션에서 health check가 production 로그를 채우는 것을 방지하기 위한 것입니다.
config.silence_healthcheck_path = "/up" 경로로 들어오는 HTTP 요청에 대해서는 로그를 출력하지 않습니다.
3.2.59 config.ssl_options
ActionDispatch::SSL
middleware의 설정 옵션입니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | {} |
5.0 | { hsts: { subdomains: true } } |
3.2.60 config.time_zone
애플리케이션의 기본 시간대를 설정하고 Active Record에서 시간대 인식을 활성화합니다.
3.2.61 config.x
애플리케이션 config 객체에 중첩된 커스텀 설정을 쉽게 추가하는데 사용됩니다.
config.x.payment_processing.schedule = :daily
Rails.configuration.x.payment_processing.schedule # => :daily
Custom Configuration을 참조하세요.
3.2.62 config.yjit
Ruby 3.3부터 성능을 크게 향상시키기 위해 YJIT를 활성화합니다. 메모리가 제한된 환경에 배포하는 경우 이를 false
로 설정하고 싶을 수 있습니다.
시작 버전 | 기본값 |
---|---|
(original) | false |
7.2 | true |
8.1 | !Rails.env.local? |
3.3 Assets를 설정하기
3.3.1 config.assets.css_compressor
CSS 압축기를 정의합니다. 기본적으로 sass-rails
로 설정됩니다. 현재 유일한 대안 값은 yui-compressor
gem을 사용하는 :yui
입니다.
3.3.2 config.assets.js_compressor
JavaScript 압축기를 정의합니다. 가능한 값은 :terser
, :closure
, :uglifier
, :yui
이며, 각각 terser
, closure-compiler
, uglifier
, yui-compressor
gem의 사용이 필요합니다.
3.3.3 config.assets.gzip
압축되지 않은 assets와 함께 gzip으로 압축된 버전의 컴파일된 assets 생성을 활성화하는 플래그입니다. 기본값은 true
입니다.
3.3.4 config.assets.paths
assets를 찾을 때 사용되는 경로를 포함합니다. 이 설정 옵션에 경로를 추가하면 해당 경로들이 assets 검색에 사용됩니다.
3.3.5 config.assets.precompile
bin/rails assets:precompile
이 실행될 때 사전 컴파일될 추가 assets(application.css
와 application.js
외)를 지정할 수 있습니다.
3.3.6 config.assets.unknown_asset_fallback
sprockets-rails 3.2.0 이상을 사용하는 경우, asset이 pipeline에 없을 때 asset pipeline의 동작을 수정할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | true |
5.1 | false |
3.3.7 config.assets.prefix
assets가 제공되는 prefix를 정의합니다. 기본값은 /assets
입니다.
3.3.8 config.assets.manifest
asset 사전 컴파일러의 manifest 파일에 사용될 전체 경로를 정의합니다. 기본값은 public 폴더 내 config.assets.prefix
디렉토리에 있는 manifest-<random>.json
파일입니다.
3.3.9 config.assets.digest
asset 이름에 SHA256 지문 사용을 활성화합니다. 기본값은 true
입니다.
3.3.10 config.assets.debug
assets의 연결과 압축을 비활성화합니다. development.rb
에서 기본값은 true
입니다.
3.3.11 config.assets.version
3.3.12 config.assets.digest_algorithm
SHA256 해시 생성에 사용되는 옵션 문자열입니다. 이를 변경하면 모든 파일을 재컴파일하도록 강제할 수 있습니다.
3.3.13 config.assets.compile
production 환경에서 실시간 Sprockets 컴파일을 켤 수 있는 boolean 값입니다.
3.3.14 config.assets.logger
Log4r 또는 기본 Ruby Logger
클래스의 인터페이스를 따르는 logger를 허용합니다. 기본값은 config.logger
에 설정된 것과 동일합니다. config.assets.logger
를 false
로 설정하면 제공되는 asset 로깅이 꺼집니다.
3.3.15 config.assets.quiet
asset 요청의 로깅을 비활성화합니다. config/environments/development.rb
에서 기본적으로 true
로 설정됩니다.
3.4 Generators 설정하기
Rails는 config.generators
메소드를 사용해서 어떤 generator가 사용될지 변경할 수 있습니다. 이 메소드는 block을 받습니다:
config.generators do |g|
g.orm :active_record
g.test_framework :test_unit
end
generators를 구성할 때 블록을 사용할 수 있습니다. generators는 Rails에서 다양한 컴포넌트를 생성하는 데 사용됩니다. 위 예시에서는 ORM과 테스트 프레임워크를 지정하고 있습니다.
이 블록에서 사용할 수 있는 전체 메소드는 다음과 같습니다:
force_plural
은 모델 이름의 복수형을 허용합니다. 기본값은false
입니다.helper
는 helper를 생성할지 여부를 정의합니다. 기본값은true
입니다.integration_tool
은 integration test를 생성하는 데 사용할 integration tool을 정의합니다. 기본값은:test_unit
입니다.system_tests
는 system test를 생성하는 데 사용할 integration tool을 정의합니다. 기본값은:test_unit
입니다.orm
은 사용할 orm을 정의합니다. 기본값은false
이며 기본적으로 Active Record를 사용합니다.resource_controller
는bin/rails generate resource
사용 시 controller를 생성하는 데 사용할 generator를 정의합니다. 기본값은:controller
입니다.resource_route
는 resource route 정의를 생성할지 여부를 정의합니다. 기본값은true
입니다.scaffold_controller
는resource_controller
와 다르며,bin/rails generate scaffold
사용 시 scaffolded controller를 생성하는 데 사용할 generator를 정의합니다. 기본값은:scaffold_controller
입니다.test_framework
는 사용할 test framework를 정의합니다. 기본값은false
이며 기본적으로 minitest를 사용합니다.template_engine
은 ERB나 Haml과 같은 사용할 template engine을 정의합니다. 기본값은:erb
입니다.apply_rubocop_autocorrect_after_generate!
는 Rails generator 실행 후 RuboCop의 autocorrect 기능을 적용합니다.
3.5 Middleware 설정하기
모든 Rails 애플리케이션은 개발 환경에서 다음 순서로 사용되는 표준 middleware 세트와 함께 제공됩니다:
3.5.1 ActionDispatch::HostAuthorization
DNS rebinding과 다른 Host
헤더 공격을 방지합니다.
다음과 같은 설정으로 개발 환경에 기본적으로 포함되어 있습니다:
Rails.application.config.hosts = [
IPAddr.new("0.0.0.0/0"), # 모든 IPv4 주소들
IPAddr.new("::/0"), # 모든 IPv6 주소들
"localhost", # localhost 예약 도메인
ENV["RAILS_DEVELOPMENT_HOSTS"] # 개발용 추가 호스트들(콤마로 구분)
]
다른 환경에서는 Rails.application.config.hosts
가 비어있고 Host
헤더 검사가 수행되지 않습니다. production 환경에서 헤더 공격을 방지하고 싶다면, 아래와 같이 수동으로 허용할 host를 지정해야 합니다:
Rails.application.config.hosts << "product.com"
Request의 host는 case 연산자(#===
)를 사용하여 hosts
항목과 대조됩니다. 이를 통해 hosts
는 Regexp
, Proc
, IPAddr
등의 타입을 지원할 수 있습니다. 다음은 정규표현식을 사용한 예시입니다.
# `www.product.com`와 `beta1.product.com` 같은 서브도메인으로부터의
# 요청을 허용합니다.
Rails.application.config.hosts << /.*\.product\.com/
제공된 regexp는 양쪽 끝에 앵커(\A
와 \z
)가 감싸지므로 전체 hostname과 일치해야 합니다. 예를 들어 /product.com/
은 앵커가 추가되면 www.product.com
과 매치되지 않습니다.
모든 sub-domain을 허용할 수 있는 특별한 케이스가 지원됩니다:
# `www.product.com`과 `beta1.product.com` 같은 서브도메인에서의
# 요청을 허용합니다.
Rails.application.config.hosts << ".product.com"
Host Authorization 체크에서 특정 요청을 제외하고 싶다면 config.host_authorization.exclude
를 설정하면 됩니다:
# /healthcheck/ 경로에 대한 요청을 host 검사에서 제외
Rails.application.config.host_authorization = {
exclude: ->(request) { request.path.include?("healthcheck") }
}
승인되지 않은 host로 요청이 올 경우, 기본 Rack application이 실행되어 403 Forbidden
으로 응답합니다. 이는 config.host_authorization.response_app
을 설정하여 커스터마이즈할 수 있습니다. 예를 들어:
Rails.application.config.host_authorization = {
response_app: -> env do
[400, { "Content-Type" => "text/plain" }, ["잘못된 요청"]]
end
}
3.5.2 ActionDispatch::ServerTiming
응답에 Server-Timing
헤더를 추가하며, 이는 서버의 성능 지표를 포함합니다. 이 데이터는 브라우저의 개발자 도구의 Network 패널에서 응답을 검사하여 볼 수 있습니다. 대부분의 브라우저는 이 데이터를 시각화하는 Timing 탭을 제공합니다.
3.5.3 ActionDispatch::SSL
모든 요청이 HTTPS를 통해 제공되도록 강제합니다. config.force_ssl
이 true
로 설정된 경우 활성화됩니다. 이에 전달되는 옵션은 config.ssl_options
를 통해 구성할 수 있습니다.
3.5.4 ActionDispatch::Static
정적 자산을 제공하는 데 사용됩니다. config.public_file_server.enabled
가 false
인 경우 비활성화됩니다. index
가 아닌 이름의 정적 디렉토리 인덱스 파일을 제공해야 하는 경우 config.public_file_server.index_name
을 설정하세요. 예를 들어, 디렉토리 요청에 대해 index.html
대신 main.html
을 제공하려면 config.public_file_server.index_name
을 "main"
으로 설정하세요.
3.5.5 ActionDispatch::Executor
스레드 안전 코드 리로딩을 허용합니다. config.allow_concurrency
가 false
인 경우 비활성화되며, 이로 인해 Rack::Lock
이 로드됩니다. Rack::Lock
은 앱을 뮤텍스로 감싸서 한 번에 하나의 스레드만 호출할 수 있도록 합니다.
3.5.6 ActiveSupport::Cache::Strategy::LocalCache
기본적인 메모리 기반 캐시 역할을 합니다. 이 캐시는 스레드 안전하지 않으며 단일 스레드를 위한 임시 메모리 캐시로만 사용됩니다.
3.5.7 Rack::Runtime
요청을 실행하는 데 걸린 시간(초)을 포함하는 X-Runtime
헤더를 설정합니다.
3.5.8 Rails::Rack::Logger
요청이 시작되었음을 로그에 알립니다. 요청이 완료되면 모든 로그를 플러시합니다.
3.5.9 ActionDispatch::ShowExceptions
애플리케이션에서 반환된 모든 예외를 구조하고, 요청이 로컬이거나 config.consider_all_requests_local
이 true
로 설정된 경우 보기 좋은 예외 페이지를 렌더링합니다. config.action_dispatch.show_exceptions
가 :none
으로 설정된 경우 예외가 발생합니다.
3.5.10 ActionDispatch::RequestId
고유한 X-Request-Id 헤더를 응답에서 사용할 수 있게 하고 ActionDispatch::Request#uuid
메서드를 활성화합니다. config.action_dispatch.request_id_header
로 구성 가능합니다.
3.5.11 ActionDispatch::RemoteIp
IP 스푸핑 공격을 확인하고 요청 헤더에서 유효한 client_ip
를 가져옵니다. config.action_dispatch.ip_spoofing_check
및 config.action_dispatch.trusted_proxies
옵션으로 구성 가능합니다.
3.5.12 Rack::Sendfile
파일에서 제공되는 본문을 가진 응답을 가로채고 서버별 X-Sendfile 헤더로 대체합니다. config.action_dispatch.x_sendfile_header
로 구성 가능합니다.
3.5.13 ActionDispatch::Callbacks
요청을 처리하기 전에 prepare 콜백들을 실행합니다.
3.5.14 ActionDispatch::Cookies
요청에 대한 쿠키를 설정합니다.
3.5.15 ActionDispatch::Session::CookieStore
세션을 쿠키에 저장하는 역할을 합니다. config.session_store
를 변경하여 다른 middleware를 사용할 수 있습니다.
3.5.16 ActionDispatch::Flash
flash
키들을 설정합니다. config.session_store
가 값으로 설정되어 있을 때만 사용 가능합니다.
3.5.17 Rack::MethodOverride
params[:_method]
가 설정되어 있으면 메소드를 오버라이드할 수 있게 합니다. 이 middleware는 PATCH, PUT, DELETE HTTP 메소드 타입들을 지원합니다.
3.5.18 Rack::Head
모든 HEAD 요청에 대해 빈 body를 반환합니다. 다른 모든 요청은 변경하지 않고 그대로 둡니다.
3.5.19 Adding Custom Middleware
이러한 일반적인 middleware 외에도 config.middleware.use
메소드를 사용하여 자신만의 middleware를 추가할 수 있습니다:
config.middleware.use Magical::Unicorns
middleware를 등록하려면 이렇게 하면 됩니다.
이는 미들웨어 스택의 끝에 Magical::Unicorns
미들웨어를 추가할 것입니다. 다른 미들웨어 앞에 추가하고 싶다면 insert_before
를 사용할 수 있습니다.
config.middleware.insert_before Rack::Head, Magical::Unicorns
middleware stack에서 특정한 미들웨어 앞에 다른 미들웨어를 추가할 수 있습니다.
인덱스를 사용하여 원하는 위치에 middleware를 삽입할 수도 있습니다. 예를 들어, Magical::Unicorns
middleware를 스택의 최상단에 삽입하고 싶다면 다음과 같이 할 수 있습니다:
config.middleware.insert_before 0, Magical::Unicorns
middleware 스택의 가장 앞에 새로운 middleware를 추가합니다.
또한 insert_after
는 다른 middleware 뒤에 middleware를 삽입할 수 있습니다:
config.middleware.insert_after Rack::Head, Magical::Unicorns
Rack::Head 다음에 middleware를 추가합니다.
미들웨어는 다른 것으로 완전히 교체될 수도 있습니다:
config.middleware.swap ActionController::Failsafe, Lifo::Failsafe
middleware 중에 ActionController::Failsafe를 Lifo::Failsafe로 교체합니다.
Middleware는 다른 위치로 이동될 수 있습니다:
config.middleware.move_before ActionDispatch::Flash, Magical::Unicorns
이는 Magical::Unicorns
middleware를 ActionDispatch::Flash
앞으로 이동시킵니다. 뒤로도 이동시킬 수 있습니다:
config.middleware.move_after ActionDispatch::Flash, Magical::Unicorns
ActionDispatch::Flash 다음으로 Magical::Unicorns를 이동합니다.
또한 아예 stack에서 제거될 수 있습니다:
config.middleware.delete Rack::MethodOverride
Rack::MethodOverride middleware를 제거합니다. 즉, _method parameter 기반의 HTTP method spoofing이 더 이상 작동하지 않게 됩니다.
3.6 i18n 설정하기
이러한 모든 설정 옵션들은 I18n
라이브러리에 위임됩니다.
3.6.1 config.i18n.available_locales
앱에서 허용되는 사용 가능한 locale들을 정의합니다. 기본값은 locale 파일에서 찾은 모든 locale 키이며, 새로운 애플리케이션에서는 보통 :en
만 있습니다.
3.6.2 config.i18n.default_locale
i18n에 사용되는 애플리케이션의 기본 locale을 설정합니다. 기본값은 :en
입니다.
3.6.3 config.i18n.enforce_available_locales
i18n을 통과하는 모든 locale이 available_locales
목록에 선언되어 있어야 함을 보장하며, 사용할 수 없는 locale을 설정할 때 I18n::InvalidLocale
예외를 발생시킵니다. 기본값은 true
입니다. 이는 사용자 입력으로부터 유효하지 않은 locale 설정을 방지하는 보안 조치로 작동하므로, 특별히 필요한 경우가 아니라면 이 옵션을 비활성화하지 않는 것이 좋습니다.
3.6.4 config.i18n.load_path
Rails가 locale 파일을 찾는 경로를 설정합니다. 기본값은 config/locales/**/*.{yml,rb}
입니다.
3.6.5 config.i18n.raise_on_missing_translations
누락된 번역에 대해 오류를 발생시킬지 여부를 결정합니다. true
인 경우, 뷰와 컨트롤러에서 I18n::MissingTranslationData
를 발생시킵니다. :strict
인 경우, 모델에서도 오류를 발생시킵니다. 기본값은 false
입니다.
3.6.6 config.i18n.fallbacks
누락된 번역에 대한 대체(fallback) 동작을 설정합니다. 이 옵션의 사용 예시는 다음 3가지가 있습니다:
기본 locale을 대체로 사용하기 위해 옵션을
true
로 설정할 수 있습니다:config.i18n.fallbacks = true
또는 대체로 사용할 locale 배열을 설정할 수 있습니다:
config.i18n.fallbacks = [:tr, :en]
또는 각 locale에 대해 서로 다른 대체를 개별적으로 설정할 수 있습니다. 예를 들어,
:az
와:da
에 대해 각각:tr
과:de
,:en
을 대체로 사용하고 싶다면 다음과 같이 할 수 있습니다:config.i18n.fallbacks = { az: :tr, da: [:de, :en] } #또는 config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }
3.7 Active Model 설정하기
3.7.1 config.active_model.i18n_customize_full_message
[Error#full_message
][ActiveModel::Error#full_message] 형식을 i18n locale 파일에서 재정의할 수 있는지를 제어합니다. 기본값은 false
입니다.
true
로 설정하면, full_message
는 locale 파일의 attribute와 model 레벨에서 형식을 찾습니다. 기본 형식은 "%{attribute} %{message}"
이며, 여기서 attribute
는 속성의 이름이고 message
는 유효성 검사 관련 메시지입니다. 다음 예제는 모든 Person
속성의 형식과 특정 Person
속성(age
)의 형식을 재정의합니다.
class Person
include ActiveModel::Validations
attr_accessor :name, :age
validates :name, :age, presence: true
end
en:
activemodel: # 또는 activerecord:
errors:
models:
person:
# Person의 모든 속성에 대한 형식을 재정의:
format: "유효하지 않은 %{attribute} (%{message})"
attributes:
age:
# age 속성의 형식을 재정의:
format: "%{message}"
blank: "%{attribute}를 입력해주세요"
irb> person = Person.new.tap(&:valid?)
irb> person.errors.full_messages
=> [
"유효하지 않은 이름 (비어 있을 수 없습니다)",
"나이를 입력해주세요"
]
irb> person.errors.messages
=> {
:name => ["비어 있을 수 없습니다"],
:age => ["나이를 입력해주세요"]
}
이 메소드를 사용하여 지정된 attribute/value 쌍에 대한 전체 메시지 에러를 생성할 수 있습니다. full_message 메소드는 full_message
메시지를 생성하기 위해 필요한 모든 부분을 조합하여 사용합니다.
반환 값: 모든 부분이 조합된 메시지를 포함한 문자열
person = Person.new
person.errors.add(:name, :blank)
person.errors.full_message(:name, "can't be blank")
# => "Name can't be blank"
I18n
lookups를 활용하여 메시지를 찾을 수도 있습니다:
I18n.backend.store_translations(:en, errors: {
full_messages: {
format: "%{message}"
}
})
person = Person.new
person.errors.add(:name, :blank)
person.errors.full_message(:name, "can't be blank")
# => "can't be blank"
3.8 Active Record 설정하기
config.active_record
는 다양한 설정 옵션들을 포함합니다:
3.8.1 config.active_record.logger
Log4r 또는 기본 Ruby Logger 클래스의 인터페이스를 준수하는 logger를 받아들이며, 이는 새로 생성되는 모든 데이터베이스 연결에 전달됩니다. Active Record 모델 클래스나 Active Record 모델 인스턴스에서 logger
를 호출하여 이 logger를 조회할 수 있습니다. 로깅을 비활성화하려면 nil
로 설정하세요.
3.8.2 config.active_record.primary_key_prefix_type
primary key 컬럼의 명명 방식을 조정할 수 있습니다. 기본적으로 Rails는 primary key 컬럼이 id
로 명명된다고 가정합니다(이 설정 옵션을 지정할 필요가 없습니다). 다음 두 가지 다른 옵션이 있습니다:
:table_name
은 Customer 클래스의 primary key를customerid
로 만듭니다.:table_name_with_underscore
는 Customer 클래스의 primary key를customer_id
로 만듭니다.
3.8.3 config.active_record.table_name_prefix
테이블 이름 앞에 추가될 전역 문자열을 설정할 수 있습니다. 이를 northwest_
로 설정하면, Customer 클래스는 테이블로 northwest_customers
를 찾습니다. 기본값은 빈 문자열입니다.
3.8.4 config.active_record.table_name_suffix
테이블 이름 뒤에 추가될 전역 문자열을 설정할 수 있습니다. 이를 _northwest
로 설정하면, Customer 클래스는 테이블로 customers_northwest
를 찾습니다. 기본값은 빈 문자열입니다.
3.8.5 config.active_record.schema_migrations_table_name
스키마 마이그레이션 테이블의 이름으로 사용될 문자열을 설정할 수 있습니다.
3.8.6 config.active_record.internal_metadata_table_name
내부 메타데이터 테이블의 이름으로 사용될 문자열을 설정할 수 있습니다.
3.8.7 config.active_record.protected_environments
파괴적인 액션이 금지되어야 하는 환경 이름들의 배열을 설정할 수 있습니다.
3.8.8 config.active_record.pluralize_table_names
Rails가 데이터베이스에서 단수형 또는 복수형 테이블 이름을 찾을지 지정합니다. true
(기본값)로 설정하면, Customer 클래스는 customers
테이블을 사용합니다. false
로 설정하면, Customer 클래스는 customer
테이블을 사용합니다.
3.8.9 config.active_record.default_timezone
데이터베이스에서 날짜와 시간을 가져올 때 Time.local
(:local
로 설정된 경우) 또는 Time.utc
(:utc
로 설정된 경우)를 사용할지 결정합니다. 기본값은 :utc
입니다.
3.8.10 config.active_record.schema_format
데이터베이스 스키마를 파일로 덤프하는 형식을 제어합니다. 옵션은 마이그레이션에 의존하는 데이터베이스 독립적인 버전을 위한 :ruby
(기본값) 또는 (잠재적으로 데이터베이스 종속적인) SQL 문장들의 집합을 위한 :sql
입니다.
3.8.11 config.active_record.error_on_ignored_order
배치 쿼리 중에 쿼리의 순서가 무시될 때 에러를 발생시켜야 하는지 지정합니다. 옵션은 true
(에러 발생) 또는 false
(경고)입니다. 기본값은 false
입니다.
3.8.12 config.active_record.timestamped_migrations
migration이 연속된 정수로 번호가 매겨질지 또는 timestamp로 번호가 매겨질지를 제어합니다. 기본값은 true
이며, timestamp를 사용하는 것이 선호됩니다. 특히 여러 개발자가 동일한 애플리케이션에서 작업하는 경우에 더욱 그렇습니다.
3.8.13 config.active_record.automatically_invert_plural_associations
Active Record가 복수형으로 된 이름의 inverse relation을 자동으로 찾을지 여부를 제어합니다.
예시:
class Post < ApplicationRecord
has_many :comments
end
class Comment < ApplicationRecord
belongs_to :post
end
위의 경우 Active Record는 Post
에서 단수형인 :comment
연관만을 찾았고, 찾을 수 없었습니다.
이 옵션을 활성화하면 :comments
연관도 함께 찾게 됩니다. 대부분의 경우 역방향 연관 관계를 찾는 것은 불필요한 쿼리를 방지할 수 있어 유용하지만, 이를 예상하지 않는 레거시 코드와의 하위 호환성 문제를 일으킬 수 있습니다.
이 동작은 모델별로 비활성화할 수 있습니다:
class Comment < ApplicationRecord
self.automatically_invert_plural_associations = false
belongs_to :post
end
그리고 association 별로 설정할 수 있습니다:
class Comment < ApplicationRecord
self.automatically_invert_plural_associations = true
# inverse_of: nil을 사용하여 자동 inverse 추론을 비활성화합니다
belongs_to :post, inverse_of: nil
end
시작 버전 | 기본값 |
---|---|
(original) | false |
3.8.14 config.active_record.validate_migration_timestamps
migration timestamp를 검증할지 여부를 제어합니다. 설정되면, migration 파일의 timestamp prefix가 현재 시간과 관련된 timestamp보다 하루 이상 앞서 있을 경우 에러가 발생합니다. 이는 migration 파일의 날짜를 미래로 설정하는 것을 방지하기 위한 것으로, migration 생성 및 다른 migration 명령에 영향을 줄 수 있습니다. config.active_record.timestamped_migrations
가 true
로 설정되어 있어야 합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.2 | true |
3.8.15 config.active_record.db_warnings_action
SQL 쿼리가 경고를 생성할 때 취할 동작을 제어합니다. 다음 옵션들을 사용할 수 있습니다:
:ignore
- 데이터베이스 경고를 무시합니다. 이것이 기본값입니다.:log
- 데이터베이스 경고를:warn
레벨로ActiveRecord.logger
를 통해 로깅합니다.:raise
- 데이터베이스 경고를ActiveRecord::SQLWarning
으로 발생시킵니다.:report
- 데이터베이스 경고를 Rails의 에러 리포터 구독자들에게 보고합니다.Custom proc - 사용자 정의 proc을 제공할 수 있습니다. 이는
SQLWarning
에러 객체를 받아야 합니다.예시:
config.active_record.db_warnings_action = ->(warning) do # 사용자 정의 예외 보고 서비스에 보고 Bugsnag.notify(warning.message) do |notification| notification.add_metadata(:warning_code, warning.code) notification.add_metadata(:warning_level, warning.level) end end
3.8.16 config.active_record.db_warnings_ignore
구성된 db_warnings_action
에 관계없이 무시될 경고 코드와 메시지의 허용 목록을 지정합니다.
기본 동작은 모든 경고를 보고하는 것입니다. 무시할 경고는 문자열이나 정규표현식으로 지정할 수 있습니다. 예시:
config.active_record.db_warnings_action = :raise
# 다음 경고들은 raise되지 않습니다
config.active_record.db_warnings_ignore = [
/Invalid utf8mb4 character string/,
"An exact warning message",
"1062", # MySQL Error 1062: Duplicate entry
]
3.8.17 config.active_record.migration_strategy
migration에서 schema statement 메소드를 수행하는데 사용되는 strategy 클래스를 제어합니다. 기본 클래스는 connection adapter에 위임합니다. 커스텀 strategy는 ActiveRecord::Migration::ExecutionStrategy
를 상속받아야 하거나, 구현되지 않은 메소드에 대해 기본 동작을 유지하기 위해 DefaultStrategy
를 상속받을 수 있습니다.
class CustomMigrationStrategy < ActiveRecord::Migration::DefaultStrategy
def drop_table(*)
raise "테이블 삭제는 지원되지 않습니다!"
end
end
config.active_record.migration_strategy = CustomMigrationStrategy
3.8.18 config.active_record.lock_optimistically
Active Record가 optimistic locking을 사용할지 여부를 제어하며 기본값은 true
입니다.
3.8.19 config.active_record.cache_timestamp_format
캐시 키의 타임스탬프 값 형식을 제어합니다. 기본값은 :usec
입니다.
3.8.20 config.active_record.record_timestamps
모델의 create
와 update
작업에서 타임스탬프 기록 여부를 제어하는 boolean 값입니다. 기본값은 true
입니다.
3.8.21 config.active_record.partial_inserts
boolean 값이며 새 레코드를 생성할 때 partial writes를 사용할지 여부를 제어합니다(즉, 기본값과 다른 속성만 insert할지 여부).
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
Starting with version | The default value is |
---|---|
(original) | true |
7.0 | false |
3.8.22 config.active_record.partial_updates
boolean 값이며 기존 레코드를 업데이트할 때 partial writes를 사용할지 여부를 제어합니다(즉, dirty 상태인 속성만 업데이트할지 여부). partial updates를 사용할 때는 동시 업데이트가 오래된 읽기 상태를 기반으로 속성을 쓸 수 있으므로 optimistic locking config.active_record.lock_optimistically
도 함께 사용해야 합니다. 기본값은 true
입니다.
3.8.23 config.active_record.maintain_test_schema
테스트를 실행할 때 Active Record가 테스트 데이터베이스 스키마를 db/schema.rb
(또는 db/structure.sql
)와 동기화된 상태로 유지할지 여부를 제어하는 boolean 값입니다. 기본값은 true
입니다.
3.8.24 config.active_record.dump_schema_after_migration
마이그레이션을 실행할 때 스키마 덤프(db/schema.rb
또는 db/structure.sql
)를 수행할지 여부를 제어하는 플래그입니다. Rails가 생성하는 config/environments/production.rb
에서는 false
로 설정됩니다. 이 설정이 지정되지 않은 경우 기본값은 true
입니다.
3.8.25 config.active_record.dump_schemas
db:schema:dump
를 호출할 때 덤프할 데이터베이스 스키마를 제어합니다.
옵션은 schema_search_path
에 나열된 스키마를 덤프하는 :schema_search_path
(기본값),
schema_search_path
와 관계없이 항상 모든 스키마를 덤프하는 :all
,
또는 쉼표로 구분된 스키마 문자열입니다.
3.8.26 config.active_record.before_committed_on_all_records
트랜잭션에 등록된 모든 레코드에서 before_committed! 콜백을 활성화합니다. 이전 동작은 레코드의 첫 번째 복사본에서만 콜백을 실행하는 것이었습니다.
트랜잭션에 동일한 레코드의 복사본이 여러 개 등록된 경우.
시작 버전 | 기본값 |
---|---|
(original) | false |
7.1 | true |
3.8.27 config.active_record.belongs_to_required_by_default
belongs_to
관계가 존재하지 않을 때 레코드의 유효성 검사가 실패할지 여부를 제어하는 boolean 값입니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | nil |
5.0 | true |
3.8.28 config.active_record.belongs_to_required_validates_foreign_key
부모가 필수일 때 부모 관련 컬럼만 존재 여부를 검증하도록 활성화합니다. 이전 동작은 부모 레코드의 존재 여부를 검증하는 것이었는데, 이는 부모가 변경되지 않았더라도 자식 레코드가 업데이트될 때마다 부모를 가져오기 위한 추가 쿼리를 수행했습니다.
시작 버전 | 기본값 |
---|---|
(original) | true |
7.1 | false |
3.8.29 config.active_record.marshalling_format_version
7.1
로 설정하면 Marshal.dump
를 사용한 Active Record 인스턴스의 더 효율적인 직렬화가 가능합니다.
이는 직렬화 형식을 변경하므로, 이 방식으로 직렬화된 모델은 이전 버전(< 7.1)의 Rails에서 읽을 수 없습니다. 하지만 이 최적화가 활성화되어 있는지 여부와 관계없이 이전 형식을 사용하는 메시지는 여전히 읽을 수 있습니다.
시작 버전 | 기본값 |
---|---|
(original) | 6.1 |
7.1 | 7.1 |
3.8.30 config.active_record.action_on_strict_loading_violation
관계에 strict_loading이 설정되어 있을 때 예외를 발생시키거나 로깅하도록 활성화합니다. 모든 환경에서 기본값은 :raise
입니다. 예외를 발생시키는 대신 로거에 위반 사항을 보내려면 :log
로 변경할 수 있습니다.
3.8.31 config.active_record.strict_loading_by_default
기본적으로 strict_loading 모드를 활성화하거나 비활성화하는 boolean 값입니다. 기본값은 false
입니다.
3.8.32 config.active_record.strict_loading_mode
strict loading이 보고되는 모드를 설정합니다. 기본값은 :all
입니다. N + 1 쿼리를 유발하는 association을 로딩할 때만 보고하도록 :n_plus_one_only
로 변경할 수 있습니다.
3.8.33 config.active_record.index_nested_attribute_errors
중첩된 has_many
관계에 대한 에러를 인덱스와 함께 표시할 수 있게 합니다. 기본값은 false
입니다.
3.8.34 config.active_record.use_schema_cache_dump
사용자가 데이터베이스에 쿼리를 보내지 않고도 db/schema_cache.yml
(bin/rails db:schema:cache:dump
로 생성됨)에서 schema cache 정보를 가져올 수 있게 합니다. 기본값은 true
입니다.
3.8.35 config.active_record.cache_versioning
#cache_version
메소드에서 변경되는 버전이 포함된 안정적인 #cache_key
메소드를 사용할지 여부를 나타냅니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
Starting with version | The default value is |
---|---|
(original) | false |
5.2 | true |
3.8.36 config.active_record.collection_cache_versioning
ActiveRecord::Relation
타입의 캐시되는 객체가 변경될 때 relation의 cache key의 volatile 정보(최대 업데이트 시점과 개수)를 cache version으로 이동하여 cache key 재사용을 지원할 수 있게 합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
Starting with version | The default value is |
---|---|
(original) | false |
6.0 | true |
3.8.37 config.active_record.has_many_inversing
belongs_to
에서 has_many
연관관계를 순회할 때 역방향 레코드 설정을 활성화합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
6.1 | true |
3.8.38 config.active_record.automatic_scope_inversing
scope가 있는 연관관계에 대해 inverse_of
를 자동으로 유추하는 것을 활성화합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.0 | true |
3.8.39 config.active_record.destroy_association_async_job
관련 레코드를 백그라운드에서 삭제하는 데 사용될 job을 지정할 수 있습니다. 기본값은 ActiveRecord::DestroyAssociationAsyncJob
입니다.
3.8.40 config.active_record.destroy_association_async_batch_size
dependent: :destroy_async
연관관계 옵션으로 백그라운드 job에서 삭제될 최대 레코드 수를 지정할 수 있습니다. 다른 조건이 동일할 때, 낮은 batch size는 더 많고 짧게 실행되는 백그라운드 job을 생성하고, 높은 batch size는 더 적고 오래 실행되는 백그라운드 job을 생성합니다. 이 옵션의 기본값은 nil
이며, 이는 주어진 연관관계에 대한 모든 종속 레코드가 동일한 백그라운드 job에서 삭제됨을 의미합니다.
3.8.41 config.active_record.queues.destroy
destroy job에 사용할 Active Job queue를 지정할 수 있습니다. 이 옵션이 nil
일 때, purge job은 기본 Active Job queue로 전송됩니다(참조: config.active_job.default_queue_name
). 기본값은 nil
입니다.
3.8.42 config.active_record.enumerate_columns_in_select_statements
true
일 때, SELECT
구문에 항상 컬럼 이름을 포함하고, 와일드카드 SELECT * FROM ...
쿼리를 피합니다. 이는 예를 들어 PostgreSQL 데이터베이스에 컬럼을 추가할 때 prepared statement 캐시 오류를 방지합니다. 기본값은 false
입니다.
3.8.43 config.active_record.verify_foreign_keys_for_fixtures
테스트에서 fixture가 로드된 후 모든 외래 키 제약 조건이 유효한지 확인합니다. PostgreSQL과 SQLite에서만 지원됩니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.0 | true |
3.8.44 config.active_record.raise_on_assign_to_attr_readonly
attr_readonly 속성에 대한 할당 시 예외를 발생시킵니다. 이전 동작에서는 할당은 허용되었지만 데이터베이스에 변경사항이 조용히 저장되지 않았습니다.
시작 버전 | 기본값 |
---|---|
(원본) | false |
7.1 | true |
3.8.45 config.active_record.run_commit_callbacks_on_first_saved_instances_in_transaction
트랜잭션 내에서 여러 Active Record 인스턴스가 동일한 레코드를 변경할 때, Rails는 그 중 하나에 대해서만 after_commit
또는 after_rollback
콜백을 실행합니다. 이 옵션은 Rails가 어떤 인스턴스에서 콜백을 받을지 지정합니다.
true
일 경우, 인스턴스 상태가 오래되었더라도 처음 저장한 인스턴스에서 트랜잭션 콜백이 실행됩니다.
false
일 경우, 가장 최신 인스턴스 상태를 가진 인스턴스에서 트랜잭션 콜백이 실행됩니다. 이러한 인스턴스는 다음과 같이 선택됩니다:
- 일반적으로 트랜잭션 내에서 주어진 레코드를 마지막으로 저장한 인스턴스에서 트랜잭션 콜백이 실행됩니다.
- 두 가지 예외가 있습니다:
- 레코드가 트랜잭션 내에서 생성된 후 다른 인스턴스에 의해 업데이트되면,
after_create_commit
콜백이 두 번째 인스턴스에서 실행됩니다. 이는 해당 인스턴스의 상태를 기반으로 실행될after_update_commit
콜백 대신 실행됩니다. - 레코드가 트랜잭션 내에서 삭제된 경우, 오래된 인스턴스가 이후에 업데이트를 수행했더라도(0개의 행에 영향을 미침)
after_destroy_commit
콜백은 마지막으로 삭제된 인스턴스에서 실행됩니다.
- 레코드가 트랜잭션 내에서 생성된 후 다른 인스턴스에 의해 업데이트되면,
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(원본) | true |
7.1 | false |
3.8.46 config.active_record.default_column_serializer
특정 컬럼에 대해 명시적으로 지정되지 않은 경우 사용할 serializer 구현체입니다.
역사적으로 serialize
와 store
는 대체 serializer 구현체 사용을 허용하면서 기본적으로 YAML
을 사용했지만, 이는 매우 효율적이지 않은 포맷이며 주의해서 사용하지 않으면 보안 취약점의 원인이 될 수 있습니다.
따라서 데이터베이스 직렬화에 더 제한적이고 엄격한 포맷을 선호하는 것이 권장됩니다.
안타깝게도 Ruby 표준 라이브러리에는 적합한 기본값이 없습니다. JSON
이 포맷으로 작동할 수 있지만, json
gem은 지원되지 않는 타입을 문자열로 변환하여 버그를 유발할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
| 시작 버전 | 기본값 |
3.8.47 config.active_record.run_after_transaction_callbacks_in_order_defined
true
일 때, 모델에 정의된 순서대로 after_commit
콜백이 실행됩니다. false
일 때는 역순으로 실행됩니다.
다른 모든 콜백들은 항상 모델에 정의된 순서대로 실행됩니다(prepend: true
를 사용하지 않는 한).
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
버전 시작 | 기본값 |
---|---|
(original) | false |
7.1 | true |
3.8.48 config.active_record.query_log_tags_enabled
어댑터 수준의 쿼리 주석을 활성화할지 여부를 지정합니다. 기본값은 false
이지만, 기본 생성된 config/environments/development.rb
파일에서는 true
로 설정됩니다.
이것이 true
로 설정되면 데이터베이스 prepared statements가 자동으로 비활성화됩니다.
3.8.49 config.active_record.query_log_tags
SQL 주석에 삽입될 key/value 태그를 지정하는 Array
를 정의합니다. 기본값은 [ :application, :controller, :action, :job ]
입니다. 사용 가능한 태그는 :application
, :controller
, :namespaced_controller
, :action
, :job
, :source_location
입니다.
3.8.50 config.active_record.query_log_tags_format
태그에 사용할 포맷터를 지정하는 Symbol
입니다. 유효한 값은 :sqlcommenter
와 :legacy
입니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
버전 시작 | 기본값 |
---|---|
(original) | :legacy |
7.1 | :sqlcommenter |
3.8.51 config.active_record.cache_query_log_tags
쿼리 로그 태그의 캐싱을 활성화할지 여부를 지정합니다. 많은 수의 쿼리를 실행하는 애플리케이션의 경우, 요청이나 작업 실행 기간 동안 컨텍스트가 변경되지 않을 때 쿼리 로그 태그를 캐싱하면 성능상의 이점을 얻을 수 있습니다. 기본값은 false
입니다.
3.8.52 config.active_record.schema_cache_ignored_tables
스키마 캐시 생성 시 무시되어야 할 테이블 목록을 정의합니다. 테이블 이름을 나타내는 문자열이나 정규식을 포함하는 Array
를 받습니다.
3.8.53 config.active_record.verbose_query_logs
데이터베이스 쿼리를 호출하는 메서드의 소스 위치를 관련 쿼리 아래에 로깅해야 하는지 지정합니다. 기본적으로 development 환경에서는 true
이고 다른 모든 환경에서는 false
입니다.
3.8.54 config.active_record.sqlite3_adapter_strict_strings_by_default
SQLite3Adapter가 strict strings 모드에서 사용되어야 하는지 지정합니다. strict strings 모드를 사용하면 큰따옴표로 된 문자열 리터럴이 비활성화됩니다.
SQLite는 큰따옴표로 된 문자열 리터럴과 관련하여 몇 가지 특이사항이 있습니다. 먼저 큰따옴표로 된 문자열을 식별자 이름으로 간주하려 하지만, 해당 식별자가 존재하지 않으면 문자열 리터럴로 간주합니다. 이러한 이유로 오타가 조용히 간과될 수 있습니다. 예를 들어, 존재하지 않는 컬럼에 대한 인덱스를 생성하는 것이 가능합니다. 자세한 내용은 SQLite 문서를 참조하세요.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.1 | true |
3.8.55 config.active_record.postgresql_adapter_decode_dates
PostgresqlAdapter가 date 컬럼을 디코딩해야 하는지 지정합니다.
ActiveRecord::Base.connection
.select_value("select '2024-01-01'::date").class #=> Date
기본값은 config.load_defaults
타겟 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.2 | true |
3.8.56 config.active_record.async_query_executor
비동기 쿼리가 어떻게 pool되는지 지정합니다.
기본값은 nil
이며, 이는 load_async
가 비활성화되어 있고 대신 쿼리가 foreground에서 직접 실행된다는 것을 의미합니다.
실제로 쿼리를 비동기적으로 수행하려면 :global_thread_pool
또는 :multi_thread_pool
로 설정해야 합니다.
:global_thread_pool
은 애플리케이션이 연결하는 모든 데이터베이스에 대해 단일 pool을 사용합니다. 이는 단일 데이터베이스만 있거나
한 번에 하나의 데이터베이스 shard만 쿼리하는 애플리케이션에 선호되는 구성입니다.
:multi_thread_pool
은 데이터베이스당 하나의 pool을 사용하며, 각 pool 크기는 database.yml
에서 max_threads
와 min_thread
속성을 통해
개별적으로 구성할 수 있습니다. 이는 정기적으로 여러 데이터베이스를 동시에 쿼리하고 최대 동시성을 더 정밀하게 정의해야 하는 애플리케이션에 유용할 수 있습니다.
3.8.57 config.active_record.global_executor_concurrency
config.active_record.async_query_executor = :global_thread_pool
과 함께 사용되며, 동시에 실행할 수 있는 비동기 쿼리의 수를 정의합니다.
기본값은 4
입니다.
이 숫자는 database.yml
에 구성된 데이터베이스 connection pool 크기와 함께 고려되어야 합니다. Connection pool은
foreground 스레드(예: 웹 서버 또는 job worker 스레드)와 background 스레드를 모두 수용할 수 있을 만큼 커야 합니다.
각 프로세스에 대해 Rails는 비동기 쿼리를 처리하기 위해 이만큼의 스레드를 사용하는 하나의 global query executor를 생성합니다. 따라서 pool 크기는
최소 thread_count + global_executor_concurrency + 1
이어야 합니다. 예를 들어, 웹 서버의 최대 스레드가 3개이고
global_executor_concurrency
가 4로 설정된 경우 pool 크기는 최소 8이어야 합니다.
3.8.58 config.active_record.yaml_column_permitted_classes
기본값은 [Symbol]
입니다. 애플리케이션이 ActiveRecord::Coders::YAMLColumn
의 safe_load()
에 추가 허용 클래스를 포함할 수 있게 합니다.
3.8.59 config.active_record.use_yaml_unsafe_load
기본값은 false
입니다. 애플리케이션이 ActiveRecord::Coders::YAMLColumn
에서 unsafe_load
사용을 선택할 수 있게 합니다.
3.8.60 config.active_record.raise_int_wider_than_64bit
기본값은 true
입니다. PostgreSQL 어댑터에 signed 64bit 표현보다 더 큰 정수가 제공될 때
예외를 발생시킬지 여부를 결정합니다.
3.8.61 config.active_record.generate_secure_token_on
has_secure_token
선언에 대한 값을 생성할 시점을 제어합니다. 기본적으로 model이 초기화될 때 값을 생성합니다:
class User < ApplicationRecord
has_secure_token
end
record = User.new
record.token # => "fwZcXX6SkJBJRogzMdciS7wf"
config.active_record.generate_secure_token_on = :create
를 사용하면, 모델이 생성될 때 값을 생성합니다:
# config/application.rb
config.active_record.generate_secure_token_on = :create
# app/models/user.rb
class User < ApplicationRecord
has_secure_token on: :create
end
record = User.new
record.token # => nil
record.save!
record.token # => "fwZcXX6SkJBJRogzMdciS7wf"
기본적으로 토큰은 레코드가 생성될 때만 생성됩니다.
시작 버전 | 기본값 |
---|---|
(original) | :create |
7.1 | :initialize |
3.8.62 config.active_record.permanent_connection_checkout
ActiveRecord::Base.connection
이 에러를 발생시킬지, deprecation 경고를 표시할지, 아니면 아무것도 하지 않을지를 제어합니다.
ActiveRecord::Base.connection
은 connection pool에서 데이터베이스 connection을 체크아웃하고 요청이나 job이 끝날 때까지 임대 상태를 유지합니다. 이 동작은 사용 가능한 connection보다 더 많은 thread나 fiber를 사용하는 환경에서는 바람직하지 않을 수 있습니다.
이 설정은 ActiveRecord::Base.connection
을 호출하는 코드를 추적하고 제거하여 대신 ActiveRecord::Base.with_connection
을 사용하도록 마이그레이션하는 데 사용될 수 있습니다.
이 값은 :disallowed
, :deprecated
, 또는 true
로 설정할 수 있으며, 각각 에러 발생, deprecation 경고 표시, 또는 아무것도 하지 않음을 의미합니다.
시작 버전 | 기본값 |
---|---|
(original) | true |
3.8.63 config.active_record.database_cli
rails dbconsole
을 실행할 때 데이터베이스 접근에 사용될 CLI 도구를 제어합니다. 기본적으로 데이터베이스의 표준 도구가 사용됩니다(예: PostgreSQL의 경우 psql
, MySQL의 경우 mysql
). 이 옵션은 데이터베이스 시스템별로 도구를 지정하는 hash를 받으며, fallback 옵션이 필요한 경우 배열을 사용할 수 있습니다.
# config/application.rb
config.active_record.database_cli = { postgresql: "pgcli", mysql: %w[ mycli mysql ] }
3.8.64 ActiveRecord::ConnectionAdapters::Mysql2Adapter.emulate_booleans
와 ActiveRecord::ConnectionAdapters::TrilogyAdapter.emulate_booleans
Active Record MySQL adapter가 모든 tinyint(1)
컬럼을 boolean으로 취급할지 여부를 제어합니다. 기본값은 true
입니다.
3.8.65 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.create_unlogged_tables
PostgreSQL에 의해 생성되는 데이터베이스 테이블이 "unlogged"여야 하는지를 제어합니다. 이는 성능을 향상시킬 수 있지만 데이터베이스가 충돌할 경우 데이터 손실의 위험이 있습니다. production 환경에서는 이 기능을 활성화하지 않는 것을 강력히 권장합니다. 모든 환경에서 기본값은 false
입니다.
테스트에서 이를 활성화하려면:
# config/environments/test.rb
ActiveSupport.on_load(:active_record_postgresqladapter) do
self.create_unlogged_tables = true
end
3.8.66 ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.datetime_type
마이그레이션이나 스키마에서 datetime
을 호출할 때 Active Record PostgreSQL adapter가 사용해야 하는 네이티브 타입을 제어합니다. 설정된 NATIVE_DATABASE_TYPES
중 하나에 해당하는 심볼을 가져야 합니다. 기본값은 :timestamp
이며, 이는 마이그레이션에서 t.datetime
이 "timestamp without time zone" 컬럼을 생성한다는 것을 의미합니다.
"timestamp with time zone"을 사용하려면:
# config/application.rb
ActiveSupport.on_load(:active_record_postgresqladapter) do
self.datetime_type = :timestamptz
end
schema.rb를 rebuild하려면 bin/rails db:migrate
를 실행해야 합니다.
3.8.67 ActiveRecord::SchemaDumper.ignore_tables
생성된 schema 파일에 포함하지 않을 테이블 배열을 받습니다.
3.8.68 ActiveRecord::SchemaDumper.fk_ignore_pattern
foreign key의 이름을 db/schema.rb에 dump할지 여부를 결정하는데 사용할 다른 정규식을 설정할 수 있습니다. 기본적으로 fk_rails_
로 시작하는 foreign key 이름은 데이터베이스 schema dump에 내보내지 않습니다. 기본값은 /^fk_rails_[0-9a-f]{10}$/
입니다.
3.8.69 config.active_record.encryption.add_to_filter_parameters
inspect
시 암호화된 속성의 자동 필터링을 활성화합니다.
기본값은 true
입니다.
3.8.70 config.active_record.encryption.hash_digest_class
Active Record Encryption에서 사용하는 digest 알고리즘을 설정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | OpenSSL::Digest::SHA1 |
7.1 | OpenSSL::Digest::SHA256 |
3.8.71 config.active_record.encryption.support_sha1_for_non_deterministic_encryption
SHA-1 digest 클래스를 사용하여 암호화된 기존 데이터의 복호화 지원을 활성화합니다. false
일 경우, config.active_record.encryption.hash_digest_class
에 구성된 digest만 지원합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | true |
7.1 | false |
3.8.72 config.active_record.encryption.compressor
Active Record Encryption에서 사용하는 압축기를 설정합니다. 기본값은 Zlib
입니다.
deflate
와 inflate
에 응답하는 클래스를 설정하여 자신만의 압축기를 사용할 수 있습니다.
3.8.73 config.active_record.protocol_adapters
URL을 사용하여 데이터베이스 연결을 구성할 때, 이 옵션은 protocol에서 기본 database adapter로의 매핑을 제공합니다. 예를 들어, 환경에서 DATABASE_URL=mysql://localhost/database
를 지정하면 Rails는 mysql
을 mysql2
adapter에 매핑하지만, 애플리케이션에서 이러한 매핑을 재정의할 수 있습니다:
config.active_record.protocol_adapters.mysql = "trilogy"
MySQL에 대한 프로토콜 어댑터를 trilogy로 설정합니다.
매핑이 없는 경우, protocol이 adapter 이름으로 사용됩니다.
3.9 Action Controller 설정하기
config.action_controller
는 다음과 같은 설정들을 포함합니다:
3.9.1 config.action_controller.asset_host
assets의 host를 설정합니다. CDN이 애플리케이션 서버 자체가 아닌 assets를 호스팅하는데 사용될 때 유용합니다. Action Mailer에 대해 다른 설정이 있는 경우에만 이것을 사용해야 하며, 그렇지 않으면 config.asset_host
를 사용하세요.
3.9.2 config.action_controller.perform_caching
애플리케이션이 Action Controller 컴포넌트에서 제공하는 캐싱 기능을 수행할지 여부를 설정합니다. 개발 환경에서는 false
로, 프로덕션 환경에서는 true
로 설정됩니다. 지정되지 않은 경우 기본값은 true
입니다.
3.9.3 config.action_controller.default_static_extension
캐시된 페이지에 사용되는 확장자를 설정합니다. 기본값은 .html
입니다.
3.9.4 config.action_controller.include_all_helpers
모든 view helper가 어디서나 사용 가능한지 또는 해당 controller에 범위가 지정되는지를 설정합니다. false
로 설정하면, UsersHelper
메서드는 UsersController
의 일부로 렌더링되는 view에서만 사용할 수 있습니다. true
이면 UsersHelper
메서드를 어디서나 사용할 수 있습니다. 이 옵션이 명시적으로 true
또는 false
로 설정되지 않은 경우의 기본 설정 동작은 모든 view helper가 각 controller에서 사용 가능하다는 것입니다.
3.9.5 config.action_controller.logger
Log4r 또는 기본 Ruby Logger 클래스의 인터페이스를 준수하는 logger를 받아들이며, 이는 Action Controller의 정보를 로깅하는 데 사용됩니다. 로깅을 비활성화하려면 nil
로 설정하세요.
3.9.6 config.action_controller.request_forgery_protection_token
RequestForgery의 토큰 파라미터 이름을 설정합니다. protect_from_forgery
를 호출하면 기본적으로 :authenticity_token
으로 설정됩니다.
3.9.7 config.action_controller.allow_forgery_protection
CSRF 보호를 활성화하거나 비활성화합니다. 기본적으로 테스트 환경에서는 false
이고 다른 모든 환경에서는 true
입니다.
3.9.8 config.action_controller.forgery_protection_origin_check
추가적인 CSRF 방어로 HTTP Origin
헤더를 사이트의 origin과 비교 확인할지 여부를 설정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
5.0 | true |
3.9.9 config.action_controller.per_form_csrf_tokens
CSRF 토큰이 생성된 method/action에 대해서만 유효한지 여부를 설정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
| 시작 버전 | 기본값 |
3.9.10 config.action_controller.default_protect_from_forgery
ActionController::Base
에 forgery protection을 추가할지 여부를 결정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
5.2 | true |
3.9.11 config.action_controller.relative_url_root
Rails에게 하위 디렉토리에 배포한다는 것을 알려주는 데 사용할 수 있습니다. 기본값은 config.relative_url_root
입니다.
3.9.12 config.action_controller.permit_all_parameters
mass assignment를 위한 모든 파라미터를 기본적으로 허용하도록 설정합니다. 기본값은 false
입니다.
3.9.13 config.action_controller.action_on_unpermitted_parameters
명시적으로 허용되지 않은 파라미터가 발견되었을 때의 동작을 제어합니다. 기본값은 test와 development 환경에서는 :log
이며, 그 외에는 false
입니다. 값은 다음과 같을 수 있습니다:
false
: 아무 동작도 하지 않음:log
:unpermitted_parameters.action_controller
토픽에 대해ActiveSupport::Notifications.instrument
이벤트를 발생시키고 DEBUG 레벨로 로깅:raise
:ActionController::UnpermittedParameters
예외를 발생
3.9.14 config.action_controller.always_permitted_parameters
기본적으로 허용되는 파라미터 목록을 설정합니다. 기본값은 ['controller', 'action']
입니다.
3.9.15 config.action_controller.enable_fragment_cache_logging
fragment cache 읽기와 쓰기를 다음과 같은 상세 형식으로 로깅할지 여부를 결정합니다:
fragment 읽기 views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/d0bdf2974e1ef6d31685c3b392ad0b74 (0.6ms)
messages/_message.html.erb 렌더링 완료 1.2 ms [cache hit]
fragment 쓰기 views/v1/2914079/v1/2914079/recordings/70182313-20160225015037000000/3b4e249ac9d168c617e32e84b99218b5 (1.1ms)
recordings/threads/_thread.html.erb 렌더링 완료 1.5 ms [cache miss]
기본적으로 false
로 설정되어 있으며 다음과 같은 결과가 출력됩니다:
메시지/_message.html.erb가 1.2ms에 렌더링됨 [cache hit]
recordings/threads/_thread.html.erb가 1.5ms에 렌더링됨 [cache miss]
3.9.16 config.action_controller.raise_on_missing_callback_actions
컨트롤러에서 콜백의 :only
또는 :except
옵션에 지정된 액션이 없을 때 AbstractController::ActionNotFound
를 발생시킵니다.
버전 시작 | 기본값 |
---|---|
(원본) | false |
7.1 | true (development와 test), false (다른 환경) |
3.9.17 config.action_controller.raise_on_open_redirects
외부 호스트로의 의도하지 않은 리다이렉트("open redirect"라고도 함)로부터 애플리케이션을 보호하기 위해 외부 리다이렉트를 명시적으로 선택해야 하도록 합니다.
이 설정이 true
로 되어 있을 때, 외부 호스트를 가진 URL이 redirect_to에 전달되면 ActionController::Redirecting::UnsafeRedirectError
가 발생합니다. open redirect를 허용해야 하는 경우에는 redirect_to
호출에 allow_other_host: true
를 추가할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 달라집니다:
버전 시작 | 기본값 |
---|---|
(원본) | false |
7.0 | true |
3.9.18 config.action_controller.log_query_tags_around_actions
around_filter
를 통해 query tag를 위한 컨트롤러 컨텍스트가 자동으로 업데이트될지 여부를 결정합니다. 기본값은 true
입니다.
3.9.19 config.action_controller.wrap_parameters_by_default
Rails 7.0 이전에는, 새로운 애플리케이션이 JSON 요청에 대해 ActionController::Base
에서 파라미터 래핑을 활성화하는 wrap_parameters.rb
라는 이름의 initializer와 함께 생성되었습니다.
이 설정값을 true
로 설정하면 initializer와 동일한 동작을 하므로, 파라미터 래핑 동작을 커스터마이즈하지 않으려는 애플리케이션은 initializer를 제거할 수 있습니다.
이 값과 관계없이, 애플리케이션은 이전처럼 initializer나 각 컨트롤러에서 파라미터 래핑 동작을 커스터마이즈할 수 있습니다.
파라미터 래핑에 대한 자세한 내용은 ParamsWrapper
를 참조하세요.
wrapping.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.0 | true |
3.9.20 ActionController::Base.wrap_parameters
ParamsWrapper
를 설정합니다. 이는 최상위 레벨에서 또는 개별 controller에서 호출될 수 있습니다.
3.10 Action Dispatch 설정하기
3.10.1 config.action_dispatch.cookies_serializer
쿠키에 사용할 serializer를 지정합니다. config.active_support.message_serializer
와 동일한 값을 받으며, :json_allow_marshal
의 별칭인 :hybrid
도 추가로 사용할 수 있습니다.
기본값은 config.load_defaults
타겟 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | :marshal |
7.0 | :json |
3.10.2 config.action_dispatch.debug_exception_log_level
요청 중 처리되지 않은 예외를 로깅할 때 ActionDispatch::DebugExceptions
미들웨어가 사용하는 로그 레벨을 설정합니다.
기본값은 config.load_defaults
타겟 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | :fatal |
7.1 | :error |
3.10.3 config.action_dispatch.default_headers
각 응답에서 기본적으로 설정되는 HTTP 헤더들을 포함하는 해시입니다.
기본값은 config.load_defaults
타겟 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) |
|
7.0 |
|
7.1 |
|
3.10.4 config.action_dispatch.default_charset
모든 렌더링에 대한 기본 문자셋을 지정합니다. 기본값은 nil
입니다.
3.10.5 config.action_dispatch.tld_length
애플리케이션의 TLD(최상위 도메인) 길이를 설정합니다. 기본값은 1
입니다.
3.10.6 config.action_dispatch.ignore_accept_header
요청의 accept 헤더를 무시할지 결정하는 데 사용됩니다. 기본값은 false
입니다.
3.10.7 config.action_dispatch.x_sendfile_header
서버별 X-Sendfile 헤더를 지정합니다. 서버에서 가속화된 파일 전송을 위해 유용합니다. 예를 들어 Apache의 경우 'X-Sendfile'로 설정할 수 있습니다.
3.10.8 config.action_dispatch.http_auth_salt
HTTP Auth salt 값을 설정합니다. 기본값은 'http authentication'
입니다.
3.10.9 config.action_dispatch.signed_cookie_salt
서명된 쿠키의 salt 값을 설정합니다. 기본값은 'signed cookie'
입니다.
3.10.10 config.action_dispatch.encrypted_cookie_salt
암호화된 쿠키의 salt 값을 설정합니다. 기본값은 'encrypted cookie'
입니다.
3.10.11 config.action_dispatch.encrypted_signed_cookie_salt
서명된 암호화 쿠키의 salt 값을 설정합니다. 기본값은 'signed encrypted cookie'
입니다.
3.10.12 config.action_dispatch.authenticated_encrypted_cookie_salt
인증된 암호화 쿠키의 salt를 설정합니다. 기본값은 'authenticated encrypted cookie'
입니다.
3.10.13 config.action_dispatch.encrypted_cookie_cipher
암호화된 쿠키에 사용할 cipher를 설정합니다. 기본값은 "aes-256-gcm"
입니다.
3.10.14 config.action_dispatch.signed_cookie_digest
서명된 쿠키에 사용할 digest를 설정합니다. 기본값은 "SHA1"
입니다.
3.10.15 config.action_dispatch.cookies_rotations
암호화되고 서명된 쿠키의 secrets, ciphers, digests를 교체할 수 있게 합니다.
3.10.16 config.action_dispatch.use_authenticated_cookie_encryption
서명되고 암호화된 쿠키가 AES-256-GCM cipher를 사용할지 또는 이전의 AES-256-CBC cipher를 사용할지 제어합니다.
기본값은 config.load_defaults
target 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
5.2 | true |
3.10.17 config.action_dispatch.use_cookies_with_metadata
목적 메타데이터가 포함된 쿠키 작성을 활성화합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
6.0 | true |
3.10.18 config.action_dispatch.perform_deep_munge
파라미터에 대해 deep_munge
메서드를 수행할지 여부를 설정합니다.
자세한 내용은 보안 가이드를 참조하세요. 기본값은 true
입니다.
3.10.19 config.action_dispatch.rescue_responses
예외가 어떤 HTTP 상태에 할당될지를 설정합니다. 해시를 허용하며 예외/상태 쌍을 지정할 수 있습니다.
# 기본값을 존중하기 위해 #[]= 또는 #merge!를 사용하는 것이 좋습니다
config.action_dispatch.rescue_responses["MyAuthenticationError"] = :unauthorized
ActionDispatch::ExceptionWrapper.rescue_responses
를 사용하여 구성을 확인할 수 있습니다. 기본적으로 다음과 같이 정의됩니다:
{
"ActionController::RoutingError" => :not_found, # 라우팅 오류
"AbstractController::ActionNotFound" => :not_found, # 액션을 찾을 수 없음
"ActionController::MethodNotAllowed" => :method_not_allowed, # 허용되지 않은 메서드
"ActionController::UnknownHttpMethod" => :method_not_allowed, # 알 수 없는 HTTP 메서드
"ActionController::NotImplemented" => :not_implemented, # 구현되지 않음
"ActionController::UnknownFormat" => :not_acceptable, # 알 수 없는 형식
"ActionDispatch::Http::MimeNegotiation::InvalidType" => :not_acceptable, # 유효하지 않은 MIME 타입
"ActionController::MissingExactTemplate" => :not_acceptable, # 정확한 템플릿 누락
"ActionController::InvalidAuthenticityToken" => :unprocessable_entity, # 유효하지 않은 인증 토큰
"ActionController::InvalidCrossOriginRequest" => :unprocessable_entity, # 유효하지 않은 교차 출처 요청
"ActionDispatch::Http::Parameters::ParseError" => :bad_request, # 파라미터 파싱 오류
"ActionController::BadRequest" => :bad_request, # 잘못된 요청
"ActionController::ParameterMissing" => :bad_request, # 필수 파라미터 누락
"Rack::QueryParser::ParameterTypeError" => :bad_request, # 파라미터 타입 오류
"Rack::QueryParser::InvalidParameterError" => :bad_request, # 유효하지 않은 파라미터
"ActiveRecord::RecordNotFound" => :not_found, # 레코드를 찾을 수 없음
"ActiveRecord::StaleObjectError" => :conflict, # 낡은 객체 충돌
"ActiveRecord::RecordInvalid" => :unprocessable_entity, # 유효하지 않은 레코드
"ActiveRecord::RecordNotSaved" => :unprocessable_entity # 레코드 저장 실패
}
구성되지 않은 모든 예외는 500 Internal Server Error로 매핑됩니다.
3.10.20 config.action_dispatch.cookies_same_site_protection
쿠키 설정 시 SameSite
속성의 기본값을 구성합니다.
nil
로 설정하면 SameSite
속성이 추가되지 않습니다. 요청에 따라 SameSite
속성 값을 동적으로 구성할 수 있도록 proc을 지정할 수 있습니다. 예시:
config.action_dispatch.cookies_same_site_protection = ->(request) do
:strict unless request.user_agent == "TestAgent"
end
user-agent가 "TestAgent"인 경우를 제외하고 모든 요청에 대해 쿠키 SameSite 보호를 :strict로 설정합니다.
기본값은 config.load_defaults
대상 버전에 따라 달라집니다:
시작 버전 | 기본값 |
---|---|
(원본) | nil |
6.1 | :lax |
3.10.21 config.action_dispatch.ssl_default_redirect_status
ActionDispatch::SSL
middleware에서 HTTP에서 HTTPS로 GET/HEAD가 아닌 요청을 리다이렉트할 때 사용되는 기본 HTTP 상태 코드를 설정합니다.
기본값은 config.load_defaults
대상 버전에 따라 달라집니다:
시작 버전 | 기본값 |
---|---|
(원본) | 307 |
6.1 | 308 |
3.10.22 config.action_dispatch.log_rescued_responses
rescue_responses
에 설정된 처리되지 않은 예외들의 로깅을 활성화합니다. 기본값은 true
입니다.
3.10.23 config.action_dispatch.show_exceptions
config.action_dispatch.show_exceptions
설정은 Action Pack(특히 ActionDispatch::ShowExceptions
middleware)이 요청에 응답하는 동안 발생한 예외를 처리하는 방식을 제어합니다.
값을 :all
로 설정하면 Action Pack이 예외를 rescue하고 해당하는 에러 페이지를 렌더링하도록 설정됩니다. 예를 들어, Action Pack은 ActiveRecord::RecordNotFound
예외를 rescue하고 404 Not found
상태 코드와 함께 public/404.html
의 내용을 렌더링합니다.
값을 :rescuable
로 설정하면 Action Pack이 config.action_dispatch.rescue_responses
에 정의된 예외만 rescue하고 나머지는 모두 발생시키도록 설정됩니다. 예를 들어, Action Pack은 ActiveRecord::RecordNotFound
는 rescue하지만 NoMethodError
는 발생시킵니다.
값을 :none
으로 설정하면 Action Pack이 모든 예외를 발생시키도록 설정됩니다.
:all
- 모든 예외에 대해 에러 페이지 렌더링:rescuable
-config.action_dispatch.rescue_responses
에 선언된 예외에 대해 에러 페이지 렌더링:none
- 모든 예외 발생
시작 버전 | 기본값 |
---|---|
(원본) | true |
7.1 | :all |
3.10.24 config.action_dispatch.strict_freshness
ActionDispatch::ETag
middleware가 응답에 두 헤더가 모두 있을 때 Last-Modified
헤더보다 ETag
헤더를 우선시할지 여부를 설정합니다.
true
로 설정하면, RFC 7232 섹션 6에 명시된 대로 두 헤더가 모두 있을 때 ETag
만 고려됩니다.
false
로 설정된 경우, 두 헤더가 모두 있을 때 두 헤더 모두 검사되며 응답이 신선한 것으로 간주되려면 두 헤더가 모두 일치해야 합니다.
버전 시작 | 기본값 |
---|---|
(원본) | false |
8.0 | true |
3.10.25 config.action_dispatch.always_write_cookie
요청이 안전하지 않은 것으로 표시되거나, SSL을 통해 요청이 이루어지거나, onion 서비스로 요청이 이루어진 경우 요청 끝에 쿠키가 작성됩니다.
true
로 설정하면 이러한 조건이 충족되지 않더라도 쿠키가 작성됩니다.
이는 development
환경에서는 기본값이 true
이고, 다른 모든 환경에서는 false
입니다.
3.10.26 ActionDispatch::Callbacks.before
요청 전에 실행할 코드 블록을 받습니다.
3.10.27 ActionDispatch::Callbacks.after
요청 후에 실행할 코드 블록을 받습니다.
3.11 Action View 구성하기
config.action_view
는 소수의 구성 설정을 포함합니다:
3.11.1 config.action_view.cache_template_loading
템플릿을 각 요청마다 다시 로드할지 여부를 제어합니다. 기본값은 !config.enable_reloading
입니다.
3.11.2 config.action_view.field_error_proc
Active Model에서 발생하는 오류를 표시하기 위한 HTML 생성기를 제공합니다. 이 블록은 Action View 템플릿의 컨텍스트 내에서 평가됩니다. 기본값은 다음과 같습니다:
Proc.new { |html_tag, instance| content_tag :div, html_tag, class: "field_with_errors" }
이 코드는 에러가 있는 필드를 감싸기 위한 div를 생성합니다.
3.11.3 config.action_view.default_form_builder
Rails에게 기본적으로 사용할 form builder를 알려줍니다. 기본값은 ActionView::Helpers::FormBuilder
입니다. form builder 클래스를 초기화 이후에 로드하기를 원한다면(개발 환경에서 매 요청마다 다시 로드되도록), String
으로 전달할 수 있습니다.
3.11.4 config.action_view.logger
Log4r 또는 기본 Ruby Logger 클래스의 인터페이스를 준수하는 logger를 받아들이며, 이는 Action View에서 정보를 로깅하는데 사용됩니다. 로깅을 비활성화하려면 nil
로 설정하세요.
3.11.5 config.action_view.erb_trim_mode
특정 ERB 구문의 trim 여부를 제어합니다. 기본값은 '-'
이며, <%= -%>
또는 <%= =%>
를 사용할 때 후행 공백과 줄바꿈을 trim합니다. 이를 다른 값으로 설정하면 trim 지원이 비활성화됩니다.
3.11.6 config.action_view.frozen_string_literal
ERB 템플릿을 # frozen_string_literal: true
magic comment와 함께 컴파일하여 모든 문자열 리터럴을 frozen으로 만들고 할당을 절약합니다. 모든 view에 대해 활성화하려면 true
로 설정하세요.
3.11.7 config.action_view.embed_authenticity_token_in_remote_forms
remote: true
가 있는 폼에서 authenticity_token
의 기본 동작을 설정할 수 있습니다. 기본적으로 false
로 설정되어 있어, remote 폼에 authenticity_token
이 포함되지 않습니다. 이는 폼을 fragment-caching할 때 유용합니다. Remote 폼은 meta
태그에서 authenticity를 가져오므로, JavaScript를 지원하지 않는 브라우저를 지원하는 경우가 아니라면 embedding은 불필요합니다. 이러한 경우 폼 옵션으로 authenticity_token: true
를 전달하거나 이 설정을 true
로 설정할 수 있습니다.
3.11.8 config.action_view.prefix_partial_path_with_controller_namespace
네임스페이스가 있는 컨트롤러에서 렌더링된 템플릿에서 partial을 하위 디렉토리에서 찾을지 여부를 결정합니다. 예를 들어, Admin::ArticlesController
라는 컨트롤러가 다음 템플릿을 렌더링하는 경우를 고려해보세요:
<%= render @article %>
기본 설정은 true
이며, /admin/articles/_article.erb
부분 템플릿을 사용합니다. 값을 false
로 설정하면 /articles/_article.erb
를 렌더링하며, 이는 ArticlesController
와 같은 네임스페이스가 없는 컨트롤러에서 렌더링하는 것과 동일한 동작입니다.
3.11.9 config.action_view.automatically_disable_submit_tag
submit_tag
가 클릭시 자동으로 비활성화될지 여부를 결정합니다.
기본값은 true
입니다.
3.11.10 config.action_view.debug_missing_translation
누락된 번역 키를 <span>
태그로 감쌀지 여부를 결정합니다. 기본값은 true
입니다.
3.11.11 config.action_view.form_with_generates_remote_forms
form_with
가 remote form을 생성할지 여부를 결정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
5.1 | true |
6.1 | false |
3.11.12 config.action_view.form_with_generates_ids
form_with
가 input에 id를 생성할지 여부를 결정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
5.2 | true |
3.11.13 config.action_view.default_enforce_utf8
오래된 버전의 Internet Explorer에서 UTF-8로 인코딩된 폼을 제출하도록 강제하는 hidden 태그를 생성할지 여부를 결정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | true |
6.0 | false |
3.11.14 config.action_view.image_loading
image_tag
헬퍼로 렌더링되는 <img>
태그의 loading
속성에 대한 기본값을 지정합니다. 예를 들어, "lazy"
로 설정하면 image_tag
로 렌더링되는 <img>
태그에 loading="lazy"
가 포함되어 브라우저가 이미지가 뷰포트 근처에 있을 때까지 로딩을 대기하도록 지시합니다. (이 값은 image_tag
에 loading: "eager"
를 전달하는 등의 방법으로 이미지별로 재정의할 수 있습니다.) 기본값은 nil
입니다.
3.11.15 config.action_view.image_decoding
image_tag
헬퍼에 의해 렌더링되는 <img>
태그의 decoding
속성에 대한 기본값을 지정합니다. 기본값은 nil
입니다.
3.11.16 config.action_view.annotate_rendered_view_with_filenames
렌더링된 뷰에 템플릿 파일 이름을 주석으로 달지 여부를 결정합니다. 기본값은 false
입니다.
3.11.17 config.action_view.preload_links_header
javascript_include_tag
와 stylesheet_link_tag
가 asset을 preload하는 link
헤더를 생성할지 여부를 결정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | nil |
6.1 | true |
3.11.18 config.action_view.button_to_generates_button_tag
false
일 때, button_to
는 컨텐츠가 어떻게 전달되는지에 따라 <form>
내부에 <button>
또는 <input>
을 렌더링합니다(<form>
생략):
<%= button_to "Content", "/" %>
# => <input type="submit" value="Content">
<%= button_to "/" do %>
Content
<% end %>
# => <button type="submit">Content</button>
첫 번째는 직접 전달된 내용으로 input element를 생성합니다. 두 번째는 블록으로 전달된 내용으로 button element를 생성합니다.
이 값을 true
로 설정하면 두 경우 모두 button_to
가 <form>
내부에 <button>
태그를 생성하도록 합니다.
기본값은 config.load_defaults
대상 버전에 따라 달라집니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.0 | true |
3.11.19 config.action_view.apply_stylesheet_media_default
stylesheet_link_tag
가 media
속성이 제공되지 않을 때 기본값으로 screen
을 렌더링할지 여부를 결정합니다.
기본값은 config.load_defaults
대상 버전에 따라 달라집니다:
시작 버전 | 기본값 |
---|---|
(original) | true |
7.0 | false |
3.11.20 config.action_view.prepend_content_exfiltration_prevention
form_tag
와 button_to
헬퍼가 브라우저에서 안전하지만 (기술적으로는 유효하지 않은) HTML을 태그 앞에 추가하여 내용이 앞선 닫히지 않은 태그에 의해 캡처되는 것을 방지할지 여부를 결정합니다. 기본값은 false
입니다.
3.11.21 config.action_view.sanitizer_vendor
ActionView::Helpers::SanitizeHelper.sanitizer_vendor
를 설정하여 Action View에서 사용되는 HTML sanitizer 세트를 구성합니다. 기본값은 config.load_defaults
대상 버전에 따라 달라집니다:
시작 버전 | 기본값 | 마크업 파싱 방식 |
---|---|---|
(original) | Rails::HTML4::Sanitizer |
HTML4 |
7.1 | Rails::HTML5::Sanitizer (참고 참조) |
HTML5 |
참고: Rails::HTML5::Sanitizer
는 JRuby에서 지원되지 않으므로, JRuby 플랫폼에서는 Rails가 Rails::HTML4::Sanitizer
로 대체됩니다.
3.12 Action Mailbox 구성하기
config.action_mailbox
는 다음과 같은 구성 옵션을 제공합니다:
3.12.1 config.action_mailbox.logger
Action Mailbox에서 사용하는 logger를 포함합니다. Log4r나 기본 Ruby Logger 클래스의 인터페이스를 따르는 logger를 허용합니다. 기본값은 Rails.logger
입니다.
config.action_mailbox.logger = ActiveSupport::Logger.new(STDOUT)
3.12.2 config.action_mailbox.incinerate_after
ActionMailbox::InboundEmail
레코드가 처리된 후 얼마 뒤에 삭제될지를 나타내는 ActiveSupport::Duration
값을 지정합니다. 기본값은 30.days
입니다.
# 처리 후 14일이 지난 수신 이메일들을 삭제합니다.
config.action_mailbox.incinerate_after = 14.days
3.12.3 config.action_mailbox.queues.incineration
소각 작업에 사용할 Active Job queue를 나타내는 심볼을 받습니다. 이 옵션이 nil
인 경우, 소각 작업은 기본 Active Job queue로 전송됩니다 (config.active_job.default_queue_name
참조).
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(원본) | :action_mailbox_incineration |
6.1 | nil |
3.12.4 config.action_mailbox.queues.routing
라우팅 작업에 사용할 Active Job queue를 나타내는 심볼을 받습니다. 이 옵션이 nil
인 경우, 라우팅 작업은 기본 Active Job queue로 전송됩니다 (config.active_job.default_queue_name
참조).
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(원본) | :action_mailbox_routing |
6.1 | nil |
3.12.5 config.action_mailbox.storage_service
이메일 업로드에 사용할 Active Storage 서비스를 나타내는 심볼을 받습니다. 이 옵션이 nil
인 경우, 이메일은 기본 Active Storage 서비스에 업로드됩니다 (config.active_storage.service
참조).
3.13 Action Mailer 설정하기
config.action_mailer
에서 사용할 수 있는 여러 설정들이 있습니다:
3.13.1 config.action_mailer.asset_host
asset들의 host를 설정합니다. CDN이 애플리케이션 서버 자체가 아닌 asset 호스팅에 사용될 때 유용합니다. Action Controller에 대해 다른 설정이 있는 경우에만 이것을 사용해야 하며, 그렇지 않으면 config.asset_host
를 사용하세요.
3.13.2 config.action_mailer.logger
Log4r 인터페이스나 기본 Ruby Logger 클래스를 준수하는 logger를 받아들이며, 이는 Action Mailer의 정보를 로깅하는데 사용됩니다. 로깅을 비활성화하려면 nil
로 설정하세요.
3.13.3 config.action_mailer.smtp_settings
:smtp
전송 방법에 대한 상세 설정을 허용합니다. 다음 옵션들을 포함할 수 있는 hash를 받습니다:
:address
- 원격 메일 서버 사용을 허용합니다. 기본값인 "localhost" 설정에서 변경하면 됩니다.:port
- 메일 서버가 25번 포트에서 실행되지 않는 경우 변경할 수 있습니다.:domain
- HELO 도메인을 지정해야 하는 경우 여기서 설정할 수 있습니다.:user_name
- 메일 서버가 인증을 요구하는 경우 이 설정에서 사용자 이름을 설정합니다.:password
- 메일 서버가 인증을 요구하는 경우 이 설정에서 비밀번호를 설정합니다.:authentication
- 메일 서버가 인증을 요구하는 경우 여기서 인증 유형을 지정해야 합니다. 이는:plain
,:login
,:cram_md5
중 하나인 심볼입니다.:enable_starttls
- SMTP 서버에 연결할 때 STARTTLS를 사용하고 지원되지 않으면 실패합니다. 기본값은false
입니다.:enable_starttls_auto
- SMTP 서버에서 STARTTLS가 활성화되어 있는지 감지하고 사용하기 시작합니다. 기본값은true
입니다.:openssl_verify_mode
- TLS 사용 시 OpenSSL이 인증서를 확인하는 방법을 설정할 수 있습니다. 자체 서명 및/또는 와일드카드 인증서를 검증해야 할 때 유용합니다. OpenSSL verify 상수인:none
또는:peer
-- 또는 직접OpenSSL::SSL::VERIFY_NONE
또는OpenSSL::SSL::VERIFY_PEER
를 각각 사용할 수 있습니다.:ssl/:tls
- SMTP/TLS를 사용하는 SMTP 연결을 활성화합니다(SMTPS: 직접 TLS 연결을 통한 SMTP).:open_timeout
- 연결을 시도하는 동안 대기할 초 수입니다.:read_timeout
- read(2) 호출의 타임아웃까지 대기할 초 수입니다.
추가로, Mail::SMTP
가 지원하는 모든 설정 옵션을 전달할 수 있습니다.
3.13.4 config.action_mailer.smtp_timeout
버전 2.8.0 이전에는 mail
gem이 SMTP 요청에 대한 기본 타임아웃을 설정하지 않았습니다. 이 설정을 통해 애플리케이션에서 mail
gem의 :open_timeout
과 :read_timeout
에 대한 기본값을 설정할 수 있어서 요청이 무기한 멈추는 것을 방지할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(원본) | nil |
7.0 | 5 |
3.13.5 config.action_mailer.sendmail_settings
:sendmail
전송 방법에 대한 상세 설정을 허용합니다. 다음 옵션들을 포함할 수 있는 hash를 받습니다:
:location
- sendmail 실행 파일의 위치입니다. 기본값은/usr/sbin/sendmail
입니다.:arguments
- 명령줄 인수입니다. 기본값은%w[ -i ]
입니다.
3.13.6 config.action_mailer.file_settings
:file
delivery method를 설정합니다. 다음과 같은 옵션들을 포함하는 해시를 받습니다:
:location
- 파일이 저장되는 위치입니다. 기본값은"#{Rails.root}/tmp/mails"
입니다.:extension
- 파일 확장자입니다. 기본값은 빈 문자열입니다.
3.13.7 config.action_mailer.raise_delivery_errors
이메일 전송이 완료되지 않을 때 오류를 발생시킬지 여부를 지정합니다. 기본값은 true
입니다.
3.13.8 config.action_mailer.delivery_method
delivery method를 정의하며 기본값은 :smtp
입니다. 자세한 내용은 Action Mailer 가이드의 설정 섹션을 참조하세요.
3.13.9 config.action_mailer.perform_deliveries
메일이 실제로 전송될지 여부를 지정하며 기본값은 true
입니다. 테스트 시에는 false
로 설정하는 것이 편리할 수 있습니다.
3.13.10 config.action_mailer.default_options
Action Mailer의 기본값을 설정합니다. 모든 mailer에 대해 from
이나 reply_to
와 같은 옵션을 설정하는 데 사용됩니다. 기본값은 다음과 같습니다:
{
mime_version: "1.0",
charset: "UTF-8",
content_type: "text/plain",
parts_order: ["text/plain", "text/enriched", "text/html"]
}
추가 옵션을 설정하기 위해 hash를 할당하세요:
config.action_mailer.default_options = {
from: "noreply@example.com"
}
3.13.11 config.action_mailer.observers
메일이 발송될 때 알림을 받을 observer들을 등록합니다.
config.action_mailer.observers = ["MailObserver"]
Observer를 사용하여 메일이 전송될 때 실행되는 hook을 등록할 수 있습니다. observer는 delivered_email(message)
라는 단일 메서드를 구현해야 하며, 이는 메일이 성공적으로 전송된 후 호출됩니다.
3.13.12 config.action_mailer.interceptors
메일이 발송되기 전에 호출될 interceptor들을 등록합니다.
config.action_mailer.interceptors = ["MailInterceptor"]
3.13.13 config.action_mailer.preview_interceptors
메일이 미리보기되기 전에 호출될 interceptor를 등록합니다.
config.action_mailer.preview_interceptors = ["MyPreviewMailInterceptor"]
3.13.14 config.action_mailer.preview_paths
mailer preview들의 위치를 지정합니다. 이 configuration 옵션에 경로를 추가하면 해당 경로들이 mailer preview를 검색하는데 사용됩니다.
config.action_mailer.preview_paths << "#{Rails.root}/lib/mailer_previews"
action_mailer의 preview를 검색할 경로를 추가합니다.
3.13.15 config.action_mailer.show_previews
mailer preview를 활성화하거나 비활성화합니다. 기본적으로 development 환경에서는 true
로 설정되어 있습니다.
config.action_mailer.show_previews = false
Action Mailer 미리보기 기능을 비활성화합니다. 이 설정의 기본값은 development 환경에서는 true
이고 그 외의 환경에서는 false
입니다.
3.13.16 config.action_mailer.perform_caching
mailer 템플릿이 fragment caching을 수행할지 여부를 지정합니다. 지정되지 않은 경우 기본값은 true
입니다.
3.13.17 config.action_mailer.deliver_later_queue_name
기본 delivery job에 사용할 Active Job queue를 지정합니다(
config.action_mailer.delivery_job
참조). 이 옵션이 nil
로 설정되면, delivery
job은 기본 Active Job queue로 전송됩니다(
config.active_job.default_queue_name
참조).
Mailer 클래스는 이를 재정의하여 다른 queue를 사용할 수 있습니다. 이는 기본 delivery job을 사용할 때만 적용됩니다. mailer가 custom job을 사용하는 경우에는 해당 job의 queue가 사용됩니다.
Active Job adapter가 지정된 queue를 처리하도록 구성되어 있는지 확인하세요. 그렇지 않으면 delivery job이 자동으로 무시될 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | :mailers |
6.1 | nil |
3.13.18 config.action_mailer.delivery_job
메일의 delivery job을 지정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | ActionMailer::MailDeliveryJob |
6.0 | "ActionMailer::MailDeliveryJob" |
3.14 Active Support 구성하기
Active Support에는 몇 가지 구성 옵션이 있습니다:
3.14.1 config.active_support.bare
Rails 부팅 시 active_support/all
의 로딩을 활성화하거나 비활성화합니다. 기본값은 nil
이며, 이는 active_support/all
이 로드된다는 것을 의미합니다.
3.14.2 config.active_support.test_order
테스트 케이스가 실행되는 순서를 설정합니다. 가능한 값은 :random
과 :sorted
입니다. 기본값은 :random
입니다.
3.14.3 config.active_support.escape_html_entities_in_json
JSON 직렬화에서 HTML 엔티티의 이스케이프를 활성화하거나 비활성화합니다. 기본값은 true
입니다.
3.14.4 config.active_support.use_standard_json_time_format
날짜를 ISO 8601 형식으로 직렬화하는 것을 활성화하거나 비활성화합니다. 기본값은 true
입니다.
3.14.5 config.active_support.time_precision
JSON으로 인코딩된 시간 값의 정밀도를 설정합니다. 기본값은 3
입니다.
3.14.6 config.active_support.hash_digest_class
ETag 헤더와 같은 비민감한 다이제스트를 생성하는데 사용할 다이제스트 클래스를 구성할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | OpenSSL::Digest::MD5 |
5.2 | OpenSSL::Digest::SHA1 |
7.0 | OpenSSL::Digest::SHA256 |
3.14.7 config.active_support.key_generator_hash_digest_class
암호화된 쿠키와 같이 구성된 secret base로부터 시크릿을 도출하는데 사용할 다이제스트 클래스를 구성할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | OpenSSL::Digest::SHA1 |
7.0 | OpenSSL::Digest::SHA256 |
3.14.8 config.active_support.use_authenticated_message_encryption
메시지 암호화를 위한 기본 암호로 AES-256-CBC 대신 AES-256-GCM 인증된 암호화를 사용할지 여부를 지정합니다.
기본값은 config.load_defaults
타겟 버전에 따라 달라집니다:
버전 시작 | 기본값 |
---|---|
(original) | false |
5.2 | true |
3.14.9 config.active_support.message_serializer
ActiveSupport::MessageEncryptor
와 ActiveSupport::MessageVerifier
인스턴스에서 사용되는 기본 serializer를 지정합니다. serializer 간의 마이그레이션을 쉽게 하기 위해, 제공된 serializer들은 여러 deserialization 포맷을 지원하는 fallback 메커니즘을 포함합니다:
Serializer | Serialize와 deserialize | Fallback deserialize |
---|---|---|
:marshal |
Marshal |
ActiveSupport::JSON , ActiveSupport::MessagePack |
:json |
ActiveSupport::JSON |
ActiveSupport::MessagePack |
:json_allow_marshal |
ActiveSupport::JSON |
ActiveSupport::MessagePack , Marshal |
:message_pack |
ActiveSupport::MessagePack |
ActiveSupport::JSON |
:message_pack_allow_marshal |
ActiveSupport::MessagePack |
ActiveSupport::JSON , Marshal |
message signing secret이 유출된 경우 Marshal
은 deserialization 공격의 잠재적 벡터가 될 수 있습니다. 가능하다면 Marshal
을 지원하지 않는 serializer를 선택하세요.
:message_pack
과 :message_pack_allow_marshal
serializer는 Symbol
과 같이 JSON에서 지원하지 않는 일부 Ruby 타입의 roundtrip을 지원합니다. 또한 향상된 성능과 더 작은 payload 크기를 제공할 수 있습니다. 하지만 msgpack
gem이 필요합니다.
위의 각 serializer는 대체 deserialization 포맷으로 fallback할 때 message_serializer_fallback.active_support
이벤트 알림을 발생시켜, 이러한 fallback이 얼마나 자주 발생하는지 추적할 수 있게 합니다.
또는 dump
와 load
메서드에 응답하는 모든 serializer 객체를 지정할 수 있습니다. 예를 들어:
config.active_support.message_serializer = YAML
message_serializer는 message를 직렬화하고 역직렬화하는 데 사용되는 serializer를 구성합니다. serializer는 YAML이나 JSON을 값으로 사용할 수 있습니다.
기본 값은 config.load_defaults
타겟 버전에 따라 다릅니다:
시작 버전 | 기본 값 |
---|---|
(original) | :marshal |
7.1 | :json_allow_marshal |
3.14.10 config.active_support.use_message_serializer_for_metadata
true
일 때, 메시지 데이터와 메타데이터를 함께 직렬화하는 성능 최적화를 활성화합니다. 이는 메시지 형식을 변경하므로, 이 방식으로 직렬화된 메시지는 이전 버전(< 7.1)의 Rails에서 읽을 수 없습니다. 하지만 이 최적화 활성화 여부와 관계없이 이전 형식의 메시지는 여전히 읽을 수 있습니다.
기본 값은 config.load_defaults
타겟 버전에 따라 다릅니다:
시작 버전 | 기본 값 |
---|---|
(original) | false |
7.1 | true |
3.14.11 config.active_support.cache_format_version
캐시에 사용할 직렬화 형식을 지정합니다. 가능한 값은 7.0
과 7.1
입니다.
7.0
은 캐시 항목을 더 효율적으로 직렬화합니다.
7.1
은 효율성을 더욱 향상시키고, 만료되거나 버전이 일치하지 않는 캐시 항목을 값을 역직렬화하지 않고도 감지할 수 있게 합니다. 또한 view 프래그먼트와 같은 단순 문자열 값에 대한 최적화도 포함하고 있습니다.
모든 형식은 이전 버전과 이후 버전 모두와 호환되며, 이는 한 형식으로 작성된 캐시 항목을 다른 형식을 사용할 때도 읽을 수 있다는 것을 의미합니다. 이러한 동작으로 전체 캐시를 무효화하지 않고도 형식 간 마이그레이션이 쉽습니다.
기본 값은 config.load_defaults
타겟 버전에 따라 다릅니다:
시작 버전 | 기본 값 |
---|---|
7.0 | 7.0 |
7.1 | 7.1 |
3.14.12 config.active_support.deprecation
deprecation warning들의 동작을 설정합니다. 사용 가능한 옵션에 대한 설명은 Deprecation::Behavior
를 참고하세요.
기본 생성된 config/environments
파일에서, development 환경에서는 :log
로, test 환경에서는 :stderr
로 설정되며, production 환경에서는 config.active_support.report_deprecations
를 위해 생략됩니다.
3.14.13 config.active_support.disallowed_deprecation
허용되지 않은 deprecation warning의 동작을 설정합니다. 사용 가능한 옵션에 대한 설명은 Deprecation::Behavior
를 참고하세요.
이 옵션은 development와 test 환경을 위한 것입니다. Production 환경에서는 config.active_support.report_deprecations
를 사용하세요.
3.14.14 config.active_support.disallowed_deprecation_warnings
Application이 허용하지 않는 것으로 간주하는 deprecation warning을 설정합니다. 이를 통해 예를 들어 특정 deprecation을 hard failure로 처리할 수 있습니다.
3.14.15 config.active_support.report_deprecations
false
로 설정하면 application의 deprecators에서 허용되지 않은 deprecation을 포함한 모든 deprecation warning을 비활성화합니다. 이는 Rails와 deprecator를 deprecators 컬렉션에 추가할 수 있는 다른 gem의 모든 deprecation을 포함하지만, ActiveSupport::Deprecation에서 발생하는 모든 deprecation warning을 방지하지는 않을 수 있습니다.
기본 생성된 config/environments
파일에서, production 환경에서는 false
로 설정됩니다.
3.14.16 config.active_support.isolation_level
Rails 내부 상태의 대부분의 지역성을 설정합니다. fiber 기반 서버나 job processor(예: falcon
)를 사용하는 경우 :fiber
로 설정해야 합니다. 그렇지 않으면 :thread
지역성을 사용하는 것이 가장 좋습니다. 기본값은 :thread
입니다.
3.14.17 config.active_support.executor_around_test_case
테스트 케이스 주변에서 Rails.application.executor.wrap
을 호출하도록 테스트 suite를 구성합니다.
이렇게 하면 테스트 케이스가 실제 요청이나 job과 더 유사하게 동작하게 됩니다.
Active Record query cache와 비동기 쿼리와 같이 테스트에서 일반적으로 비활성화된 여러 기능이 활성화됩니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.0 | true |
3.14.18 config.active_support.to_time_preserves_timezone
to_time
메서드가 수신자의 UTC offset을 보존할지 timezone을 보존할지를 지정합니다. :zone
으로 설정하면 to_time
메서드는 수신자의 timezone을 사용합니다. :offset
으로 설정하면 to_time
메서드는 UTC offset을 사용합니다. false
로 설정하면 to_time
메서드는 대신 로컬 시스템의 UTC offset으로 변환합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
5.0 | :offset |
8.0 | :zone |
3.14.19 ActiveSupport::Logger.silencer
블록 내에서 로깅을 무음 처리하는 기능을 비활성화하려면 false
로 설정합니다. 기본값은 true
입니다.
3.14.20 ActiveSupport::Cache::Store.logger
캐시 저장소 작업 내에서 사용할 logger를 지정합니다.
3.14.21 ActiveSupport.utc_to_local_returns_utc_offset_times
ActiveSupport::TimeZone.utc_to_local
이 해당 offset을 포함하는 UTC 시간 대신 UTC offset이 있는 시간을 반환하도록 구성합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
6.1 | true |
3.14.22 config.active_support.raise_on_invalid_cache_expiration_time
Rails.cache
fetch
또는 write
에 잘못된 expires_at
또는 expires_in
시간이 주어졌을 때 ArgumentError
를 발생시킬지 지정합니다.
옵션은 true
와 false
입니다. false
인 경우 예외는 handled
로 보고되고 대신 로그로 기록됩니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.1 | true |
3.15 Active Job 설정하기
config.active_job
는 다음과 같은 설정 옵션을 제공합니다:
3.15.1 config.active_job.queue_adapter
queuing backend에 대한 adapter를 설정합니다. 기본 adapter는 :async
입니다. 최신 내장 adapter 목록은 ActiveJob::QueueAdapters API 문서를 참조하세요.
# adapter의 gem이 Gemfile에 있는지 확인하고
# adapter의 구체적인 설치 및
# 배포 지침을 따르세요.
config.active_job.queue_adapter = :sidekiq
3.15.2 config.active_job.default_queue_name
기본 queue 이름을 변경하는데 사용할 수 있습니다. 기본값은 "default"
입니다.
config.active_job.default_queue_name = :medium_priority
기본 queue 이름을 설정합니다.
3.15.3 config.active_job.queue_name_prefix
모든 job의 queue 이름에 선택적으로 빈 값이 아닌 prefix를 설정할 수 있게 해줍니다. 기본값은 빈 값이며 사용되지 않습니다.
다음 설정은 production 환경에서 실행될 때 주어진 job을 production_high_priority
queue에 배치합니다:
config.active_job.queue_name_prefix = Rails.env
queue 이름에 환경 이름을 접두사로 추가합니다.
class GuestsCleanupJob < ActiveJob::Base
queue_as :high_priority
#....
end
3.15.4 config.active_job.queue_name_delimiter
기본값은 '_'
입니다. queue_name_prefix
가 설정되어 있다면, queue_name_delimiter
는 prefix와 prefix가 없는 queue 이름을 연결합니다.
다음 설정은 제공된 job을 video_server.low_priority
queue에 넣을 것입니다:
# delimiter를 사용하기 위해서는 prefix가 반드시 설정되어야 합니다
config.active_job.queue_name_prefix = "video_server"
config.active_job.queue_name_delimiter = "."
class EncoderJob < ActiveJob::Base
queue_as :low_priority
#....
end
3.15.5 config.active_job.logger
Log4r이나 기본 Ruby Logger 클래스의 인터페이스를 준수하는 logger를 허용하며, 이는 Active Job에서 정보를 로깅하는 데 사용됩니다. Active Job 클래스나 Active Job 인스턴스에서 logger
를 호출하여 이 logger를 가져올 수 있습니다. 로깅을 비활성화하려면 nil
로 설정하세요.
3.15.6 config.active_job.custom_serializers
커스텀 argument serializer를 설정할 수 있습니다. 기본값은 []
입니다.
3.15.7 config.active_job.log_arguments
job의 인자들을 로깅할지 여부를 제어합니다. 기본값은 true
입니다.
3.15.8 config.active_job.verbose_enqueue_logs
background job을 enqueue하는 메서드의 소스 위치가 관련 enqueue 로그 라인 아래에 기록되어야 하는지 지정합니다. 기본적으로 development 환경에서는 true
이고 다른 모든 환경에서는 false
입니다.
3.15.9 config.active_job.retry_jitter
실패한 job을 재시도할 때 계산되는 지연 시간에 적용되는 "jitter"(무작위 변동)의 양을 제어합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | 0.0 |
6.1 | 0.15 |
3.15.10 config.active_job.log_query_tags_around_perform
query tag를 위한 job 컨텍스트가 around_perform
을 통해 자동으로 업데이트될지 여부를 결정합니다. 기본값은 true
입니다.
3.16 Action Cable 구성하기
3.16.1 config.action_cable.url
Action Cable 서버를 호스팅하는 URL을 문자열로 지정합니다. 이 옵션은 메인 애플리케이션과 분리된 Action Cable 서버를 실행할 때 사용합니다.
3.16.2 config.action_cable.mount_path
메인 서버 프로세스의 일부로 Action Cable을 마운트할 경로를 문자열로 지정합니다. 기본값은 /cable
입니다. 일반 Rails 서버의 일부로 Action Cable을 마운트하지 않으려면 이 값을 nil로 설정할 수 있습니다.
더 자세한 구성 옵션은 Action Cable 개요에서 확인할 수 있습니다.
3.16.3 config.action_cable.precompile_assets
Action Cable 애셋을 asset pipeline 사전 컴파일에 포함할지 여부를 결정합니다. Sprockets를 사용하지 않는 경우에는 영향을 미치지 않습니다. 기본값은 true
입니다.
3.16.4 config.action_cable.allow_same_origin_as_host
cable 서버 자체와 일치하는 origin을 허용할지 여부를 결정합니다.
기본값은 true
입니다.
same-origin 요청에 대한 자동 접근을 비활성화하고 구성된 origins만 엄격하게 허용하려면 false로 설정하세요.
3.16.5 config.action_cable.allowed_request_origins
cable 서버가 수락할 요청 origins를 결정합니다.
development
환경에서의 기본값은 /https?:\/\/localhost:\d+/
입니다.
3.17 Active Storage 구성하기
config.active_storage
는 다음과 같은 구성 옵션을 제공합니다:
3.17.1 config.active_storage.variant_processor
:mini_magick
또는 :vips
심볼을 허용하며, variant 변환과 blob 분석을 MiniMagick과 ruby-vips 중 어느 것으로 수행할지 지정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | :mini_magick |
7.0 | :vips |
3.17.2 config.active_storage.analyzers
Active Storage blob에 사용 가능한 analyzer 클래스들의 배열을 허용합니다. 기본적으로 다음과 같이 정의됩니다:
config.active_storage.analyzers = [ActiveStorage::Analyzer::ImageAnalyzer::Vips, ActiveStorage::Analyzer::ImageAnalyzer::ImageMagick, ActiveStorage::Analyzer::VideoAnalyzer, ActiveStorage::Analyzer::AudioAnalyzer]
이미지 analyzer들은 이미지 blob의 너비와 높이를 추출할 수 있습니다. video analyzer는 video blob의 너비, 높이, 지속시간, 각도, 화면비, 비디오/오디오 채널의 존재 여부를 추출할 수 있습니다. audio analyzer는 오디오 blob의 지속시간과 비트레이트를 추출할 수 있습니다.
3.17.3 config.active_storage.previewers
Active Storage blob에서 사용 가능한 이미지 previewer 클래스들의 배열을 허용합니다. 기본값으로 다음과 같이 정의되어 있습니다:
config.active_storage.previewers = [ActiveStorage::Previewer::PopplerPDFPreviewer, ActiveStorage::Previewer::MuPDFPreviewer, ActiveStorage::Previewer::VideoPreviewer]
ActiveStorage에서 사용할 previewer들을 각각 순서대로 지정합니다.
PopplerPDFPreviewer
와 MuPDFPreviewer
는 PDF blob의 첫 페이지로부터 썸네일을 생성할 수 있고, VideoPreviewer
는 비디오 blob의 관련 프레임으로부터 썸네일을 생성할 수 있습니다.
3.17.4 config.active_storage.paths
previewer/analyzer 명령어의 위치를 나타내는 옵션 해시를 받습니다. 기본값은 {}
이며, 이는 명령어들이 기본 경로에서 검색될 것임을 의미합니다. 다음과 같은 옵션들을 포함할 수 있습니다:
:ffprobe
- ffprobe 실행 파일의 위치:mutool
- mutool 실행 파일의 위치:ffmpeg
- ffmpeg 실행 파일의 위치
config.active_storage.paths[:ffprobe] = "/usr/local/bin/ffprobe"
3.17.5 config.active_storage.variable_content_types
Active Storage가 variant processor를 통해 변환할 수 있는 content type을 나타내는 문자열 배열을 받습니다. 기본값은 다음과 같이 정의되어 있습니다:
config.active_storage.variable_content_types = %w(image/png image/gif image/jpeg image/tiff image/bmp image/vnd.adobe.photoshop image/vnd.microsoft.icon image/webp image/avif image/heic image/heif)
3.17.6 config.active_storage.web_image_content_types
fallback PNG 형식으로 변환하지 않고도 variants를 처리할 수 있는 웹 이미지 content type들의 문자열 배열을 받습니다. 예를 들어, 애플리케이션에서 AVIF
variants를 사용하고 싶다면 이 배열에 image/avif
를 추가할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | %w(image/png image/jpeg image/gif) |
7.2 | %w(image/png image/jpeg image/gif image/webp) |
3.17.7 config.active_storage.content_types_to_serve_as_binary
Active Storage가 inline이 아닌 attachment로 항상 제공할 content type들을 나타내는 문자열 배열을 받습니다. 기본적으로 다음과 같이 정의됩니다:
config.active_storage.content_types_to_serve_as_binary = %w(text/html image/svg+xml application/postscript application/x-shockwave-flash text/xml application/xml application/xhtml+xml application/mathml+xml text/cache-manifest)
이진 파일로 처리될 content type들의 목록을 지정합니다. 기본적으로 text/html, image/svg+xml, application/postscript, application/x-shockwave-flash, text/xml, application/xml, application/xhtml+xml, application/mathml+xml 그리고 text/cache-manifest가 포함됩니다.
3.17.8 config.active_storage.content_types_allowed_inline
문자열 배열을 받아서 Active Storage가 inline으로 제공할 수 있는 content type을 지정합니다. 기본값은 다음과 같습니다:
config.active_storage.content_types_allowed_inline = %w(image/webp image/avif image/png image/gif image/jpeg image/tiff image/vnd.adobe.photoshop image/vnd.microsoft.icon application/pdf)
인라인으로 표시가 허용된 content type 목록입니다.
3.17.9 config.active_storage.queues.analysis
분석 작업에 사용할 Active Job queue를 나타내는 symbol을 받습니다. 이 옵션이 nil
이면 분석 작업은 기본 Active Job queue로 전송됩니다 (참조: config.active_job.default_queue_name
).
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
6.0 | :active_storage_analysis |
6.1 | nil |
3.17.10 config.active_storage.queues.mirror
직접 업로드 미러링 작업에 사용할 Active Job queue를 나타내는 symbol을 받습니다. 이 옵션이 nil
이면 미러링 작업은 기본 Active Job queue로 전송됩니다 (참조: config.active_job.default_queue_name
). 기본값은 nil
입니다.
3.17.11 config.active_storage.queues.preview_image
이미지 미리보기 전처리에 사용할 Active Job queue를 나타내는 symbol을 받습니다. 이 옵션이 nil
이면 작업은 기본 Active Job queue로 전송됩니다 (참조: config.active_job.default_queue_name
). 기본값은 nil
입니다.
3.17.12 config.active_storage.queues.purge
제거 작업에 사용할 Active Job queue를 나타내는 symbol을 받습니다. 이 옵션이 nil
이면 제거 작업은 기본 Active Job queue로 전송됩니다 (참조: config.active_job.default_queue_name
).
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
6.0 | :active_storage_purge |
6.1 | nil |
3.17.13 config.active_storage.queues.transform
variant 전처리에 사용할 Active Job queue를 나타내는 symbol을 받습니다. 이 옵션이 nil
이면 작업은 기본 Active Job queue로 전송됩니다 (참조: config.active_job.default_queue_name
). 기본값은 nil
입니다.
3.17.14 config.active_storage.logger
Active Storage에서 사용할 logger를 설정하는 데 사용할 수 있습니다. Log4r 또는 기본 Ruby Logger 클래스의 인터페이스를 준수하는 logger를 받습니다.
config.active_storage.logger = ActiveSupport::Logger.new(STDOUT)
3.17.15 config.active_storage.service_urls_expire_in
다음에 의해 생성된 URL의 기본 만료 시간을 결정합니다:
ActiveStorage::Blob#url
ActiveStorage::Blob#service_url_for_direct_upload
ActiveStorage::Preview#url
ActiveStorage::Variant#url
기본값은 5분입니다.
3.17.16 config.active_storage.urls_expire_in
Active Storage에 의해 생성된 Rails 애플리케이션의 URL의 기본 만료 시간을 결정합니다. 기본값은 nil입니다.
3.17.17 config.active_storage.touch_attachment_records
업데이트될 때 ActiveStorage::Attachments가 해당하는 레코드를 touch하도록 지시합니다. 기본값은 true입니다.
3.17.18 config.active_storage.routes_prefix
Active Storage가 제공하는 라우트의 prefix를 설정하는 데 사용할 수 있습니다. 생성된 라우트 앞에 추가될 문자열을 받습니다.
config.active_storage.routes_prefix = "/files"
Active Storage URL의 prefix를 "/files"로 설정하여 /rails/active_storage/blobs/:signed_id/*filename
이 /files/blobs/:signed_id/*filename
이 되도록 합니다.
기본값은 /rails/active_storage
입니다.
3.17.19 config.active_storage.track_variants
데이터베이스에 variants를 기록할지 여부를 결정합니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
6.1 | true |
3.17.20 config.active_storage.draw_routes
Active Storage 라우트 생성을 토글하는 데 사용할 수 있습니다. 기본값은 true
입니다.
3.17.21 config.active_storage.resolve_model_to_route
Active Storage 파일이 전달되는 방식을 전역적으로 변경하는 데 사용할 수 있습니다.
허용되는 값:
:rails_storage_redirect
: 서명된 단기 서비스 URL로 리다이렉트:rails_storage_proxy
: 파일을 다운로드하여 프록시
기본값은 :rails_storage_redirect
입니다.
3.17.22 config.active_storage.video_preview_arguments
ffmpeg가 비디오 미리보기 이미지를 생성하는 방식을 변경하는 데 사용할 수 있습니다.
기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 |
---|---|
(original) | "-y -vframes 1 -f image2" |
7.0 | "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015)" 1 + ",loop=loop=-1:size=2,trim=start_frame=1'" 2+ " -frames:v 1 -f image2"
|
3.17.23 config.active_storage.multiple_file_field_include_hidden
Rails 7.1 이상에서는 Active Storage has_many_attached
관계가 현재 컬렉션에 추가하는 대신 대체하는 것을 기본값으로 합니다. 따라서 빈 컬렉션 제출을 지원하기 위해 multiple_file_field_include_hidden
이 true
일 때, file_field
헬퍼는 checkbox
헬퍼가 렌더링하는 보조 hidden 필드와 유사한 보조 hidden 필드를 렌더링합니다.
기본값은 config.load_defaults
target 버전에 따라 달라집니다:
시작 버전 | 기본값 |
---|---|
(original) | false |
7.0 | true |
3.17.24 config.active_storage.precompile_assets
Active Storage 에셋들을 에셋 파이프라인 프리컴파일에 추가할지 여부를 결정합니다. Sprockets가 사용되지 않는 경우에는 아무런 효과가 없습니다. 기본값은 true
입니다.
3.18 Action Text 구성하기
3.18.1 config.action_text.attachment_tag_name
첨부 파일을 감싸는 HTML 태그로 사용될 문자열을 받습니다. 기본값은 "action-text-attachment"
입니다.
3.18.2 config.action_text.sanitizer_vendor
vendor의 .safe_list_sanitizer
메서드에서 반환된 클래스의 인스턴스로 ActionText::ContentHelper.sanitizer
를 설정하여 Action Text에서 사용하는 HTML sanitizer를 구성합니다. 기본값은 config.load_defaults
대상 버전에 따라 다릅니다:
시작 버전 | 기본값 | 마크업 파싱 방식 |
---|---|---|
(original) | Rails::HTML4::Sanitizer |
HTML4 |
7.1 | Rails::HTML5::Sanitizer (주의사항 참고) |
HTML5 |
주의: Rails::HTML5::Sanitizer
는 JRuby에서 지원되지 않으므로, JRuby 플랫폼에서는 Rails가 Rails::HTML4::Sanitizer
로 대체됩니다.
3.18.3 Regexp.timeout
Ruby의 Regexp.timeout=
문서를 참조하세요.
3.19 데이터베이스 설정하기
거의 모든 Rails 애플리케이션은 데이터베이스와 상호작용합니다. 환경변수 ENV['DATABASE_URL']
을 설정하거나 config/database.yml
이라는 설정 파일을 사용하여 데이터베이스에 연결할 수 있습니다.
config/database.yml
파일을 사용하여 데이터베이스에 접근하는 데 필요한 모든 정보를 지정할 수 있습니다:
development:
adapter: postgresql
database: blog_development
pool: 5
이것은 postgresql
adapter를 사용하여 blog_development
라는 이름의 데이터베이스에 연결합니다. 동일한 정보는 URL로 저장되어 다음과 같이 환경 변수를 통해 제공될 수 있습니다:
ENV["DATABASE_URL"] # => "postgresql://localhost/blog_development?pool=5"
config/database.yml
파일은 Rails가 기본적으로 실행될 수 있는 세 가지 다른 환경에 대한 섹션을 포함하고 있습니다:
development
환경은 애플리케이션을 수동으로 조작할 때 개발/로컬 컴퓨터에서 사용됩니다.test
환경은 자동화된 테스트를 실행할 때 사용됩니다.production
환경은 애플리케이션을 전 세계에서 사용할 수 있도록 배포할 때 사용됩니다.
원하는 경우 config/database.yml
내에 URL을 수동으로 지정할 수 있습니다.
development:
url: postgresql://localhost/blog_development?pool=5
config/database.yml
파일은 <%= %>
ERB 태그를 포함할 수 있습니다. 태그 안의 모든 것은 Ruby 코드로 평가됩니다. 이를 통해 환경 변수에서 데이터를 가져오거나 필요한 연결 정보를 생성하기 위한 계산을 수행할 수 있습니다.
config/database.yml
파일에서 ENV['DATABASE_URL']
또는 url
키를 사용할 때, Rails는 URL의 protocol을 애플리케이션 내에서 구성할 수 있는 database adapter에 매핑할 수 있게 해줍니다. 이를 통해 배포 환경에 설정된 URL을 수정하지 않고도 adapter를 구성할 수 있습니다. 참조: config.active_record.protocol_adapters
.
데이터베이스 설정을 수동으로 업데이트할 필요가 없습니다. 애플리케이션 generator의 옵션을 보면 --database
라는 옵션이 있습니다. 이 옵션을 사용하면 가장 많이 사용되는 관계형 데이터베이스 목록에서 adapter를 선택할 수 있습니다. generator를 반복적으로 실행할 수도 있습니다: cd .. && rails new blog --database=mysql
. config/database.yml
파일의 덮어쓰기를 확인하면, 애플리케이션이 SQLite 대신 MySQL용으로 구성됩니다. 일반적인 데이터베이스 연결에 대한 자세한 예제는 아래에 있습니다.
3.20 Connection Preference
연결을 설정하는 방법에는 두 가지(config/database.yml
사용 또는 environment variable 사용)가 있으므로 이들이 어떻게 상호작용하는지 이해하는 것이 중요합니다.
만약 config/database.yml
파일이 비어있고 ENV['DATABASE_URL']
이 존재한다면, Rails는 environment variable을 통해 데이터베이스에 연결할 것입니다:
$ cat config/database.yml
$ echo $DATABASE_URL
postgresql://localhost/my_database
config/database.yml
은 있지만 ENV['DATABASE_URL']
이 없는 경우, 이 파일이 데이터베이스 연결에 사용됩니다:
$ cat config/database.yml
development:
adapter: postgresql
database: my_database
host: localhost
$ echo $DATABASE_URL
config/database.yml
와 ENV['DATABASE_URL']
이 모두 설정되어 있다면 Rails는 설정을 병합합니다. 이를 더 잘 이해하기 위해서는 몇 가지 예시를 살펴봐야 합니다.
중복된 연결 정보가 제공될 경우 환경 변수가 우선순위를 가집니다:
$ cat config/database.yml
development:
adapter: sqlite3
database: NOT_my_database
host: localhost
$ echo $DATABASE_URL
postgresql://localhost/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost"}
@url="postgresql://localhost/my_database">
]
위 예시는 DATABASE_URL
이 config/database.yml
파일의 설정을 어떻게 재정의하는지 보여줍니다.
여기서 adapter, host, database는 ENV['DATABASE_URL']
의 정보와 일치합니다.
중복되지 않는 정보가 제공되면 모든 고유한 값을 얻게 되며, 충돌이 발생하는 경우에는 environment variable이 우선됩니다.
$ cat config/database.yml
development:
adapter: sqlite3
pool: 5
$ echo $DATABASE_URL
postgresql://localhost/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"postgresql", "database"=>"my_database", "host"=>"localhost", "pool"=>5}
@url="postgresql://localhost/my_database">
]
pool이 ENV['DATABASE_URL']
에서 제공된 연결 정보에 없기 때문에 해당 정보가 병합됩니다. adapter
는 중복되므로 ENV['DATABASE_URL']
의 연결 정보가 우선시됩니다.
ENV['DATABASE_URL']
의 연결 정보를 명시적으로 사용하지 않는 유일한 방법은 "url"
하위 키를 사용하여 명시적 URL 연결을 지정하는 것입니다:
$ cat config/database.yml
development:
url: sqlite3:NOT_my_database
$ echo $DATABASE_URL
postgresql://localhost/my_database
$ bin/rails runner 'puts ActiveRecord::Base.configurations.inspect'
#<ActiveRecord::DatabaseConfigurations:0x00007fc8eab02880 @configurations=[
#<ActiveRecord::DatabaseConfigurations::UrlConfig:0x00007fc8eab020b0
@env_name="development", @spec_name="primary",
@config={"adapter"=>"sqlite3", "database"=>"NOT_my_database"}
@url="sqlite3:NOT_my_database">
]
여기서는 ENV['DATABASE_URL']
의 연결 정보는 무시되며, adapter와 database 이름이 다릅니다.
config/database.yml
에 ERB를 포함할 수 있기 때문에, 데이터베이스 연결에 ENV['DATABASE_URL']
을 사용한다는 것을 명시적으로 보여주는 것이 best practice입니다. 이는 특히 production 환경에서 유용한데, 데이터베이스 비밀번호와 같은 secrets를 source control(예: Git)에 커밋하면 안 되기 때문입니다.
$ cat config/database.yml
production:
url: <%= ENV['DATABASE_URL'] %>
이제 동작이 명확합니다. ENV['DATABASE_URL']
의 연결 정보만 사용하고 있습니다.
3.20.1 SQLite3 데이터베이스 구성하기
Rails는 경량 서버리스 데이터베이스 애플리케이션인 SQLite3에 대한 내장 지원을 제공합니다. Rails가 SQLite를 production 워크로드에 더 잘 구성하긴 하지만, 사용량이 많은 production 환경에서는 SQLite가 과부하될 수 있습니다. Rails는 새 프로젝트를 생성할 때 기본적으로 SQLite 데이터베이스를 사용하도록 설정되어 있지만, 이는 나중에 언제든 변경할 수 있습니다.
다음은 development 환경을 위한 연결 정보가 담긴 기본 설정 파일(config/database.yml
)의 일부입니다:
development:
adapter: sqlite3
database: storage/development.sqlite3
pool: 5
timeout: 5000
Rails는 기본적으로 데이터 저장을 위해 SQLite3 데이터베이스를 사용합니다. SQLite3는 별도의 설정 없이도 바로 동작하기 때문입니다. Rails는 또한 MySQL(MariaDB 포함)과 PostgreSQL을 "즉시" 지원하며, 많은 데이터베이스 시스템을 위한 플러그인을 가지고 있습니다. 만약 프로덕션 환경에서 데이터베이스를 사용하고 있다면 Rails는 대부분 해당 데이터베이스용 adapter를 가지고 있을 것입니다.
3.20.2 MySQL 또는 MariaDB 데이터베이스 설정하기
기본으로 제공되는 SQLite3 데이터베이스 대신 MySQL이나 MariaDB를 사용하기로 선택했다면, config/database.yml
은 조금 다르게 보일 것입니다. 다음은 development 섹션의 예시입니다:
development:
adapter: mysql2
encoding: utf8mb4
database: blog_development
pool: 5
username: root
password:
socket: /tmp/mysql.sock
개발용 데이터베이스에 비밀번호가 없는 root 사용자가 있다면, 이 설정이 동작할 것입니다. 그렇지 않다면, development
섹션의 username과 password를 적절하게 변경하세요.
MySQL 버전이 5.5나 5.6이고 기본적으로 utf8mb4
문자셋을 사용하려면, innodb_large_prefix
시스템 변수를 활성화하여 MySQL 서버가 더 긴 키 접두사를 지원하도록 설정해야 합니다.
Advisory Locks는 MySQL에서 기본적으로 활성화되어 있으며 데이터베이스 마이그레이션을 동시에 안전하게 수행하는 데 사용됩니다. advisory_locks
를 false
로 설정하여 advisory locks를 비활성화할 수 있습니다:
production:
adapter: mysql2
advisory_locks: false
production 환경에서는 mysql2를 adapter로 사용하고, advisory_locks 기능을 비활성화합니다.
3.20.3 PostgreSQL 데이터베이스 설정하기
PostgreSQL을 사용하기로 선택한 경우, PostgreSQL 데이터베이스를 사용하도록 config/database.yml
이 맞춤 설정될 것입니다:
development:
adapter: postgresql
encoding: unicode
database: blog_development
pool: 5
기본적으로 Active Record는 prepared statements와 advisory locks 같은 데이터베이스 기능을 사용합니다. PgBouncer와 같은 외부 connection pooler를 사용하는 경우 이러한 기능들을 비활성화해야 할 수 있습니다:
production:
adapter: postgresql
prepared_statements: false
advisory_locks: false
활성화된 경우, Active Record는 기본적으로 데이터베이스 연결당 최대 1000
개의 prepared statement를 생성합니다. 이 동작을 수정하려면 statement_limit
을 다른 값으로 설정할 수 있습니다:
production:
adapter: postgresql
statement_limit: 200
사용중인 prepared statements가 많을수록 데이터베이스에 필요한 메모리가 증가합니다. PostgreSQL 데이터베이스가 메모리 한계에 도달한다면 statement_limit
을 낮추거나 prepared statements를 비활성화해보세요.
3.20.4 JRuby Platform에서 SQLite3 데이터베이스 구성하기
SQLite3를 선택하고 JRuby를 사용하는 경우, config/database.yml
이 약간 다르게 보일 것입니다. 다음은 development 섹션입니다:
development:
adapter: jdbcsqlite3
database: storage/development.sqlite3
3.20.5 JRuby Platform을 위한 MySQL 또는 MariaDB Database 설정하기
MySQL이나 MariaDB를 선택했고 JRuby를 사용중이라면, config/database.yml
는 약간 다르게 보일 것입니다. 다음은 development 섹션입니다:
development:
adapter: jdbcmysql
database: blog_development
username: root
password:
3.20.6 JRuby 플랫폼을 위한 PostgreSQL 데이터베이스 설정하기
PostgreSQL을 선택하고 JRuby를 사용하는 경우, config/database.yml
파일이 조금 다르게 보일 것입니다. 다음은 development 섹션입니다:
development:
adapter: jdbcpostgresql
encoding: unicode
database: blog_development
username: blog
password:
development
섹션에서 username과 password를 적절하게 변경하세요.
3.20.7 Metadata Storage 설정하기
기본적으로 Rails는 Rails 환경과 schema에 대한 정보를 ar_internal_metadata
라는 내부 테이블에 저장합니다.
각 연결마다 이 기능을 끄려면 데이터베이스 설정에서 use_metadata_table
을 설정하세요. 이는 공유 데이터베이스나 테이블을 생성할 수 없는 데이터베이스 사용자와 작업할 때 유용합니다.
development:
adapter: postgresql
use_metadata_table: false
3.20.8 Retry 동작 구성하기
기본적으로 Rails는 문제가 발생하면 자동으로 데이터베이스 서버에 재연결하고 특정 쿼리를 재시도합니다. 안전하게 재시도 가능한(idempotent) 쿼리만이 재시도됩니다. 재시도 횟수는 데이터베이스 설정의 connection_retries
를 통해 지정할 수 있으며, 값을 0으로 설정하여 비활성화할 수 있습니다. 기본 재시도 횟수는 1입니다.
development:
adapter: mysql2
connection_retries: 3
데이터베이스 설정에서는 retry_deadline
도 설정할 수 있습니다. retry_deadline
이 설정되면, 재시도가 가능한 쿼리라도 처음 시도된 후 지정된 시간이 경과한 경우에는 재시도되지 않습니다. 예를 들어, retry_deadline
이 5초로 설정된 경우, 쿼리가 처음 시도된 후 5초가 경과했다면 그 쿼리가 멱등성을 가지고 있고 connection_retries
가 남아있더라도 재시도하지 않습니다.
이 값의 기본값은 nil이며, 이는 경과 시간에 관계없이 재시도 가능한 모든 쿼리가 재시도됨을 의미합니다. 이 설정 값은 초 단위로 지정해야 합니다.
development:
adapter: mysql2
retry_deadline: 5 # 5초 후 쿼리 재시도 중단
3.20.9 Query Cache 설정하기
기본적으로 Rails는 쿼리에 의해 반환된 결과 집합들을 자동으로 캐시합니다. Rails가 동일한 요청이나 job에서 같은 쿼리를 다시 만나면, 데이터베이스에 대해 쿼리를 다시 실행하는 대신 캐시된 결과 집합을 사용합니다.
query cache는 메모리에 저장되며, 너무 많은 메모리를 사용하지 않도록 임계값에 도달하면 가장 최근에 사용되지 않은 쿼리를 자동으로 제거합니다. 기본적으로 임계값은 100
이지만, database.yml
에서 설정할 수 있습니다.
development:
adapter: mysql2
query_cache: 200
쿼리 캐싱을 완전히 비활성화하려면 false
로 설정하면 됩니다.
development:
adapter: mysql2
query_cache: false
3.21 Rails 환경 생성하기
기본적으로 Rails는 "development", "test", "production" 세 가지 환경과 함께 제공됩니다. 이 환경들이 대부분의 사용 사례에 충분하지만, 더 많은 환경이 필요한 경우가 있습니다.
프로덕션 환경을 미러링하지만 테스트용으로만 사용되는 서버가 있다고 상상해보세요. 이러한 서버를 일반적으로 "staging server"라고 합니다. 이 서버를 위한 "staging" 환경을 정의하려면 config/environments/staging.rb
파일을 생성하면 됩니다. 이는 프로덕션과 유사한 환경이므로, config/environments/production.rb
의 내용을 복사해서 시작점으로 삼고 거기서 필요한 변경을 할 수 있습니다. 다른 환경 설정을 다음과 같이 require하고 확장하는 것도 가능합니다:
# config/environments/staging.rb
require_relative "production"
Rails.application.configure do
# Staging 환경용 재정의
end
해당 환경은 기본 환경과 다르지 않으며, bin/rails server -e staging
으로 서버를 시작하고, bin/rails console -e staging
으로 콘솔을 시작할 수 있으며, Rails.env.staging?
도 작동하는 등 동일하게 동작합니다.
3.22 서브디렉터리에 배포하기 (relative URL root)
기본적으로 Rails는 애플리케이션이 루트(예: /
)에서 실행된다고 가정합니다. 이 섹션에서는 디렉터리 내에서 애플리케이션을 실행하는 방법을 설명합니다.
우리의 애플리케이션을 "/app1"에 배포하고 싶다고 가정해봅시다. Rails는 적절한 route를 생성하기 위해 이 디렉터리를 알아야 합니다:
config.relative_url_root = "/app1"
또는 RAILS_RELATIVE_URL_ROOT
환경변수를 설정할 수 있습니다.
이제 Rails는 링크를 생성할 때 "/app1"을 앞에 추가할 것입니다.
3.22.1 Passenger 사용하기
Passenger를 사용하면 하위 디렉토리에서 애플리케이션을 쉽게 실행할 수 있습니다. Passenger 매뉴얼에서 관련 설정을 찾을 수 있습니다.
3.22.2 Reverse Proxy 사용하기
Reverse proxy를 사용하여 애플리케이션을 배포하는 것은 전통적인 배포 방식보다 확실한 장점이 있습니다. 애플리케이션에 필요한 컴포넌트를 계층화하여 서버를 더 잘 제어할 수 있게 해줍니다.
많은 최신 웹 서버들은 캐싱 서버나 애플리케이션 서버와 같은 써드파티 요소들의 밸런싱을 위한 프록시 서버로 사용될 수 있습니다.
사용할 수 있는 그러한 애플리케이션 서버 중 하나는 reverse proxy 뒤에서 실행되는 Unicorn입니다.
이 경우, 프록시 서버(NGINX, Apache 등)가 애플리케이션 서버(Unicorn)로부터의 연결을 수락하도록 설정해야 합니다. 기본적으로 Unicorn은 포트 8080에서 TCP 연결을 수신하지만, 포트를 변경하거나 대신 소켓을 사용하도록 구성할 수 있습니다.
자세한 정보는 Unicorn readme에서 찾을 수 있으며 그 뒤에 있는 철학을 이해할 수 있습니다.
애플리케이션 서버를 구성한 후에는 웹 서버를 적절히 구성하여 요청을 프록시해야 합니다. 예를 들어 NGINX 설정에는 다음이 포함될 수 있습니다:
upstream application_server {
server 0.0.0.0:8080;
}
server {
listen 80;
server_name localhost;
root /root/path/to/your_app/public;
try_files $uri/index.html $uri.html @app;
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://application_server;
}
# 기타 설정들
}
가장 최신 정보를 위해 NGINX documentation을 반드시 읽어보세요.
4 Rails 환경 설정
Rails의 일부 설정은 환경 변수를 통해 외부에서 구성할 수 있습니다. 다음 환경 변수들은 Rails의 여러 부분에서 인식됩니다:
ENV["RAILS_ENV"]
는 Rails가 실행될 Rails 환경(production, development, test 등)을 정의합니다.ENV["RAILS_RELATIVE_URL_ROOT"]
는 애플리케이션을 하위 디렉토리에 배포할 때 라우팅 코드가 URL을 인식하는 데 사용됩니다.ENV["RAILS_CACHE_ID"]
와ENV["RAILS_APP_VERSION"]
은 Rails의 캐싱 코드에서 확장된 캐시 키를 생성하는 데 사용됩니다. 이를 통해 동일한 애플리케이션에서 여러 개의 독립적인 캐시를 가질 수 있습니다.
5 Initializer 파일 사용하기
프레임워크와 애플리케이션의 모든 gem을 로드한 후, Rails는 initializer 로딩을 시작합니다. Initializer는 애플리케이션의 config/initializers
디렉토리에 저장된 모든 Ruby 파일입니다. Initializer를 사용하여 모든 프레임워크와 gem이 로드된 후에 설정되어야 하는 구성 설정을 저장할 수 있습니다.
config/initializers
(및 config/initializers
의 모든 하위 디렉토리)의 파일들은 정렬되어 load_config_initializers
initializer의 일부로 하나씩 로드됩니다.
initializer가 다른 initializer의 코드에 의존하는 경우, 이들을 하나의 initializer로 결합할 수 있습니다. 이렇게 하면 의존성이 더 명시적이 되고 애플리케이션 내의 새로운 개념을 표면화하는 데 도움이 될 수 있습니다. Rails는 initializer 파일 이름의 번호 매기기도 지원하지만, 이는 파일 이름 변경을 초래할 수 있습니다. require
를 사용하여 initializer를 명시적으로 로드하는 것은 권장되지 않습니다. initializer가 두 번 로드될 수 있기 때문입니다.
initializer가 모든 gem initializer 이후에 실행된다는 보장은 없으므로, 특정 gem이 초기화된 후에 실행되어야 하는 초기화 코드는 config.after_initialize
블록 안에 넣어야 합니다.
6 Load Hooks
Rails 코드는 종종 애플리케이션 로드 시에 참조될 수 있습니다. Rails는 이러한 프레임워크들의 로드 순서를 담당하므로, ActiveRecord::Base
와 같은 프레임워크를 미리 로드하면 Rails와의 암묵적 계약을 위반하게 됩니다. 더욱이 애플리케이션 부팅 시에 ActiveRecord::Base
와 같은 코드를 로드하면 전체 프레임워크가 로드되어 부팅 시간이 느려지고 로드 순서와 애플리케이션 부팅에 충돌이 발생할 수 있습니다.
Load와 configuration hook은 Rails와의 로드 계약을 위반하지 않고 이 초기화 프로세스에 연결할 수 있게 해주는 API입니다. 이는 또한 부팅 성능 저하를 완화하고 충돌을 피할 수 있게 해줍니다.
6.1 Rails 프레임워크 로딩 피하기
Ruby는 동적 언어이므로, 일부 코드는 다른 Rails 프레임워크를 로드하게 됩니다. 예를 들어 다음과 같은 코드 조각을 보겠습니다:
ActiveRecord::Base.include(MyActiveRecordHelper)
이 코드 조각은 이 파일이 로드될 때 ActiveRecord::Base
를 만나게 된다는 것을 의미합니다. 이러한 조우로 인해 Ruby는 해당 상수의 정의를 찾아 require하게 됩니다. 이로 인해 부팅 시 전체 Active Record 프레임워크가 로드됩니다.
ActiveSupport.on_load
는 실제로 필요할 때까지 코드 로딩을 지연시키는 데 사용할 수 있는 메커니즘입니다. 위의 코드 조각은 다음과 같이 변경될 수 있습니다:
ActiveSupport.on_load(:active_record)는 ActiveRecord가 로드될 때 MyActiveRecordHelper를 포함하도록 지정합니다.
이 새로운 코드 조각은 ActiveRecord::Base
가 로드될 때만 MyActiveRecordHelper
를 포함할 것입니다.
6.2 Hook은 언제 호출되나요?
Rails 프레임워크에서 이러한 hook들은 특정 라이브러리가 로드될 때 호출됩니다. 예를 들어, ActionController::Base
가 로드될 때 :action_controller_base
hook이 호출됩니다. 이는 :action_controller_base
hook을 가진 모든 ActiveSupport.on_load
호출이 ActionController::Base
의 컨텍스트에서 호출된다는 것을 의미합니다(즉, self
가 ActionController::Base
가 됩니다).
6.3 Load Hooks를 사용하도록 코드 수정하기
코드를 수정하는 것은 일반적으로 간단합니다. ActiveRecord::Base
와 같은 Rails 프레임워크를 참조하는 코드가 있다면 해당 코드를 load hook으로 감쌀 수 있습니다.
include
호출 수정하기
ActiveRecord::Base.include(MyActiveRecordHelper)
becomes
becomes
메소드는 레코드의 becomes
메소드는 주어진 클래스의 새로운 객체로 해당 레코드를 변환할 수 있게 합니다. 이는 STI(Single Table Inheritance)를 사용할 때 레코드를 다른 타입으로 변환하는데 특히 유용합니다.
account = Account.first
company = account.becomes(Company) # => Company 인스턴스 반환
company.new_record? # => false
becomes!
메소드도 사용할 수 있는데, 이는 객체를 바로 변경합니다.
account = Account.first
account.becomes!(Company)
account.class # => Company 인스턴스가 됨
becomes
및 becomes!
메소드는 원래 모델의 속성들을 새로운 모델로 모두 복사합니다. 이 프로세스는 모델들이 모든 같은 속성을 공유한다고 가정합니다.
ActiveSupport.on_load(:active_record) do
# 여기서 self는 ActiveRecord::Base를 가리키므로,
# .include를 호출할 수 있습니다
include MyActiveRecordHelper
end
prepend
호출 수정하기
ActionController::Base.prepend(MyActionControllerHelper)
becomes
becomes 메서드는 객체의 내부 형태를 다른 객체나 클래스로 변경합니다. 이는 새로운 객체를 생성하지 않고 본질적으로 객체를 직접 변경합니다.
user = User.find_by(id: 1)
user.becomes(SuperUser)
object.becomes 함수는 다음과 같은 상황에서 유용합니다:
- 거의 동일한 모델의 STI(Single Table Inheritance) 계층에서 이동할 때
- 모델의 모든 속성을 유지하면서 확장된 기능과 API를 가진 decorator 모델로 전환할 때
주의: 원본 객체의 속성은 보존되지만, changed_attributes와 같은 이력 관련 정보는 초기화됩니다.
ActiveSupport.on_load(:action_controller_base) do
# 여기서 self는 ActionController::Base를 참조하므로
# .prepend를 호출할 수 있습니다
prepend MyActionControllerHelper
end
클래스 메서드 호출 수정하기
ActiveRecord::Base.include_root_in_json = true
JSON 표현에 root 요소를 포함할지 여부를 설정합니다.
becomes
ActiveSupport.on_load(:active_record) do
# 여기서 self는 ActiveRecord::Base를 참조합니다
self.include_root_in_json = true
end
6.4 사용 가능한 Load Hook
다음은 여러분의 코드에서 사용할 수 있는 load hook들입니다. 다음 클래스들의 초기화 프로세스에 hook을 걸려면 사용 가능한 hook을 사용하세요.
Class | Hook |
---|---|
ActionCable |
action_cable |
ActionCable::Channel::Base |
action_cable_channel |
ActionCable::Connection::Base |
action_cable_connection |
ActionCable::Connection::TestCase |
action_cable_connection_test_case |
ActionController::API |
action_controller_api |
ActionController::API |
action_controller |
ActionController::Base |
action_controller_base |
ActionController::Base |
action_controller |
ActionController::TestCase |
action_controller_test_case |
ActionDispatch::IntegrationTest |
action_dispatch_integration_test |
ActionDispatch::Response |
action_dispatch_response |
ActionDispatch::Request |
action_dispatch_request |
ActionDispatch::SystemTestCase |
action_dispatch_system_test_case |
ActionMailbox::Base |
action_mailbox |
ActionMailbox::InboundEmail |
action_mailbox_inbound_email |
ActionMailbox::Record |
action_mailbox_record |
ActionMailbox::TestCase |
action_mailbox_test_case |
ActionMailer::Base |
action_mailer |
ActionMailer::TestCase |
action_mailer_test_case |
ActionText::Content |
action_text_content |
ActionText::Record |
action_text_record |
ActionText::RichText |
action_text_rich_text |
ActionText::EncryptedRichText |
action_text_encrypted_rich_text |
ActionView::Base |
action_view |
ActionView::TestCase |
action_view_test_case |
ActiveJob::Base |
active_job |
ActiveJob::TestCase |
active_job_test_case |
ActiveModel::Model |
active_model |
ActiveModel::Translation |
active_model_translation |
ActiveRecord::Base |
active_record |
ActiveRecord::Encryption |
active_record_encryption |
ActiveRecord::TestFixtures |
active_record_fixtures |
ActiveRecord::ConnectionAdapters::PostgreSQLAdapter |
active_record_postgresqladapter |
ActiveRecord::ConnectionAdapters::Mysql2Adapter |
active_record_mysql2adapter |
ActiveRecord::ConnectionAdapters::TrilogyAdapter |
active_record_trilogyadapter |
ActiveRecord::ConnectionAdapters::SQLite3Adapter |
active_record_sqlite3adapter |
ActiveStorage::Attachment |
active_storage_attachment |
ActiveStorage::VariantRecord |
active_storage_variant_record |
ActiveStorage::Blob |
active_storage_blob |
ActiveStorage::Record |
active_storage_record |
ActiveSupport::TestCase |
active_support_test_case |
i18n |
i18n |
초기화 이벤트
Rails는 다음 5개의 초기화 이벤트에 연결할 수 있습니다(실행되는 순서대로 나열):
before_configuration
:config/application.rb
에서 애플리케이션 클래스가Rails::Application
을 상속할 때 실행됩니다. 클래스 본문이 실행되기 전에 실행됩니다. Engine은 애플리케이션 자체가 구성되기 전에 코드를 실행하기 위해 이 hook을 사용할 수 있습니다.before_initialize
: Rails 초기화 프로세스 초기에 있는:bootstrap_hook
initializer로 애플리케이션의 초기화 프로세스가 발생하기 직전에 실행됩니다.to_prepare
: 모든 Railties(애플리케이션 자체 포함)에 대한 initializer가 실행되고 middleware 스택이 구축된 후에 실행되지만, eager loading 전에 실행됩니다. 더 중요한 것은,development
에서는 코드가 다시 로드될 때마다 실행되지만,production
과test
에서는 (부팅 시) 한 번만 실행됩니다.before_eager_load
:production
환경에서는 기본 동작이지만development
환경에서는 아닌 eager loading이 발생하기 직전에 실행됩니다.after_initialize
: 애플리케이션의 초기화 직후,config/initializers
의 애플리케이션 initializer가 실행된 후에 실행됩니다.
이러한 hook에 대한 이벤트를 정의하려면 Rails::Application
, Rails::Railtie
또는 Rails::Engine
하위 클래스 내에서 블록 구문을 사용하세요:
module YourApp
class Application < Rails::Application
config.before_initialize do
# 초기화 코드가 여기에 옵니다
end
end
end
또는 Rails.application
객체의 config
메서드를 통해 설정할 수도 있습니다:
Rails.application.config.before_initialize do
# 초기화 코드를 여기에 작성하세요
end
after_initialize
블록이 호출되는 시점에서는 routing과 같은 애플리케이션의 일부 기능이 아직 설정되어 있지 않습니다.
6.5 Rails::Railtie#initializer
Rails는 시작 시 실행되는 여러 initializer들을 가지고 있으며, 이들은 모두 Rails::Railtie
의 initializer
메서드를 사용하여 정의됩니다. 다음은 Action Controller의 set_helpers_path
initializer의 예시입니다:
initializer "action_controller.set_helpers_path"는 |app|를 통해
ActionController::Helpers의 helpers_path를 app.helpers_paths로 설정합니다
initializer
메서드는 세 개의 인수를 받으며, 첫 번째는 initializer의 이름, 두 번째는 옵션 해시(여기서는 표시되지 않음), 세 번째는 블록입니다. 옵션 해시의 :before
키는 이 새로운 initializer가 어떤 initializer 이전에 실행되어야 하는지를, :after
키는 이 initializer가 어떤 initializer 이후에 실행되어야 하는지를 지정하는 데 사용됩니다.
initializer
메서드를 사용하여 정의된 initializer들은 :before
또는 :after
메서드를 사용하는 경우를 제외하고는 정의된 순서대로 실행됩니다.
논리적으로 타당한 한, 체인 내의 다른 어떤 initializer 이전이나 이후에 initializer를 배치할 수 있습니다. 예를 들어 "one"부터 "four"까지 4개의 initializer가 있고(해당 순서로 정의됨) "four"가 "two" 이전에 실행되지만 "three" 이후에 실행되도록 정의한다면, 이는 논리적이지 않으며 Rails는 initializer 순서를 결정할 수 없게 됩니다.
initializer
메서드의 블록 인수는 애플리케이션 자체의 인스턴스이므로, 예제에서처럼 config
메서드를 사용하여 설정에 접근할 수 있습니다.
Rails::Application
은 Rails::Railtie
를 (간접적으로) 상속받기 때문에, config/application.rb
에서 initializer
메서드를 사용하여 애플리케이션의 initializer를 정의할 수 있습니다.
6.6 Initializers
다음은 Rails에서 정의된(그리고 별도로 명시되지 않는 한 실행되는) 모든 initializer의 포괄적인 목록입니다.
load_environment_hook
::load_environment_config
가 그 전에 실행되도록 정의될 수 있게 하는 placeholder 역할을 합니다.load_active_support
: Active Support의 기반을 설정하는active_support/dependencies
를 require합니다. 기본값인config.active_support.bare
가 거짓이면 선택적으로active_support/all
을 require합니다.initialize_logger
: 애플리케이션의 logger(ActiveSupport::BroadcastLogger
객체)를 초기화하고 이 시점 이전에 삽입된 initializer가Rails.logger
를 정의하지 않은 경우Rails.logger
로 접근 가능하게 합니다.initialize_cache
:Rails.cache
가 아직 설정되지 않은 경우,config.cache_store
의 값을 참조하여 캐시를 초기화하고 결과를Rails.cache
로 저장합니다. 이 객체가middleware
메서드에 응답하는 경우, 해당 middleware는 middleware 스택의Rack::Runtime
이전에 삽입됩니다.set_clear_dependencies_hook
: 이 initializer는config.enable_reloading
이true
로 설정된 경우에만 실행되며,ActionDispatch::Callbacks.after
를 사용하여 다음 요청 시 다시 로드될 수 있도록 요청 중에 참조된 상수들을 객체 공간에서 제거합니다.bootstrap_hook
: 설정된 모든before_initialize
블록을 실행합니다.i18n.callbacks
: 개발 환경에서는 마지막 요청 이후 로케일이 변경된 경우I18n.reload!
를 호출하는to_prepare
콜백을 설정합니다. 프로덕션 환경에서는 이 콜백이 첫 번째 요청에서만 실행됩니다.active_support.deprecation_behavior
:config.active_support.report_deprecations
,config.active_support.deprecation
,config.active_support.disallowed_deprecation
,config.active_support.disallowed_deprecation_warnings
를 기반으로Rails.application.deprecators
에 대한 deprecation 리포팅 동작을 설정합니다.active_support.initialize_time_zone
: 기본값이 "UTC"인config.time_zone
설정을 기반으로 애플리케이션의 기본 시간대를 설정합니다.active_support.initialize_beginning_of_week
: 기본값이:monday
인config.beginning_of_week
설정을 기반으로 애플리케이션의 기본 주 시작일을 설정합니다.active_support.set_configs
:config.active_support
의 설정을 사용하여 메서드 이름을 setter로ActiveSupport
에send
하고 값을 전달하여 Active Support를 설정합니다.action_dispatch.configure
:ActionDispatch::Http::URL.tld_length
를config.action_dispatch.tld_length
값으로 설정하도록 구성합니다.action_view.set_configs
:config.action_view
의 설정을 사용하여 메서드 이름을 setter로ActionView::Base
에send
하고 값을 전달하여 Action View를 설정합니다.action_controller.assets_config
: 명시적으로 구성되지 않은 경우config.action_controller.assets_dir
을 앱의 public 디렉토리로 초기화합니다.action_controller.set_helpers_path
: Action Controller의helpers_path
를 애플리케이션의helpers_path
로 설정합니다.action_controller.parameters_config
:ActionController::Parameters
의 strong parameters 옵션을 구성합니다.action_controller.set_configs
:config.action_controller
의 설정을 사용하여 메서드 이름을 setter로ActionController::Base
에send
하고 값을 전달하여 Action Controller를 설정합니다.action_controller.compile_config_methods
: 더 빠른 접근을 위해 지정된 설정에 대한 메서드를 초기화합니다.active_record.initialize_timezone
:ActiveRecord::Base.time_zone_aware_attributes
를true
로 설정하고ActiveRecord::Base.default_timezone
을 UTC로 설정합니다. 데이터베이스에서 속성을 읽을 때Time.zone
에 지정된 시간대로 변환됩니다.active_record.logger
: 아직 설정되지 않은 경우ActiveRecord::Base.logger
를Rails.logger
로 설정합니다.active_record.migration_error
: 대기 중인 migration을 확인하기 위한 middleware를 구성합니다.active_record.check_schema_cache_dump
: 구성되어 있고 사용 가능한 경우 schema cache dump를 로드합니다.active_record.set_configs
:config.active_record
의 설정을 사용하여 메서드 이름을 setter로ActiveRecord::Base
에send
하고 값을 전달하여 Active Record를 설정합니다.active_record.initialize_database
: 기본적으로config/database.yml
에서 데이터베이스 설정을 로드하고 현재 환경에 대한 연결을 설정합니다.active_record.log_runtime
: Active Record 호출이 요청에 걸린 시간을 logger에 보고하는 역할을 하는ActiveRecord::Railties::ControllerRuntime
과ActiveRecord::Railties::JobRuntime
을 포함합니다.active_record.set_reloader_hooks
:config.enable_reloading
이true
로 설정된 경우 데이터베이스에 대한 모든 재로드 가능한 연결을 재설정합니다.active_record.add_watchable_files
:schema.rb
와structure.sql
파일을 감시 가능한 파일에 추가합니다.active_job.logger
: 아직 설정되지 않은 경우ActiveJob::Base.logger
를Rails.logger
로 설정합니다.active_job.set_configs
:config.active_job
의 설정을 사용하여 Active Job을 설정합니다. 메서드 이름을ActiveJob::Base
에 setter로send
하고 값을 전달합니다.action_mailer.logger
: 아직 설정되지 않은 경우ActionMailer::Base.logger
를Rails.logger
로 설정합니다.action_mailer.set_configs
:config.action_mailer
의 설정을 사용하여 Action Mailer를 설정합니다. 메서드 이름을ActionMailer::Base
에 setter로send
하고 값을 전달합니다.action_mailer.compile_config_methods
: 더 빠른 접근을 위해 지정된 설정에 대한 메서드를 초기화합니다.set_load_path
: 이 초기화는bootstrap_hook
이전에 실행됩니다.config.paths.load_paths
에 지정된 경로를$LOAD_PATH
에 추가합니다. 그리고config.add_autoload_paths_to_load_path
를false
로 설정하지 않는 한,config.autoload_paths
,config.eager_load_paths
,config.autoload_once_paths
에 지정된 모든 autoload 경로도 추가합니다.set_autoload_paths
: 이 초기화는bootstrap_hook
이전에 실행됩니다.app
의 모든 하위 디렉토리와config.autoload_paths
,config.eager_load_paths
,config.autoload_once_paths
에 지정된 경로를ActiveSupport::Dependencies.autoload_paths
에 추가합니다.add_routing_paths
: (기본적으로) 애플리케이션과 railties(엔진 포함)의 모든config/routes.rb
파일을 로드하고 애플리케이션의 라우트를 설정합니다.add_locales
: 애플리케이션, railties, 엔진의config/locales
파일들을I18n.load_path
에 추가하여 이 파일들의 번역을 사용할 수 있게 합니다.add_view_paths
: 애플리케이션, railties, 엔진의app/views
디렉토리를 애플리케이션의 뷰 파일 검색 경로에 추가합니다.add_mailer_preview_paths
: 애플리케이션, railties, 엔진의test/mailers/previews
디렉토리를 애플리케이션의 메일러 미리보기 파일 검색 경로에 추가합니다.load_environment_config
: 이 초기화는load_environment_hook
이전에 실행됩니다. 현재 환경에 대한config/environments
파일을 로드합니다.prepend_helpers_path
: 애플리케이션, railties, 엔진의app/helpers
디렉토리를 애플리케이션의 헬퍼 검색 경로에 추가합니다.load_config_initializers
: 애플리케이션, railties, 엔진의config/initializers
에 있는 모든 Ruby 파일을 로드합니다. 이 디렉토리의 파일들은 모든 프레임워크가 로드된 후에 적용되어야 하는 설정을 보관하는 데 사용할 수 있습니다.engines_blank_point
: 엔진이 로드되기 전에 무언가를 수행하고 싶을 때 연결할 수 있는 초기화 시점을 제공합니다. 이 시점 이후에는 모든 railtie와 엔진 초기화가 실행됩니다.add_generator_templates
: 애플리케이션, railties, 엔진의lib/templates
에서 generator 템플릿을 찾아config.generators.templates
설정에 추가합니다. 이를 통해 모든 generator가 템플릿을 참조할 수 있게 됩니다.ensure_autoload_once_paths_as_subset
:config.autoload_once_paths
가config.autoload_paths
의 경로만 포함하도록 보장합니다. 추가 경로가 포함되어 있으면 예외가 발생합니다.add_to_prepare_blocks
: 애플리케이션, railtie, 또는 엔진의 모든config.to_prepare
호출에 대한 블록이 Action Dispatch의to_prepare
콜백에 추가됩니다. 이는 개발 환경에서는 요청마다 실행되고, 프로덕션 환경에서는 첫 번째 요청 전에 실행됩니다.add_builtin_route
: 애플리케이션이 개발 환경에서 실행 중인 경우,rails/info/properties
에 대한 라우트를 애플리케이션 라우트에 추가합니다. 이 라우트는 기본 Rails 애플리케이션의public/index.html
에 Rails와 Ruby 버전과 같은 상세 정보를 제공합니다.build_middleware_stack
: 애플리케이션의 middleware 스택을 빌드하고, Rack 환경 객체를 요청의 매개변수로 받는call
메서드를 가진 객체를 반환합니다.eager_load!
:config.eager_load
가true
이면,config.before_eager_load
훅을 실행하고 모든config.eager_load_namespaces
를 로드하는eager_load!
를 호출합니다.finisher_hook
: 애플리케이션의 초기화 프로세스가 완료된 후의 훅을 제공하며, 애플리케이션, railties, 엔진에 대한 모든config.after_initialize
블록을 실행합니다.set_routes_reloader_hook
: Action Dispatch가ActiveSupport::Callbacks.to_run
을 사용하여 routes 파일을 다시 로드하도록 설정합니다.disable_dependency_loading
:config.eager_load
가true
로 설정된 경우 자동 의존성 로딩을 비활성화합니다.
7 Database Pooling
Active Record 데이터베이스 연결은 ActiveRecord::ConnectionAdapters::ConnectionPool
에 의해 관리되며, 이는 연결 풀이 제한된 수의 데이터베이스 연결에 대한 스레드 접근을 동기화하도록 보장합니다. 이 제한은 기본값이 5이며 database.yml
에서 설정할 수 있습니다.
development:
adapter: sqlite3
database: storage/development.sqlite3
pool: 5
timeout: 5000
데이터베이스 연결 풀링은 기본적으로 Active Record 내부에서 처리되기 때문에, 모든 애플리케이션 서버(Thin, Puma, Unicorn 등)는 동일하게 동작합니다. 데이터베이스 연결 풀은 처음에는 비어있습니다. 연결에 대한 요구가 증가함에 따라 연결 풀 제한에 도달할 때까지 연결을 생성합니다.
어떤 요청이든 데이터베이스에 처음 접근할 때 연결을 체크아웃합니다. 요청이 끝나면 연결을 다시 체크인합니다. 이는 추가 연결 슬롯이 대기열의 다음 요청에 다시 사용 가능하게 된다는 것을 의미합니다.
사용 가능한 것보다 더 많은 연결을 사용하려고 하면, Active Record는 작업을 차단하고 풀에서 연결을 기다립니다. 연결을 가져올 수 없는 경우, 아래와 같은 timeout 에러가 발생합니다.
ActiveRecord::ConnectionTimeoutError - 5.000초 이내에 데이터베이스 연결을 얻을 수 없습니다 (5.000초 대기함)
위와 같은 오류가 발생하면 database.yml
의 pool
옵션을 늘려서 connection pool의 크기를 증가시킬 수 있습니다.
멀티스레드 환경에서 실행 중인 경우, 여러 스레드가 동시에 여러 connection에 액세스할 가능성이 있습니다. 따라서 현재 요청 부하에 따라 제한된 수의 connection을 여러 스레드가 경합할 수 있습니다.
8 Custom Configuration
Rails configuration 객체를 통해 config.x
네임스페이스 또는 config
직접 사용하여 사용자 정의 설정을 구성할 수 있습니다. 이 둘의 주요 차이점은 중첩된 설정(예: config.x.nested.hi
)을 정의하는 경우 config.x
를 사용해야 하고, 단일 레벨 설정(예: config.hello
)의 경우 config
를 직접 사용해야 한다는 것입니다.
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.super_debugger = true
위와 같은 custom configuration 은 코드 어디에서나 사용할 수 있습니다:
이러한 설정 항목들은 configuration 객체를 통해 사용할 수 있습니다:
Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries # => 3
Rails.configuration.x.payment_processing.not_set # => nil
Rails.configuration.super_debugger # => true
Rails::Application.config_for
를 사용하여 전체 configuration 파일을 로드할 수도 있습니다:
# config/payment.yml
production:
environment: production
merchant_id: production_merchant_id
public_key: production_public_key
private_key: production_private_key
development:
environment: sandbox
merchant_id: development_merchant_id
public_key: development_public_key
private_key: development_private_key
# config/application.rb
module MyApp
class Application < Rails::Application
config.payment = config_for(:payment)
end
end
Rails.configuration.payment["merchant_id"] # => production_merchant_id 또는 development_merchant_id
Rails::Application.config_for
는 공통 설정을 그룹화하기 위한 shared
설정을 지원합니다. shared 설정은 environment 설정에 병합됩니다.
# config/example.yml
shared:
foo:
bar:
baz: 1
development:
foo:
bar:
qux: 2
# development 환경
Rails.application.config_for(:example)[:foo][:bar] #=> { baz: 1, qux: 2 }
9 검색 엔진 인덱싱
때때로 Google, Bing, Yahoo나 Duck Duck Go와 같은 검색 사이트에서 애플리케이션의 일부 페이지가 보이지 않게 하고 싶을 수 있습니다. 이러한 사이트를 인덱싱하는 로봇들은 먼저 http://your-site.com/robots.txt
파일을 분석하여 어떤 페이지를 인덱싱할 수 있는지 확인합니다.
Rails는 /public
폴더 안에 이 파일을 자동으로 생성합니다. 기본적으로 검색 엔진이 애플리케이션의 모든 페이지를 인덱싱할 수 있도록 허용합니다. 애플리케이션의 모든 페이지에서 인덱싱을 차단하려면 다음과 같이 사용하세요:
User-agent: *
Disallow: /
특정 페이지들만 차단하려면 좀 더 복잡한 구문이 필요합니다. 공식 문서에서 배워보세요.