Rails 초기화기
초기화기는 Rails 프로세스가 시작될 때 실행됩니다. 즉, 초기화기는 매번 배포 중에도 실행됩니다.
기본적으로 Rails는 config/initializers
에 있는 초기화기가 로드된 후에 Zeitwerk를 로드합니다.
Zeitwerk가 로드되기 전에 자동 로딩을 수행하는 것은 이제 더 이상 권장되지 않지만, 초기화기에서 많은 자동 로드된 상수를 사용하기 때문에, 초기화기보다 Zeitwerk 로드를 더 일찍 이동해야 했습니다.
이로 인해 초기화기에서는 config.autoload_paths
가 이미 고정(frozen)되어 있습니다.
Zeitwerk가 로드되기 전에 초기화기를 실행하려면, config/initializers_before_autoloader
에 넣어야 합니다.
이 폴더의 Ruby 파일들은 기본 Rails 초기화기처럼 알파벳 순서로 로드됩니다.
이 작업이 필요한 몇 가지 예는 다음과 같습니다:
- Rails의
config.autoload_paths
수정하기 - Zeitwerk가 사용하는 구성 변경하기, 예를 들어, 변형(inflections)
초기화기에서의 데이터베이스 연결
이상적으로, 데이터베이스 연결은 Rails 초기화기에서 열리지 않아야 합니다.
초기화기에서 데이터베이스 연결을 여는 것(예를 들어, 데이터베이스가 존재하는지 확인하거나 데이터베이스 쿼리를 수행하는 것)은 db:drop
및 db:test:prepare
와 같은 작업이 실패하게 만듭니다.
활성 세션이 데이터베이스 삭제를 방해하기 때문입니다.
이를 방지하기 위해, 우리는 라우트 로딩 중 데이터베이스 연결이 열리지 않도록 합니다. 이렇게 하면 오류가 발생합니다:
RuntimeError:
초기화기에서 데이터베이스 연결을 호출해서는 안 됩니다.
# ./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>'