Windows환경 INI 설정 파일 활용

반응형

INI(Initialization) 파일 포맷은 설정 파일에 대한 사실상 표준이다.

다른 포맷으로 xml, json, yaml도 있지만 windows 환경에서는 ini에 대한 WIN API가 제공되므로 간단한 내용이면 ini를 사용하면 된다.

 

1. 요구사항

  1. 설정 파일 경로에 설정파일이 없으면 프로그램에 내장된 기본값으로 설정파일을 생성할 것(손상시 복구기능 포함)
  2. 프로그램 구동중에도 동적으로 변경된 설정파일의 내용을 적용할 수 있을 것
  3. 설정값의 추가/삭제에도 관련 코드 수정이 최소화 되도록 인터페이스화 할 것 

샘플 설정 파일 내용

2. ini 파일 포맷 및 관련 WIN API

ini 파일은 SECTION, KEY NAME, KEY VALUE로 구분된다. 샘플 파일에서 [SERVER], [PATH], [TASK_OHLCV]는 SECTION이고

'=' 문자가 포함된 줄은 KEY이다. 

'=' 문자를 중심으로 KEY NAME과 KEY VALUE가 구분된다. 

 

WIN API는 아래 세개를 사용한다.

AppName: SECTION

KeyName: '=' 문자 앞 문자열

Default: KEY가 존재하지 않을 경우의 기본 값

FileName: 설정파일 경로(드라이브명부터 전체 경로)

BOOL WritePrivateProfileString
UINT GetPrivateProfileInt
DWORD GetPrivateProfileString

3. 구현전략

  • In-Memory DB역할을 하는 DataStore 클래스에 DataStoreConfig 클래스를 추가한다.
  • DataStoreConfig 클래스에 설정파일의 각 SECTION에 대응하는 Structure를 정의한다. 
  • 설정값 읽기/쓰기시 Structure Field를 하드코딩하지 않고 별도 Mapping Table 활용하여 Pointer로 접근하는 인터페이스 생성

 

4. 예제코드

  • DataStoreConfig.h

설정파일의 경로는 실행파일기준으로 ./config/setting.ini로 정했다.

서비스포트 기본값을 상수로 선언했다.

SECTION [SERVER], [PATH]에 대응하는 구조체를 정의했다. 구조체의 필드는 KEY에 대응한다.

Mapping Table 생성을 위한 enum class와 struct를 정의했다. 

enum은 설정파일에 기술될 KEY와 1:1 대응되어야 한다.

_DS_PROFILE의 필드 속성은 다음과 같다. 

const BOOL boIsInt; : 숫자인지 문자인지
BOOL boNeedToSaveChanges; : 동적으로 변경된 KEY VALUE를 프로그램 종료 전 설정파일에 update 할지 여부
BOOL boFromConfigFile; : 설정파일로부터 읽힌 값인지 프로그램 내장 기본 값인지 여부
const TCHAR tchAppName[32]; : SECTION NAME
const TCHAR tchKeyName[32]; : KEY NAME
const TCHAR tchDefault[64]; : Default KEY VALUE(문자열일 경우 사용)
const INT iDefault; : Default KEY VALUE(숫자일 경우 사용)
TCHAR tchReturnedString[64]; : 설정파일에서 읽은 문자열(GetPrivateProfileString 사용시)
INT iReturnedInt; : 설정파일에서 읽은 숫자(GetPrivateProfileInt 사용시)
LPVOID lpVar; : 설정값에 대응하는 구조체 인스턴스 필드의 주소 포인터
size_t sizeof_lpVar; : 구조체 인스턴스 필드의 메모리 할당 사이즈

 

void vInitDefaultConfig(void); : 설정파일 접근 전 Static Default 값을 Structure에 쓰기 작업
void vCreateDefaultConfigFile(void); : 설정파일이 없으면 Default 값으로 설정파일 생성
void vLoadConfigFromFile(void); : 설정파일이 있으면 설정값 메모리 로딩
void vDumpDsConfStructures(void); : Structure 각 필드값 출력(디버깅용)

Mapping Table에 각 SECTION:KEY, Default VALUE, 등 초기화

 

  • DataStoreConfig.cpp

생성자. 기본값 메모리 로딩 후 GetModuleFileName()으로 현재 경로를 얻고 \config\setting.ini 존재여부 체크 후 존재하지 않으면 기본 설정파일 생성 후 리턴, 존재하면 설정파일에서 설정값 로딩.

 

Mapping Table 사용으로 SECTION 및 KEY 추가/삭제 여부와 관계없이 아래 구현부 코드는 변경할 필요 없음.

 

settings.ini 미 존재(초기 실행)
settings.ini 존재시

 

반응형