Rails 초기화기
초기화기는 Rails 프로세스가 시작될 때 실행됩니다. 즉, 초기화기는 모든 배포 과정에서도 실행됩니다.
기본적으로 Rails는 config/initializers
에 있는 초기화기가 로드된 후에 Zeitwerk를 로드합니다.
Zeitwerk 이전에 autoload되는 것은 이제 사용이 중단되었지만, 우리의 초기화기에서 많은 autoload된 상수를 사용하기 때문에
Zeitwerk를 이러한 초기화기들보다 더 일찍 로드할 필요가 있었습니다.
이러한 부작용 중 하나는 초기화기에서 config.autoload_paths
가 이미 동결된 상태인 것입니다.
Zeitwerk가 로드되기 전에 초기화기를 실행하려면, 그것들을 config/initializers_before_autoloader
에 넣어야 합니다.
이 폴더에 있는 Ruby 파일들은 기본 Rails 초기화기처럼 알파벳 순서대로 로드됩니다.
이를 수행해야 하는 몇 가지 예시는 다음과 같습니다:
- Rails의
config.autoload_paths
수정 - Zeitwerk가 사용하는 설정 변경, 예를 들어, inflections
초기화기에서의 데이터베이스 연결
이상적으로, 데이터베이스 연결은 Rails 초기화기에서 열리지 않아야 합니다. 초기화기에서 데이터베이스 연결을
열면 (db:drop
과 db:test:prepare
와 같은) 작업이 실패할 수 있습니다. 왜냐하면 활성 세션이 데이터베이스가
제거되는 것을 방해하기 때문입니다.
이를 방지하기 위해, routes 로딩 중에 데이터베이스 연결을 중단시켜야 합니다. 이를 수행하면 다음과 같은 오류가 발생합니다:
RuntimeError:
Database connection should not be called during initializers.
# ./config/initializers/00_connection_logger.rb:15:in `new_client'
# ./lib/gitlab/database/load_balancing/load_balancer.rb:112:in `block in read_write'
# ./lib/gitlab/database/load_balancing/load_balancer.rb:184:in `retry_with_backoff'
# ./lib/gitlab/database/load_balancing/load_balancer.rb:111:in `read_write'
# ./lib/gitlab/database/load_balancing/connection_proxy.rb:119:in `write_using_load_balancer'
# ./lib/gitlab/database/load_balancing/connection_proxy.rb:89:in `method_missing'
# ./config/routes.rb:10:in `block in <main>'
# ./config/routes.rb:9:in `<main>'