본문 바로가기

IT 살이/04. 기술 - 프로그래밍

ClickOnce 어플리케이션의 파일 관리(Ⅰ)

ClickOnce 어플리케이션은 여러 종류의 파일로 구성됩니다. 이 연재에서는 ClickOnce가 이런 파일을 관리하기 위해서 어떤 서비스를 제공하는지 그리고 프로그램적으로 어떻게 관리할 수 있는지 등에 대해서 알아봅니다. 보통 ClickOnce 어플리케이션은 다음과 같은 파일로 구성됩니다.

- 어플리케이션 어셈블리 파일과 데이터 파일들

- 어플리케이션 매니페스트 파일( .exe.manifest) : 구성 파일과 필요한 권한 정보 포함

- 배포 매니페스트(.application) : 업데이트 정책, 업데이트 위치 포함

그리고 앞의 파일들을 서명하기 위해서 필요한 인증서가 있지만 인증서는 어플리케이션에서 관리할 수 있는 파일이 아니기에 파일 관리 대상에서는 제외됩니다. 

ClickOnce에 포함될 수 있는 파일을 종류별로 보자면 상황에 따라서 불특정 타입의 파일들이 포함될 수 있습니다. 이미지 파일, XML 파일, 상용 컨트롤 파일 등 어플리케이션마다 전혀 다른 종류의 파일들이 포함될 수 있습니다.

ClickOnce가 이런 어플리케이션 구성 파일들을 클라이언트 머신으로 다운로드해서 어느 디렉토리로 캐싱하느냐는 미리 결정할 수 없습니다. 우리가 사전에 알 수 있는 것은 사용자 프로파일 디렉토리 하위로 다운된다는 것 뿐입니다.

이런 상황에서 클라이언트에 설치된 후 동적으로 파일을 읽어들이거나 또는 어셈블리를 동적으로 로딩시키는 기능을 어플리케이션에 추가하려고 한다면 어떻게 해야 할까요. 어플리케이션의 완성도나 유연성을 높이려고 한다면 디렉토리에 캐싱되어 있는 데이터 파일을 직접 읽어들여야 하는 경우도 있을 수 있고 때로는 어셈블리를 동적으로 로딩해야 하는 상황도 자주 발생하게 됩니다.

ClickOnce는 이런 경우에 대처할 수 있는 방안들을 제공하고 있고 이런 해결책을 습득하는 것이 이 연재의 목표입니다. 디렉토리에 저장되어 있는 파일에 직접 접근하기 위해서는 ClickOnce가 파일을 어떤 디렉토리 구조로 관리하는지를 먼저 이해하고 그런 다음 파일에 접근할 수 있도록 어떤 API들을 제공하는지를 확인할 필요가 있습니다.

어셈블리 파일들을 포함하여 리소스, 데이터 파일을 얼마나 자유자재로 다룰 수 있느냐는 .NET 어플리케이션의 고급스러움을 결정하는데 중요한 요소가 되는 경우가 많습니다. ClickOnce 어플리케이션은 .NET의 파일 관리 기술을 그대로 사용할 수 있으면서도 ClickOnce 어플리케이션에서만 사용할 수 있는 기능도 있습니다. .NET과 ClickOnce에서 제공하는 파일 관리 개념과 서비스를 충분히 이해하고 익힐 수 있도록 해야할 것입니다.

1.1 구성 파일 속성 편집

게시 탭 페이지의 "응용 프로그램 파일..." 버튼을 클릭하게 되면 ClickOnce로 배포될 파일 목록을 편집할 수 있는 창이 뜨게 됩니다. 기본적으로 실행 프로젝트에 포함된 파일들이 포함되어 있습니다. 선택적으로 파일들을 배포 목록에서 제거하도록 설정할 수도 있습니다. 그러나 이곳에서 배포할 파일을 추가할 수는 없습니다. ClickOnce 배포에 파일을 추가하는 방법에 대해서는 별도로 설명합니다.

 1378124003

그림 어플리케이션 구성 파일 편집 창

1.1.1 게시 상태” 속성

“응용 프로그램 파일”창을 띄우면 게시할 프로젝트에 참조되거나 포함된 파일 목록들이 기본적으로 출력됩니다. 각 파일은 “게시 상태”와 “다운로드 그룹”이라는 속성을 설정할 수 있습니다.

ClickOnce는 게시 상태라는 속성값에 따라서 해당 파일을 데이터 파일로 간주할 것인가 또는 일반 파일로 간주할 것인가를 결정합니다. ClickOnce에서는 데이터 파일과 다른 일반 파일을 클라이언트에서 저장하는 장소를 달리하고 있고 접근할 수 있는 방법도 다르게 제공하고 있습니다. 따라서 이 컬럼 값을 결정하는 일은 중요한 작업입니다. 이 컬럼값으로 선택할 수 있는 값은 몇가지 더 있습니다.

- 포함/포함(자동)

- 데이터파일/데이터 파일(자동)

- 필수구성요소

- 제외

