Rails 초기화자

초기화자는 Rails 프로세스가 시작될 때 실행됩니다. 즉, 초기화자는 매 배포 시에도 실행됩니다.

기본적으로 Rails는 config/initializers에 있는 초기화자가 로드된 후 Zeitwerk를 로드합니다. Zeitwerk 이전에 자동로드를 로드하는 것은 현재 사용이 중단되었지만, 초기화자에서 많은 자동로드된 상수를 사용하고 있기 때문에 우리는 이러한 초기화자보다 더 일찍 Zeitwerk를 로드해야 했습니다.

이로 인한 부작용으로 초기화자에서의 config.autoload_paths가 이미 동결된 상태입니다.

Zeitwerk가 로드되기 전에 초기화자를 실행하려면, 이를 config/initializers_before_autoloader에 넣어야 합니다. 이 폴더에 있는 Ruby 파일들은 기본 Rails 초기화자와 마찬가지로 알파벳 순서대로 로드됩니다.

이를 수행해야 하는 몇 가지 예시는 다음과 같습니다:

  1. Rails의 config.autoload_paths 수정
  2. Zeitwerk가 사용하는 구성 변경, 예를 들어, 변형

초기화자에서의 데이터베이스 연결

이상적으로, 데이터베이스 연결은 Rails 초기화자에서 열리지 않아야 합니다. 초기화자에서 데이터베이스 연결을 열면 (db:dropdb: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>'