Rails 초기화기

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

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

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

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

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

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

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

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