Visual Studio는 파일의 확장자를 기반으로 해서 해당 파일의 기본적인 게시 상태를 결정합니다. 예를 들어 .xml 파일은 게시 상태값을 자동적으로 “데이터 파일”로 설정합니다. “(자동)”이라는 접미사가 붙은 값은 이처럼 Visual Studio가 확장자를 기반으로해서 기본적으로 선택했음을 의미합니다. 자동으로 설정된 값을 다른 값으로 변경할 수도 있습니다. 예를 들어 .txt 파일은 기본적으로 “포함(자동)”으로 설정되지만 이 파일을 데이터 파일로 설정할 수도 있습니다.

“필수구성요소”라는 값은 게시에 포함되는 파일이 참조에 의한 어셈블리인 경우에 선택할 수 있는 값중의 하나로 나타납니다. 만약 기본적으로 선택되어 있는 “포함(자동)”을 “필수 구성 요소”로 변경하면 “이 어셈블리는 클라이언트 머신의 GAC(Global Assembly Cache)에 등록이 되어 있을 것입니다”라는 표현이 되고 해당 어셈블리는 배포에서 제외됩니다.

마지막으로 “제외”를 선택하면 말 그대로 해당 파일은 배포에서 제외됩니다. 해당 파일이 서버에 존재하고 그것을 동적으로 로딩해야 하는 경우에 이런 선택을 할 수 있을 것입니다.

구성 파일 편집 창을 보면 “다운로드 그룹”이라는 컬럼도 있습니다. 이 속성 값을 사용해서 어플리케이션을 구성하는 파일들을 그룹별로 나눌수가 있습니다. 그래서 나중에 프로그램적인 방법으로 파일들을 그룹 단위로 다운로드할 수가 있습니다.

파일을 배포 목록에 포함시켰을 때 기본적으로 게시 상태가 “포함” 또는 “데이터”로 되어 있는 파일은 기본적으로 “(필수)”라는 그룹으로 분리됩니다. 이렇게 “(필수)”로 분리된 파일은 어플리케이션이 클라이언트에서 설치되거나 또는 업데이트될 때 자동으로 다운로드됩니다. 게시 상태가 “데이터 파일”로 되어 있는 것은 그룹을 변경할 수 없습니다. “포함”으로 되어 있는 파일들만 그룹명을 변경할 수 있습니다.

사용자 정의의 다운로드 그룹명을 부여한 파일들은 초기 설치나 업데이트의 과정에서 다운로드되지 않습니다. 뒤에서 설명할 다운로드 API들을 사용해서 프로그램적으로 직접 다운로드해야 합니다. 파일을 그룹으로 분류하고 사용자의 요청에 따라서 실시간으로 파일들을 그룹별로 다운로드하는 방법은 뒤에서 다룹니다.

1.1.2 파일 그룹핑하기

ClickOnce로 배포될 파일들을 그룹별로 분리하는 파일의 그룹을 분리하는 방법은 “포함”으로 설정된 파일의 다운로드 그룹의 컬럼을 선택하면 “(새로 만들기…)”라는 항목이 있습니다. 직접 컬럼 값으로 그룹 이름을 나타내는 텍스트를 입력하면 됩니다.

 1207714558

그림 다운로드 그룹 추가

새로 추가한 다운로드 그룹명은 컬럼의 드롭다운 리스트에 출력되어 선택할 수 있게 됩니다. 이렇게 하면 같은 그룹 이름을 갖는 파일들끼리 분리할 수가 있게 됩니다.

이렇게 “다운로드 그룹” 속성을 “(필수)”가 아닌 사용자 정의 값으로 설정한 파일들은 앞에서 말한 대로 어플리케이션을 초기 설치하거나 업데이트 설치할때는 다운로드되지 않습니다. 대신에 프로그램적으로 직접 다운로드해야 합니다.

1.1.3 ClickOnce 구성 파일 분류

ClickOnce에서는 어플리케이션을 구성하는 파일중에서 데이터 파일(data files)은 일반 구성 파일과는 다르게 취급합니다. 앞에서 말한것처럼 특정 확장자의 파일을 데이터 파일로 확정해서 분류하는 것은 아닙니다. 같은 파일을 데이터 파일로 취급할 수 있지만 다른 어플리케이션에서는 일반 파일로 분류할 수 있습니다.

흔히 사람들이 말할때는 어플리케이션의 상태 정보를 가지고 있거나 또는 값이 변경될 수 있는 정보를 가지고 있으면서 어플리케이션이 종료되고 다시 시작될때에도 그 값을 여전히 보존하고 있는 파일들을 데이터 파일로 취급합니다. 그러나 ClickOnce 입장에서는 게시를 할 때 게시 상태 컬럼값이 “데이터 파일”로 설정된 것만을 데이터 파일로 간주해서 별도의 관리 메커니즘을 사용합니다.

이 연재에서도 어플리케이션을 구성하는 파일을 게시 상태값에 따라 두 부류로 구분해서 설명합니다.

- 어플리케이션 파일

- 데이터 파일

특별한 부연 설명없이 “어플리케이션 구성 파일”이라고 하면 데이터 파일을 제외한 일반 구성 파일이라는 의미로 사용하겠습니다.