Config.Provider behaviour
Config.Provider behaviour
시스템이 부팅되는 동안 설정을 로드하는 프로바이더 API 를 정의하는 behaviour예요. 릴리스(release)로 배포할 때 외부 설정을 읽어들이는 데 주로 쓰여요. 동작 원리를 먼저 짧게 정리하면 이래요 — 최소한의 애플리케이션만 띄운 채 VM을 시작하고, 모든 프로바이더를 호출한 뒤 시스템을 재시작합니다. 프로바이더의 결과가 파일 시스템에 쓰이기 때문에 디스크에 쓰기 가능한(mutable) 설정 파일이 필요해요.
본문
런타임 설정에 대해 더 자세히 알고 싶다면 mix release 문서를 참고하세요.
여러 설정 파일(Multiple config files)
설정 프로바이더의 흔한 용도 하나는 릴리스에서 여러 설정 파일을 지정하는 거예요. Elixir에는 Config.Reader라는 프로바이더가 기본으로 포함되어 있는데, Elixir 내장 설정 파일을 다룰 수 있어요.
예를 들어, 기본 설정 일부는 Mix 내장 config/runtime.exs 파일에 두면서 추가 설정 파일도 지원하고 싶다고 해 봅시다. 그럴 때는 mix.exs의 def project 부분 안에 이렇게 추가하면 돼요.
releases: [
demo: [
config_providers: [
{Config.Reader, {:system, "RELEASE_ROOT", "/extra_config.exs"}}
]
]
]
이 extra_config.exs 파일을 릴리스에 넣는 방법은 여러 가지예요.
- 릴리스를 조립할 때 호스트에 파일이 있다면,
rel/overlays/extra_config.exs에 두면 릴리스 루트로 자동 복사돼요. - 배포 시점에 대상 컴퓨터(target)에 파일이 있다면, 배포 과정의 한 단계로 릴리스 루트에 그냥 복사하면 됩니다.
이제 시스템이 부팅되면 부팅 과정 초반에 config/runtime.exs와 extra_config.exs를 모두 로드해요. 더 많은 옵션은 Config.Reader에서 확인할 수 있어요.
커스텀 설정 프로바이더(Custom config provider)
Config.Reader가 동작하는 방식과 비슷하게 커스텀 설정 프로바이더도 직접 구현할 수 있어요. 예를 들어 어떤 설정을 JSON 파일에서 읽어 시스템에 로드해야 한다고 해 봅시다. 그런 설정 프로바이더는 이렇게 생겼을 거예요.
defmodule JSONConfigProvider do
@behaviour Config.Provider
# Let's pass the path to the JSON file as config
@impl true
def init(path) when is_binary(path), do: path
@impl true
def load(config, path) do
# We need to start any app we may depend on.
{:ok, _} = Application.ensure_all_started(:jason)
json = path |> File.read!() |> Jason.decode!()
Config.Reader.merge(
config,
my_app: [
some_value: json["my_app_some_value"],
another_value: json["my_app_another_value"],
]
)
end
end
그리고 릴리스를 지정할 때, 릴리스 설정에서 이 프로바이더를 지정하면 돼요.
releases: [
demo: [
config_providers: [
{JSONConfigProvider, "/etc/config.json"}
]
]
]
Summary(요약)
Types
config()config_path()— 설정 파일을 가리키는 경로init_opts()—init/3의 옵션state()
Callbacks
init(term)— 설정 프로바이더를 초기화할 때 호출돼요.load(config, state)— 설정을 로드해요(주로 시스템 부팅 시 호출).
Functions
resolve_config_path!(path)—config_path/0를 실제 경로로 변환해요.validate_config_path!(path)—config_path/0를 검증해요.