- 이번 장 예제 코드의 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"}}}
- 002: 이 컨테이너의 이미지에는 기본 설정이 담긴 설정 파일 하나가 포함돼 있다. 그러나 이 설정은 실제 환경에서 사용되는 설정이 아니다.
-
006: 이 설정은 모든 환경에 공통적으로 사용되지만 버전에 따라 달라지는 설정값이다. 환경 정보의 "UNKNOWN"을 보고 이 설정이 불완전하다는 것을 알 수 있다.
-
설정 API는 현재 설정 내용이 담긴 JSON 문자열을 반환하기에 민감한 데이터를 보호하면서도 설정을 디버깅하기 쉽다.
- 다만 설정 API를 만들 때는 다음과 같은 사항을 지켜야 한다.
- 민감하지 않은 정보만 선택하되 민감한 정보는 절대 포함시키지 않는다.
- 허가받은 사용자만이 접근할 수 있도록 엔드포인트에 보안을 설정한다.
- 설정 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"}}}
- 003: 설정 오버라이드가 적용된 컨테이너 Node.js 애플리케이션과 마찬가지로 기본 설정 파일과 오버라이드 설정 파일을 병합해 설정을 구성한다.
- 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"}}}
- 004: Go 애플리케이션 역시 환경 변수를 이용한 설정 오버라이드가 가능하다. 하지만 환경 변수 이름 앞에 이 애플리케이션을 나타내는 접두사 IG를 붙여야 한다.
-
011: 기본 설정 파일과 오버라이드 파일, 환경 변수를 합쳐 설정을 완성했다.
-
바이퍼의 설정에 사용되는 환경 변수의 이름을 지을 때는 다른 애플리케이션 환경 변수와의 충돌을 피하기 위해 IG라는 접두사를 붙이는 관습이 있다.