7.1 폴더 구조

소프트웨어는 다음과 같이 네 가지 폴더로 구성된다:

  1. Project 폴더 – 소프트웨어 소스를 포함한다.
  2. Object 폴더 – 소프트웨어 빌드시 생성되는 중간 파일을 포함한다.
  3. Product 폴더 – 소프트웨어 산출물을 포함한다.
  4. Product data 폴더 – 소프트웨어 산출물에 의해 생성되는 데이터 파일을 포함한다.

7.1.1. Project 폴더

Project 폴더는 %PROJECT_ROOT%로 관리하며, 다음과 같은 하위 디렉토리를 포함한다:

Table: Project folder structure

No.폴더내용
1ots산출물에 포함되며, 제3자가 개발한 소프트웨어를 포함한다.
2package산출물에는 포함되지 않으며, 설치 파일을 생성하기 위한 패키지 파일을 포함한다.
소프트웨어는 Inno Setup을 이용하여 설치 파일을 생성한다.
3redist산출물에 포함되며, 재배포용 바이너리를 포함한다.
4resource산출물에 포함되며, 리소스 파일을 포함한다.
5source산출물에 포함되며, 프로젝트에서 개발하는 소프트웨어 소스를 포함한다.
6test산출물에는 포함되지 않으며, 소프트웨어 소스를 테스트하기 위한 프로젝트를 포함한다
7utility산출물에는 포함되지 않지만, 소프트웨어 개발에 유용한 소프트웨어를 포함한다.
8document소프트웨어 개발 문서를 포함한다.

ots 폴더는 ots.sln을 포함하며, 다음과 같은 프로젝트를 포함한다:

Table: ots folder structure

No.폴더내용
1BugslayerUtil소프트웨어 디버깅을 위한 라이브러리. [DEBUGGING APP] 참조
2CppUnitLiteNon-GUI 모듈을 테스트하기 위한 라이브러리
3loki템플릿을 활용한 디자인 패턴 라이브러리. [Modern C++] 참조
4rapidxmlXML 파서

resource 폴더는 다음과 같은 리소스 파일을 포함하며, 다음과 같은 하위 폴더를 가진다:

Table: resource folder structure

No.폴더내용
1setup읽고 쓸 수 있는 리소스 파일을 포함한다.
2nls다국어 문자를 표시를 위한 리소스 파일을 포함한다.
3config읽기만 가능한 리소스 파일을 포함한다.
4probe프로브 리소스 파일을 포함한다.

source 폴더는 다음과 같은 하위 폴더를 가진다:

Table: source folder structure

No.폴더내용
1includeinclude 파일들을 포함한다.
2swa소프트웨어 아키텍처 모듈을 포함한다.
3scannerScanner 소프트웨어 모듈을 포함한다.
4nonscanner환자 관리 모듈, Setup 모듈 등을 포함한다.

utility 폴더는 다음과 같은 하위 폴더를 가진다:

Table: utility folder structure

No.폴더내용
1xls2mcExcel 파일로 정리된 다국어를 프로그램 내에서 사용하기 위한 리소스로 변환한다.

7.1.2. Object 폴더

프로젝트를 빌드하면 생성되는 중간 파일은 %PROJECT_OBJ% 디렉토리로 관리한다.

7.1.3. Product 폴더

프로젝트 빌드의 산출물을 포함하며, %PRODUCT_ROOT%로 관리하며, 다음과 같은 하위 디렉토리를 포함한다:

Table: Product folder structure

No.폴더내용
1binary소프트웨어의 바이너리 파일을 포함한다.
2debug소프트웨어의 디버깅 파일을 포함한다. 소프트웨어 설치 파일에는 포함되지 않는다.
3library소프트웨어의 라이브러리 파일을 포함한다.
4package소프트웨어의 설치 프로그램을 구성하기 위한 파일을 포함한다.
5resource소프트웨어의 리소스 파일을 포함한다. 
6test프로젝트를 테스트하기 위한 프로그램. 소프트웨어 설치 파일에는 포함되지 않는다.

7.1.4. Product data 폴더

Product data 폴더는 소프트웨어 산출물이 실행하며 생성하는 환자 데이터, 사용자가 변경한 setup data, 시스템 로그 등을 포함한다:

