Rails 초기화자
Rails 프로세스가 시작될 때 초기화자가 실행됩니다. 즉, 초기화자는 매 배포 시에도 실행됩니다.
기본적으로 Rails는 config/initializers
에 있는 초기화자가 로드된 후에 Zeitwerk를 로드합니다.
Zeitwerk 이전에 autoload되는 것은 현재 사용이 중단되었지만, 초기화자에서 많은 autoload된 상수를 사용하기 때문에 Zeitwerk의 로딩을 이러한 초기화자보다 빨리 이동해야 했습니다.
이로 인해 초기화자 안에서 config.autoload_paths
가 이미 동결된 상태입니다.
Zeitwerk이 로드되기 전에 초기화자를 실행하려면 이를 config/initializers_before_autoloader
에 넣어야 합니다.
이 폴더의 루비 파일은 기본 Rails 초기화자와 마찬가지로 알파벳순으로 로드됩니다.
다음과 같은 경우에 이를 수행해야 하는 몇 가지 예시는 다음과 같습니다:
- Rails의
config.autoload_paths
수정 - 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>'