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