Table: Product data folder structure

No.폴더내용
1patient환자 데이터베이스 파일을 포함한다.
2setup사용자가 저장한 setup 정보를 포함한다.
3log로그를 포함한다.
4temp소프트웨어 실행시 생성되는 임시파일을 포함한다.

7.2. 환경변수 설정

소프트웨어는 아키텍처는 소프트웨어 개발 및 실행과 관련된 정보를 관리하기 위해 환경변수를 활용한다.

7.2.1. 기본 환경변수

소프트웨어 아키텍처의 기본 환경변수는 다음과 같다:

Table: Environment variables for general software architecture information

No.환경변수내용
1PRODUCT_NAME프로덕트 이름
2PROJECT_NAME프로젝트 이름.

7.2.2. Product 환경변수

Product 폴더와 관련된 환경변수는 다음과 같다:

Table: Environment variables for product folder

No.환경변수내용
1PRODUCT_ROOT_BASE프로그램이 존재할 상위 폴더. C:\
2PRODUCT_ROOT프로덕트 디렉토리 루트. %PRODUCT_ROOT_BASE%%PRODUCT_NAME%\
3PRODUCT_BIN실행 파일이 존재하는 폴더. %PRODUCT_ROOT%binary\
4PRODUCT_RES실행 파일의 리소스가 존재하는 폴더. %PRODUCT_ROOT%resource\
5PRODUCT_CFGConfig resource folder. %PRODUCT_ROOT%resource\config\
6PRODUCT_STPSetup resource folder. %PRODUCT_ROOT%resource\setup\
7PRODUCT_PRBProbe resource folder. %PRODUCT_ROOT%resource\probe\
8PRODUCT_DBG디버깅 파일 존재하는 폴더. %PRODUCT_ROOT%debug\
9PRODUCT_LIB라이브러리가 존재하는 폴더. %PRODUCT_ROOT%library\
10PRODUCT_TEST테스트 프로그램이 존재하는 폴더. %PRODUCT_ROOT%test\

7.2.3. Product Data 환경변수

Product data 폴더와 관련된 환경변수는 다음과 같다:

Table: Environment variables for product data folder

No.환경변수내용
1PRODUCT__DATA_ROOT사용자 데이터가 존재하는 폴더. %PRODUCT_DATA_ROOT_BASE%%PRODUCT_NAME%Data\
2PRODUCT_PDB환자 DB가 존재하는 폴더. %PRODUCT_DATA_ROOT%patient_db\
3PRODUCT_LOG로그 파일이 존재하는 폴더. %PRODUCT_DATA_ROOT%log\
4PRODUCT_TMP임시 파일이 존재하는 폴더. %PRODUCT_DATA_ROOT%temp\
5PRODUCT_UPRB사용자가 저장한 Probe resource file이 존재하는 폴더. %PRODUCT_DATA_ROOT%probe\
6PRODUCT_USTP사용자가 저장한 Setup resource file이 존재하는 폴더. %PRODUCT_DATA_ROOT%setup\

7.2.4. Project 환경변수

Project 폴더와 관련된 환경변수는 다음과 같다:

Table: Environment variables for project folder

No.환경변수내용
1PROJECT_ROOT_BASE프로젝트의 상위 폴더 이름
2PROJECT_ROOT프로젝트 폴더 이름. %PROJECT_ROOT_BASE%%PROJECT_NAME%\
3PROJECT_DOC설계 문서가 존재하는 폴더. %PROJECT_ROOT%document\
4PROJECT_OTS오픈소스가 존재하는 폴더. %PROJECT_ROOT%ots\
5PROJECT_PKG소프트웨어 패키지 소스 파일이 존재하는 폴더. %PROJECT_ROOT%package\
6PROJECT_REDIST재배포 파일이 존재하는 폴더. %PROJECT_ROOT%redist\
7PROJECT_RES프로젝트 리소스가 존재하는 폴더. %PROJECT_ROOT%resource\
8PROJECT_CFGConfig 리소스가 존재하는 폴더. %PROJECT_ROOT%resource\config\
9PROJECT_STPSetup 리소스가 존재하는 폴더. %PROJECT_ROOT%resource\setup\
10PROJECT_PRBProbe 리소스가 존재하는 폴더. %PROJECT_ROOT%resource\probe\
11PROJECT_SRC프로젝트 소스가 존재하는 폴더. %PROJECT_ROOT%source\
12PROJECT_INC프로젝트 include 파일이 존재하는 폴더. %PROJECT_SRC%include\
13PROJECT_TEST테스트 프로그램 소소가 존재하는 폴더. %PROJECT_ROOT%ttest\
14PROJECT_UTIL유틸리티 프로그램 소스가 존재하는 폴더. %PROJECT_ROOT%utility\

