• 2020. 7. 31.

    by. 윈썸지니

    반응형

    출처 : pixabay

    프로그램 작성시 일부 값들을 따로 외부 파일로 관리하면 좋은 경우가 있습니다.

    아래와 같은 경우들 입니다.

     

    1.  여러 프로그램에서 공통 사용하는 값

    2.  자주 변경 되는 값

    3.  동작 환경이 다를 경우 필요로 하는 값

     

    위의 내용 외에 추가로 더 있을 수 있지만 지금 생각나는 것은 이정도 이네요.

     

    만약 접속 계정 ID를 여러 프로그램에서 같은 ID를 사용한다고 가정합니다.

    프로그램 A.py, B.py, C.py 에서 같은 ID로 접속을 해서 정보를 조화하는 프로그램 이라고 가정합니다.

     

    이때 ID 가 변경이 되면 A, B, C 프로그램을 모두 변경해 주어야 합니다. 사용되는 ID를 모두 찾아서 변경해 주어야 될 수도 있습니다.

    이럴 경우 외부 파일에 따로 관리를 한다면 따로 관리하는 파일만 수정하면 3개의 프로그램에 모두 반영이 됩니다.

     

    손쉽게 반영이 될 뿐만 아니라, 프로그램을 모르는 사람이 변경을 해도 됩니다.

    또한 변경 사항이 적어서 오류 발생 확률도 낮아 집니다.

     

    또 예를 들면 IP 또는 port 등의 정보를 관리하면  A 시스템 환경, B 시스템 환경 등이 다릅니다.

    이때 소스 수정 없이  동작 환경에 맞도록 설정 파일만 수정해 주면 프로그램이 동작을 하므로 편리합니다.

    파이썬의 경우는 컴파일 과정이 필요 없지만 만약 컴파일 과정이 필요한 언어라면 소스 수정 후 컴파일 과정까지 거쳐야 하는 번거로움이 있습니다.

     

    여러 이점이 있으므로 설정 값을 다른 파일로 따로 관리하여 보통 개발 합니다.

    이런 파일을 환경 설정 파일이라고 합니다.

    환경 설정 파일은 대부분 파일의 확장자를  .ini   .cfg   .conf 등으로 많이 사용합니다.

     

    보통 환경 설정 파일로 관리 하는 값들은 아래와 같은 내역들을 예로 들 수 있습니다.

    물론 민감 정보는 암호화 해야 하는데 암호화는 다음에 다룰 예정 입니다.

     

    계정정보 ( 계정명, 패스워드 ), Ipaddress, Port, E-Mail ID, 로그 파일 정보( 로그 파일명, 로그레벨 , 로그파일 유지 기간 등 ), DB 접속 정보( DB ,  계정명, 패스워드) 등이 있을 수 있습니다.

    어디까지나 예 이므로 필요한 값들을 관리하면 됩니다.

     

    서론이 너무 길었네요.

    이제 본론으로 들어가서  프로그램 개발시 이런  환경 파일을 많이 사용하므로 파이썬에서는 ConfigParser 라는 모듈을 제공합니다.

     

    예전 C 프로그램을 할 때는 일일이 파싱하여 사용하였는데 파이썬은 이런 모듈도 제공을 해 주니 편하고 쉽습니다.

    개발 속도도 빨라지고 파이썬 짱! 입니다.

     

    configpaser 사용 법을 알아봅니다. python 3.x 버전 부터 가능합니다.

     

    configparser 는 내장 모듈이라 따로 설치를 하지 않아도 import 가능 합니다. ( python 3.8.2 에서 테스트 했습니다.)

     

    먼저 환경 설정 파일을 작성합니다. 메모장 또는 에디터로 작성합니다.

    테스트를 위해서 아래와 같이 작성합니다.

     

    환경 설정 파일 예 : config.ini

    [LOG]                                              #   section 부분을 정의합니다.

    LOG_LEVEL = ERROR                   #  옵션 부분입니다.

    LOG_FILES = 10

    [DB_INFO]

    DB_NAME = ORA_DB

    DB_ID = admin

    DB_pw = abcd123

    DB_IP = 192.168.100.100

    DB_PORT = 1521

    참고로 설정 파일의 주석처리도 가능하여 파이썬과 동일하게 # 으로 처리 하면 됩니다.

     

    IDLE 인터프리터 창으로 실행해 봅니다. 명령창에서 python 으로 실행 해도 됩니다.

    아래 3 라인은 기본적인  구문입니다.

    >>> import configparser                                                        # 모듈 import

    >>> config = configparser.ConfigParser()                           # config 로 객체 생성

    >>> config.read('c:\py_test\Config\Config.ini’)                # 환경 설정 파일 읽기

    ['c:\\py_test\\Config\\Config.ini’]

     

    설정 파일에서 LOG 섹션의 LOG_LEVEL 의 설정 값을 가져오는 방법입니다.

    다른 방법으로 get() 함수를 사용 할 수도 있습니다. 아래 예제에 있습니다.

    >>> log_level = config["LOG"]["LOG_LEVEL"]

    >>> print( log_level)

    ERROR

     

    이번에는 숫자로 설정된 값을 가져와 봅니다. 숫자로 가져오는지를 알기 위해 %d 를 이용하여 출력해 보았는데 오류가 발생합니다.

    기본적으로 설정 값을 가져 올 때는 문자열로 가져옵니다.

    >>> log_files = config["LOG"]["LOG_FILES"]                     # LOG_FILES 설정 값 가져오기

    >>> print( "로그 파일 수 %d" % log_files )                       # 숫자 이므로 숫자로 출력해 보기

    Traceback (most recent call last):                                       # 주의 할 것은 기본적으로 문자열로 가져옵니다.

      File "<pyshell#14>", line 1, in <module>

        print( "로그 파일 수 %d" % log_files )

    TypeError: %d format: a number is required, not str

    >>> print ( "로그 파일 수 %s" % log_files )

    로그 파일 수 10

     

    다른 방법인 get 함수를 사용하여 설정 값을 가져 올 수 도 있습니다.

    >>> config.get( "LOG", "LOG_FILES" )                               # 설정 값 가져오는 다른 방법

    '10'

    >>> cpnfig.getint( "LOG", "LOG_FILES")

    Traceback (most recent call last):

      File "<pyshell#17>", line 1, in <module>

        cpnfig.getint( "LOG", "LOG_FILES")

    NameError: name 'cpnfig' is not defined

     

    아래는 숫자로 되어 있는 설정 값은 getint() 함수를 사용하여 가져 옵니다.

    getint, getfloat, getboolean을 지원하므로 자료형에 따라 적절한 함수를 사용합니다. 이렇게 하면 따로 형 변환 할 필요가 없습니다.

    >>> config.getint( "LOG", "LOG_FILES" )

    10

     

    환경 설정 파일의 section 정보를 리스트 형태로 모두 가져 옵니다.

    >>> config.sections()

    ['LOG', 'DB_INFO']

    >>>

     

    환경 설정 파일의 해당 section의 옵션 정보를 리스트 형태로 모두 가져 옵니다.

    옵션명만 가져 옵니다. 값까지 가져 올 때는 items 을 사용합니다.

    >>> config.options("DB_INFO")

    ['db_name', 'db_id', 'db_pw', 'db_ip', 'db_port’]

    >>> config.items("DB_INFO")

    [('db_name', 'ORA_DB'), ('db_id', 'admin'), ('db_pw', 'abcd123'), ('db_ip', '192.168.100.100'), ('db_port', '1521’)]

    설정 파일에서 section 이 있는지 확인합니다. 리컨 값은 Boolean 형태 입니다.

    >>> config.has_section("DB_INFO")

    True

    >>> config.has_section("AAA")

    False

    >>>

     

    환경 설정 파일을 파이썬 코드로도 관리 할 수 있는 함수들을 제공합니다.

    add_section(), remove_section(), set(), remove_option() 등이 있으며 파일을 변경하는 것이므로 반드시 파일 write() 함수를 사용하여 꼭 저장해야 합니다.

     

    이상으로 외부 파일을 통한 환경 설정 값 관리에 대해 알아보았습니다.

    반응형