Rails 이니셜라이저
GitLab v19.1이니셜라이저는 Rails 프로세스가 시작될 때 실행됩니다. 기본적으로 Rails는 config/initializers의 이니셜라이저가 로드된 후에 Zeitwerk를 로드합니다. 이로 인한 부작용으로, 이니셜라이저 내에서 config.autoload_paths는 이미 동결(frozen)된 상태입니다.
이니셜라이저는 Rails 프로세스가 시작될 때 실행됩니다. 즉, 이니셜라이저는 모든 배포 시에도 실행됩니다.
기본적으로 Rails는 config/initializers의 이니셜라이저가 로드된 후에 Zeitwerk를 로드합니다.
Zeitwerk가 로드되기 전의 자동 로딩은 이제 deprecated되었지만, 이니셜라이저에서 자동 로드되는 상수를 많이 사용하기 때문에
Zeitwerk의 로딩을 이러한 이니셜라이저보다 앞서 이동해야 했습니다.
이로 인한 부작용으로, 이니셜라이저 내에서 config.autoload_paths는 이미 동결(frozen)된 상태입니다.
Zeitwerk가 로드되기 전에 이니셜라이저를 실행하려면 config/initializers_before_autoloader에 배치해야 합니다.
이 폴더의 Ruby 파일은 기본 Rails 이니셜라이저와 마찬가지로 알파벳 순서로 로드됩니다.
이 작업이 필요한 예시는 다음과 같습니다:
-
Rails의
config.autoload_paths수정 -
Zeitwerk가 사용하는 설정 변경, 예를 들어 inflections(변형 규칙)
이니셜라이저에서의 데이터베이스 연결#
이상적으로는 Rails 이니셜라이저에서 데이터베이스 연결을 열지 않아야 합니다.
이니셜라이저에서 데이터베이스 연결을 열면(예: 데이터베이스 존재 여부 확인 또는 데이터베이스 쿼리 실행),
db:drop 및 db:test:prepare와 같은 태스크가 실패합니다.
활성 세션이 데이터베이스 삭제를 막기 때문입니다.
이를 방지하기 위해:
-
clear_active_connections_again이니셜라이저를 실행하여 초기화 후 활성 데이터베이스 연결이 남아 있지 않도록 합니다. -
라우트에서 데이터베이스 쿼리를 허용하지 않습니다. 이니셜라이저는 정적이고 빠르게 동작해야 하며, 쿼리를 실행하면 부트 시간이 느려지고 미묘한 오류가 발생할 수 있습니다.
라우트를 로드하는 중에 데이터베이스 쿼리가 실행되면, 쿼리와 백트레이스가 포함된 경고가 STDOUT에 출력됩니다. 예를 들면:
InitializerConnections Query: SELECT "projects".* FROM "projects" WHERE "projects"."id" = 1 LIMIT 1
InitializerConnections Backtrace: config/routes.rb:15:in `block (2 levels) in <main>'
InitializerConnections Backtrace: config/routes.rb:9:in `block in <main>'
InitializerConnections Backtrace: lib/initializer_connections.rb:18:in `warn_if_database_connection'
InitializerConnections Backtrace: config/routes.rb:6:in `<main>'
See https://docs.gitlab.com/development/rails_initializers/#database-connections-in-initializers