7.2.5. Object 환경변수

Object 폴더와 관련된 환경변수는 다음과 같다:

Table: Environment variables for object folder

No.환경변수내용
1PROJECT_OBJ중간파일이 존재하는 폴더. c:\Objects\%PROJECT_NAME%\

7.3. Batch Files

소프트웨어는 개발과 관련해서 다음과 같은 배치 파일을 제공한다:

  1. de.bat – 환경변수 및 빌드 프로그램 환경변수를 설정한다.
  2. build.bat – 소프트웨어를 빌드한다.
  3. cr.bat – Project 폴더의 resource 폴더를 Product 폴더로 복사한다.
  4. clean.bat – Project 폴더를 정리하기 위해 Project 폴더의 중간 파일을 삭제한다.

7.4. Visual Studio Project Settings

7.4.1. CPP Project

CPP 프로젝트를 폴더 구조에 따라 빌드하기 위해, 다음과 같이 프로젝트 속성(Configuration Properties)을 설정한다:

  1. General에서,
    1. Output Directory를 $(PRODUCT_BIN)으로 설정한다.
    2. Intermediate Directory를 Configuration에 따라 다음과 같이 설정한다:
      • 릴리즈 빌드, $(PROJECT_OBJ)$(SolutionName)\$(ProjectName)\r\
      • 디버그 빌드, $(PROJECT_OBJ)$(SolutionName)\$(ProjectName)\d\
    3. Target Name을 Configuration에 따라 다음과 같이 설정한다:
      • 릴리즈 빌드, $(ProjectName)
      • 디버그 빌드, $(ProjectName)d
  2. C/C++ > General에서,
    1. Additional Include Directories에 $(PROJECT_INC);$(PROJECT_OTS)를 추가한다.
    2. Warning Level를 /W4로 설정한다.
    3. Treat Warnings As Errors를 /WX로 설정한다.
  3. C/C++ > Preprocessor에서,
    1. Configuration Type이 .dll인 경우, Processor Definitions에 프로젝트 이름에 대문자로 표기하고 _EXPORT를 붙인다. (예, SCANNER_EXPORT)
  4. Linker > General에서
    1. Additional Library Directories에 $(PRODUCT_LIB)를 추가한다.
  5. Linker > Debugging에서
    1. Generate Debug Info를 /DEBUG:FULL로 설정한다.
    2. Generate Program Database File를 $(PRODUCT_DBG)$(TargetName).pdb로 설정한다.
    3. Generate Map File을 /MAP으로 설정한다.
    4. Map File Name을 $(PRODUCT_DBG)$(TargetName).map으로 설정한다.
  6. Build Events > Post-Build Event에서
REM if Configuration Type is .dll
if exist $(OutDir)$(TargetName).exp move $(OutDir)$(TargetName).exp $(PRODUCT_LIB)  
if exist $(OutDir)$(TargetName).lib move $(OutDir)$(TargetName).lib $(PRODUCT_LIB)  

REM if there is a resource file, copy it to the resource folder
if not exist $(PRODUCT_CFG)$(ProjectName)  mkdir $(PRODUCT_CFG)$(ProjectName) copy *.xml $(PRODUCT_CFG)$(ProjectName)\
    REM if Configuration Type is .exe
    REM if there is a resource file, copy it to the resource folder

    if not exist $(PRODUCT_CFG)$(ProjectName)  mkdir $(PRODUCT_CFG)$(ProjectName) copy *.xml $(PRODUCT_CFG)$(ProjectName)\

    답글 남기기

    이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다