18.3.런타임에서 설정 읽어 들이기

  • 이번 장 예제 코드의 image-gallery 애플리케이션에 바이퍼를 적용했다.
  • 다음에서 알 수 있듯이 다른 예제와 비슷한 설정 계층도 적용된 상태다.
  • 이미지에 포함된 config 디렉터리에서 기본 설정 파일을 읽어 들인다.
  • 환경별 설정 파일은 config-override 디렉터리에서 읽어 들이는데, 파일 시스템 마운트로 외부에서 주입된다.
  • 환경 변수는 설정 파일의 설정값을 오버라이드할 수 있다.
  • 바이퍼는 설정 파일 포맷의 선택 범위가 좀 더 넓다.
  • JSON 또는 YAML 등을 사용할 수 있지만, Go 언어에서는 TOML이 널리 쓰인다.

예제 18-1 TOML을 사용해 설정 파일을 쉽게 관리할 수 있다.

release = "19.12"
environment = "UNKNOWN"

[metrics]
enabled = true

[apis]

 [apis.image]
 url = "http://iotd/image"

 [apis.access]
 url = "http://accesslog/access-log"
  • TOML은 특히 클라우드 기반 프로젝트에서 널리 사용되는데, 다른 포맷에 비해 클라우드 환경에서 장점이 더 크기 때문이다.
  • 또한, 가독성이 좋다는 점은 디버깅이 쉬우며 병합 도구를 이용해 버전별 설정의 차이를 확인하기 쉽다는 뜻이기도 하다.

실습 기본 설정을 확인할 수 있도록 설정 변경 없이 애플리케이션을 실행하라.

001) # 컨테이너 실행
002)  docker container run -dp 8086:80 diamol/ch18-image-gallery
003) 
004) # 설정 API 호출
005)  curl http://localhost:8086/config
006) {"Release":"19.12","Environment":"UNKNOWN","Metrics":{"Enabled":true},"Apis":{"access":{"Url":"http://accesslog/access-log"},"image":{"Url":"http://iotd/image"}}}
  1. 002: 이 컨테이너의 이미지에는 기본 설정이 담긴 설정 파일 하나가 포함돼 있다. 그러나 이 설정은 실제 환경에서 사용되는 설정이 아니다.
  2. 006: 이 설정은 모든 환경에 공통적으로 사용되지만 버전에 따라 달라지는 설정값이다. 환경 정보의 "UNKNOWN"을 보고 이 설정이 불완전하다는 것을 알 수 있다.

  3. 설정 API는 현재 설정 내용이 담긴 JSON 문자열을 반환하기에 민감한 데이터를 보호하면서도 설정을 디버깅하기 쉽다.

  4. 다만 설정 API를 만들 때는 다음과 같은 사항을 지켜야 한다.
  5. 민감하지 않은 정보만 선택하되 민감한 정보는 절대 포함시키지 않는다.
  6. 허가받은 사용자만이 접근할 수 있도록 엔드포인트에 보안을 설정한다.
  7. 설정 API의 사용 여부를 설정할 수 있도록 한다.

실습 오버라이드 파일로 완전한 환경별 설정을 구성해 애플리케이션을 실행하라.

  • image-gallery 애플리케이션의 설정은 계층별 설정과는 조금 다른 접근법을 취한다.
  • 기본 설정 파일은 이미지에 포함시키고, 환경별 설정 파일은 외부에서 주입한다.
  • 환경별 설정을 환경별 설정 파일에 정의해 기본 설정 파일의 내용을 확장하거나 오버라이드해 전체 설정을 구성하기 위한 방식이다.
001)  cd ch18/exercises/image-gallery
002) 
003)  docker container run -dp 8087:80 \
004)   -v "$(pwd)/config/dev:/app/config-override" \
005)   diamol/ch18-image-gallery
006) 7ef6bf4216a64216944efb008c386bcf70c4ea9b37eaf48070f16382704f72d4
007)  curl http://localhost:8087/config
008) {"Release":"19.12","Environment":"DEV","Metrics":{"Enabled":false},"Apis":{"access":{"Url":"http://accesslog/access-log"},"image":{"Url":"http://iotd/image"}}}
  1. 003: 설정 오버라이드가 적용된 컨테이너 Node.js 애플리케이션과 마찬가지로 기본 설정 파일과 오버라이드 설정 파일을 병합해 설정을 구성한다.
  2. 007~008: 기본 설정 파일에 개발 환경 오버라이드 설정 파일이 병합돼 완전한 개발 환경 설정이 됐다.

실습 환경 변수 오버라이드를 적용해 컨테이너를 실행하라. 이 애플리케이션에서는 이름에 접두사 IG가 붙은 환경 변수만을 설정에 사용한다.

  • 바이퍼 모듈은 환경 변수를 이용해 설정 파일의 설정값을 오버라이드하는 기능을 제공하지만, 세세한 관례는 node-config나 닷넷 코어와 차이가 있다.
001)  cd ch18/exercises/image-gallery
002) 
003) # 환경 변수를 이용한 설정 오버라이드를 적용해 컨테이너를 실행
004)  docker container run -dp 8088:80 \
005)   -v "$(pwd)/config/dev:/app/config-override" \
006)   -e IG_METRICS.ENABLED=TRUE \
007)   diamol/ch18-image-gallery
008) e81a387aac253fa701872c18ae1d2d8d04d870b8bfcb2f50568f53a11b02f1d5
009) 
010)  curl http://localhost:8088/config
011) {"Release":"19.12","Environment":"DEV","Metrics":{"Enabled":true},"Apis":{"access":{"Url":"http://accesslog/access-log"},"image":{"Url":"http://iotd/image"}}}
  1. 004: Go 애플리케이션 역시 환경 변수를 이용한 설정 오버라이드가 가능하다. 하지만 환경 변수 이름 앞에 이 애플리케이션을 나타내는 접두사 IG를 붙여야 한다.
  2. 011: 기본 설정 파일과 오버라이드 파일, 환경 변수를 합쳐 설정을 완성했다.

  3. 바이퍼의 설정에 사용되는 환경 변수의 이름을 지을 때는 다른 애플리케이션 환경 변수와의 충돌을 피하기 위해 IG라는 접두사를 붙이는 관습이 있다.

links

social