환경 변수를 사용하지 않는 4가지 이유

환경 변수는 소프트웨어를 구성하는 간단한 방법입니다. 실행하는 모든 프로세스가 제공된 값을 사용할 수 있도록 셸에서 변수를 설정할 수 있습니다.

이것은 CLI 도구에 매우 유용하지만 복잡한 소프트웨어의 구성을 관리하는 데 사용해서는 안 됩니다.

그 이유를 이해하려면 구성에 환경 변수를 사용하는 것의 단점을 살펴봐야 합니다.



1. 모든 유형은 문자열에서 구문 분석되어야 합니다.



환경 변수는 항상 문자열로 설정됩니다. 즉, 소프트웨어에서 다른 유형으로 설정해야 하는 모든 값은 문자열에서 구문 분석해야 합니다.

예를 들어 파이썬에서 환경 변수 "FOO"의 정수를 원하면 다음 코드를 실행해야 합니다.

import os
foo = int(os.environ['FOO'])




이를 위해서는 프로그래밍 언어가 문자열을 적절한 데이터 유형으로 구문 분석하는 방법에 대한 이해가 필요하며 기본 데이터 구조를 직접 사용하는 것보다 훨씬 더 많은 테스트가 필요합니다. 이 문제는 파일을 포함하도록 확장됩니다.

ssh 키 또는 ssl 인증서와 같은 파일을 구성하려는 경우 환경 변수를 사용하여 구성하면 줄바꿈 및 형식 지정으로 인해 매우 복잡해질 수 있습니다.

2. 중첩 또는 내장 구조 없음



환경 변수는 전역 값이므로 이름 충돌이 있을 수 있습니다. 예를 들어 여러 다운스트림 서비스에 대해 "URL"을 설정해야 하는 경우 다음과 같은 충돌을 방지하기 위해 접두사를 추가해야 합니다.

FOO_URL=x.com
BAR_URL=y.com


이러한 구조의 결여는 주의하지 않으면 다른 서비스나 기능과 의도치 않게 겹칠 수 있는 긴 이름으로 이어집니다.

또한 구성 값의 캡슐화 및 그룹화를 방지합니다. 대신 JSON 또는 YAML과 같은 구조화된 데이터를 사용하면 구성의 상위 구조에 대해 걱정할 필요 없이 키 그룹을 통과할 수 있습니다.

3. 프로세스 내 전역 액세스



우수한 소프트웨어 엔지니어링은 글로벌 상태 사용을 최소화하여 코드를 쉽게 테스트하고 추적할 수 있도록 합니다. 환경 변수는 그렇지 않습니다. 환경 변수는 전역 상태의 사용을 적극적으로 권장하고 어디에서나 값을 쉽게 가져올 수 있도록 합니다. 코드가 깊을수록 구성을 주입하고 테스트를 실행하기가 더 어려워집니다.

import os

def a():
    foo = int(os.environ['FOO'])
    return foo * 42

def b(foo):
    return foo * 42


위의 Python 예제에서 함수 "a"는 함수 "b"보다 테스트하기가 훨씬 더 어렵습니다. 순수한 기능에서 구성 관리를 분리했기 때문입니다. 이것은 환경 변수를 피한다고 사라지지는 않지만 제 경험상 기여 요인입니다.

4. 런타임에 설정해야 함



애플리케이션을 실행하기 전에 프로세스에서 환경 변수를 설정해야 합니다. 이로 인해 프로세스 시작 및 관리가 더욱 복잡해집니다. 파일에서 구성을 가져오는 Python 애플리케이션을 실행하는 경우 추가 셸 명령이 필요하지 않습니다.

python app.py


그러나 환경 변수를 설정해야 하는 경우 환경의 특정 셸에 스크립트로 작성해야 합니다.

FOO=BAR && python3 app.py


요약



환경 변수는 구성을 위한 소프트웨어 관리를 시작하는 좋은 방법이지만 모든 복잡한 소프트웨어는 환경 변수 사용을 JSON 또는 YAML과 같은 파일 기반 구성으로 대체해야 합니다.

이렇게 하면 구성 관리가 더 간단해지고 유형, 테스트 및 프로세스 관리의 보다 성숙한 구현이 가능합니다.

구성 파일을 구현하는 방법에 대한 한 가지 예는 How to Use Feature Flags을 참조하십시오.

이와 같은 더 많은 내용을 보려면 다음을 따르거나 저에게 연락하십시오.
  • 트위터:
  • 이메일: [email protected]
  • 웹사이트: torvo.com.au
  • 좋은 웹페이지 즐겨찾기