Rails 초기화자

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

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

이로 인해 초기화자 안에서 config.autoload_paths가 이미 동결된 상태입니다.

Zeitwerk이 로드되기 전에 초기화자를 실행하려면 이를 config/initializers_before_autoloader에 넣어야 합니다. 이 폴더의 루비 파일은 기본 Rails 초기화자와 마찬가지로 알파벳순으로 로드됩니다.

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

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

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

이상적으로, 데이터베이스 연결은 Rails 초기화자에서 열리지 않아야 합니다. 초기화자에서 데이터베이스 연결을 열면 db:drop이나 db:test:prepare와 같은 작업이 실패할 수 있습니다. 왜냐하면 활성 세션이 데이터베이스 삭제를 방해하기 때문입니다.

이를 방지하기 위해, 우리는 routes 로딩 중에 데이터베이스 연결을 중단합니다. 이를 실행하면 다음과 같은 오류가 발생합니다:

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 `블록 내부'
# ./config/routes.rb:9:in `<main>'