INI(Initialization) 파일 포맷은 설정 파일에 대한 사실상 표준이다.
다른 포맷으로 xml, json, yaml도 있지만 windows 환경에서는 ini에 대한 WIN API가 제공되므로 간단한 내용이면 ini를 사용하면 된다.
1. 요구사항
- 설정 파일 경로에 설정파일이 없으면 프로그램에 내장된 기본값으로 설정파일을 생성할 것(손상시 복구기능 포함)
- 프로그램 구동중에도 동적으로 변경된 설정파일의 내용을 적용할 수 있을 것
- 설정값의 추가/삭제에도 관련 코드 수정이 최소화 되도록 인터페이스화 할 것
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: 설정파일 경로(드라이브명부터 전체 경로)
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 추가/삭제 여부와 관계없이 아래 구현부 코드는 변경할 필요 없음.
'프로그래밍 > C | C++' 카테고리의 다른 글
Auto Lock/Unlock for Thread Syncronization (0) | 2023.12.10 |
---|---|
[MFC] MFC 스레드 예제 (0) | 2023.12.10 |
Multiplexing Client Connections-1 (0) | 2023.06.30 |
Network bridge 방식으로 증권사 API 활용하기-2 (0) | 2023.06.21 |
Network bridge 방식으로 증권사 API 활용하기-1 (1) | 2023.06.21 |