블로그 이미지
대갈장군

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Notice

2013. 9. 27. 03:45 프로그래밍/MSDN

http://msdn.microsoft.com/en-us/library/ms953320.aspx


Introduction

Visual Studio 2005에서 새로 추가된 ClickOnce라고 불리는 새로운 윈도우 폼 배포 방식이 있다. 이 방식은 어플리케이션의 설치와 웹 어플리케이션의 업그레이드를 스마트 클라이언트로 가능케 해주는 좋은 친구다. 이 글은 윈도우 폼의 장점과 ClickOnce라고 불리는 녀석에 대해서 자세하고 세세하게 살펴볼 예정이란다.


왜 윈도우 폼인가?

여기서 말하는 윈도우 폼이라 함은 .NET 을 기반으로 작성된 윈도우 폼 어플리케이션을 말한다. 뭐 대표적인 예로는 C#으로 작성된 윈폼이 있겠네. 웹 어플리케이션이 등장한 후로 사람들이 이 웹 어플리케이션에 지대한 관심을 보이는데 그 이유는 단지 '쿨'하다는 이유 말고도 다음과 같은 장점들이 있다.


  • 웹 어플리케이션은 세계 어디서나 언제든지 인터넷 커넥션만 있으면 접근 가능, 또한 실행 가능하다. 심지어는 클라이언트가 윈도우를 운영체제로 사용하지 않아도 상관이 없다. 유비쿼터스 환경을 추구하는 어플리케이션이라면 웹 어플리케이션이 짱!
  • 웹 어플리케이션은 배포와 업뎃이 쉽다. 걍 설치 파일을 서버에 업로드만 해놓으면 사용자들이 설치하면 끄읏! DLL 걱정도 없고 레지스트리 걱정도 없고 COM 클래스 등록 걱정조차도 없다. 걍 돌아간다... 이것이야 말로 프로그래머의 퐌타지!
이 글의 초점은 바로 '배포'에 있다. HTTP 프로토콜을 이용한 웹 어플리케이션의 설치 및 업뎃은 당연히 일반적인 윈도우즈 어플리케이션에 비해 장점이 있다.

하지만... 안타깝게도, 장점만 있는 것은 세상에 없으니 단점도 있다. 
  • 우선 유저 인터페이스가 구리다. 웹 어플리케이션은 일반적인 윈도우즈 어플리케이션이 가지는 드래그 드롭이나 우클릭등 이런게 아예 불가능하거나 지원이 매우 매우 힘들다. 
  • 비록 위의 단점을 해결하기 위해 쿨해보이는 유저 인터페이스나 각종 기능을 추가한다고 하더라도 해당 스크립트를 작성하는 게 절라게 어렵다. 이유는 설명안했지만, 아마도 다양한 클라이언트의 경우를 고려하려면 수 많은 경우를 고려해야 겠지?
  • 아시다시피 서버를 사용하는 중앙 집중형 방식이므로 사용자에게 기다릴 줄아는 참을성을 요구한다. 난 힘들겠는데...
  • 화면에 출력하는 프린팅이 오직 화면 출력만으로 제한된다. 
  • 플러그 인이나 ActiveX 컨트로 때문에 위에서 나열한 문제들이 종합되어 나타난다. 뭐, 그렇지만 이 문제점은 웹 어플리케이션이 아니더라도 나타는 문제점이래요. 이놈의 액티브엑스는 내논 자식이구만.
자, 이제 웹 어플리케이션과 윈도우 어플리케이션을 결혼시키면 어떨까? 물론 장점만 모은 자식이 나오기를 원해서다. 재미 있는 사실은 이미 .NET 프레임워크는 초기 버전에서부터 이 둘을 결혼시켜 놓았다는 점. 

이러한 종류의 어플리케션은 intranet이나 extranet 두가지 모두에 대해서 잘 적용될 수 있으며 클라이언트가 .NET 프레임워크와 인터넷 익스플로러를 가지고 있다는 전제하에 원활하고 수월하게 작동한다.

.NET Framework 1.x : HREFing .EXEs
.NET Framework 버전 1.0과 1.1에서 기본 탑제한 기능으로 윈도우 폼 어플리케이션을 HTTP를 통해 배포하기가 있었다. 기본적으로 이것은 HREF 태크를 사용해 Managed 실행파일을 링크로 걸어주는 것이다. 이렇게 하면 사용자는 인터넷 익스플로러를 이용하면 닷넷 프레임워크가 깔려있다는 전제하에서 실행파일을 다운받아서 설치하는 것 뿐만 아니라 필요한 DLL까지 같이 다운받아 준다. 이러한 형태의 배포를 이른바 'hrefing EXEs' 라고 부른다. HREF 헤더는 HTML 공부를 한 사람이라면 누구나 아는 이른바 '링크' 걸기 태그이다. 즉, 여기 누르면 여기로 연결됩니다 하는 것.

HREF 태그의 예를 보자면,
<a href="MainProject.exe">Call MainProject</a>

완전 HTML 문법과 동일하다. 이 방식은 상당히 쉽고 여러번 다른 글에서 논의된 적이 있는 방법이다. 아래 글 참조.
기본적으로 닷넷 어셈블리 (.exe 파일이나 .dll 파일들)는 배포를 위한 기본 구성요소이기 때문에 프로그래머는 어플리케이션을 여러개의 DLL과 한개의 메인 EXE파일로 구성하면 된다. 이렇게 하면 메인 EXE 파일이 중심을 잡고 각 함수를 DLL에서 불러다 사용하는 구조가 되므로 무언가 업뎃을 해야 한다면 메인은 거의 그대로 유지하고 단순히 DLL 파일만 바꿔주면 새로운 버젼이 된다.

지금까지 위에서 이야기 한걸로 보아하면 겁나 쉽고 만만하게 보이지만 사실 몇가지 해주어야 할 것들이 있다.
  • 닷넷 프레임워크가 반드시 클라이언트 (사용자) 컴퓨터에 설치되어 있어야 한다. 
  • 내가 만든 어플리케이션은 클라이언트 입장에서 봤을 때 '부분적으로 신뢰'된다. 이걸 좋게 보려면 참 장점인게 클라이언트의 컴퓨터에 최대한 접근을 적게하려 하므로 클라이언트 입장에서는 더욱 안전하다. 다만, 프로그래머 입장에서 좀더 심층적인 작업, 예를 들자면 파일을 열고 쓰고 닫고 COM 오브젝트를 불러다 쓰고 싶다면 반드시 클라이언트의 보안 규정에 따라야 하므로 좀 귀찮은 과정이 추가된다.
  • 기본적으로 어플리케이션은 몇몇 DLL을 필요로 하게 마련이고 이것을 로드해야 하는데 느린 인터넷 속도와 현재의 설계방식 때문에 좀 느릴수 있다는 점. 
  • 업데이트 자체가 파일 단위 업뎃이라서 어플리케이션이 반만 업데이트 될수도 있다. 헐퀴... 이거 무서운데?
  • 오프라인 모드도 있다는데 이것이 인터넷 익스플로러에만 있고 어플리케이션 자체에는 없다?
  • 기본적으로 어플리케이션의 속성을 조절하기 위한 .config 파일이 없다. 하지만 할 수 있는 방법이 있어. 근데 링크가 죽었네? ㅋㅋ 
  • 오, 프로그램 시작메뉴나 데스크 탑에 단축 아이콘 생성이 안돼! 헐 이거 대박 단점인데? 
Update Application Block
마이크로소프트에서는 위에서 언급한 단점들을 극복하기 위해서 이른바 Updater Application Block (UAB)라는 것을 만들었는데 이 업뎃 블락이라는 놈은 내가 작성한 어플리케이션에 HTTP를 통해 어플리케이션의 각각의 조각을 다운로드 하는 것을 관리하기 위한 라이브러리다. 

이것은 기본 닷넷 프레임워크가 제공하는 것보다 몇가지 장점을 가지는데 다음과 같다.
  • 이것은 로컬 어플리케이션으로 작동한다. 즉, 퍼포먼스 페널티가 없다. 왜냐면 하드 드라이브에서 실행하는 것과 같으므로.
  • 업뎃의 Atomic operation을 보장한다. 즉, 업뎃 하면 100% 업뎃 한다. 중간에 끊기 없기
  • 어플리케이션이 manifest 파일을 가진다. (명세서)
  • 100% Trusted 모드로 실행된다. 즉, 보안 규약이고 나발이고 걍 내 맘대로 할 수 있다.
  • 시작메뉴에 단축 아이콘 생성된다! 
반면, 아까 말한대로 무조건 장점만 있으면 세상이 아름답겠지만 단점도 있다.
  • 이걸 쓰려고 하면 어플리케이션의 대대적인 수정이 불가피하다.
  • 옛날 버전 윈도우에서는 안된다. 98, ME에서 작동 안되고 2000이상되어야 한다. 98/ME 아직도 쓰는 사람 있나? 손들어보자...
  • 100% 트러스트 모드로 작동하므로 난장판 만들 확률 또한 존재한다.
  • 마이크로 소프트에의해 지원 받지 못한다. 헐? 이건 뭔 소리야... 마이크로소프트에서 만들었다면서?
헐, 좀 보아하니까 이거 죄다 연결된 링크도 깨지고 안되네. 이 UAB라는 놈은 2004년 (이글이 쓰여진 시점)에는 한창 잘나갔으나 지금은 사라졌나?

ClickOnce
드이어 우리가 궁금해하는 그 이름. 클릭원스, 한번클릭 님이 등장하셨다. 기본적으로 이 ClickOnce는 UAB가 가지는 모든 장점을 흡수하고 적은 단점을 가지고 추가적인 기능을 더 가지는 놈이다. 즉, 킹.왕.짱.이다. 저자가 생각하는 최고의 장점은 코드 보안을 지킨다는 점이란다. 난 없는게 더 좋던데...ㅋㅋㅋ

HREF EXEs와 비교하자면 ClickOnce는 다음과 같은 장점을 가진다.
  • 업뎃의 Atomic Operation 100% 보장 (중간에 끊기 없음)
  • 오프라인모드 지원할 뿐만아니라 어느정도 수준으로 할 건지도 조절가능. 심지어 어플리케이션이 온라인인지 오프라인인지 알아내는 API도 제공됨
  • Visual Studio와 연동도 뛰어나 어플리케이션이 요구하는 보안 수준도 설정가능하다
  • Bootstraper와 함께 오기때문에 필요한 컴포넌트를 쉽게 다운 받을 수 있다. 심지어는 닷넷 프레이워크 자체를 다운받는 것도 가능하다. 즉, 백지상태의 클라이언트에서도 인터넷만 연결되어 있다면 필요한 모든 것을 다 받아 설치할 수 있다는 말.
  • 시작메뉴에 단축 아이콘 생성 가능!
ClickOnce는 Visual Studio 2005의 기능중 하나이며 이전에는 Whidbey라고 불렸단다. 왜 그런 이름을? 난 알길이 없네... 

A ClickOnce Application
자, 이제 어떻게 사용하는지 볼까나. 다음과 같은 단계를 거쳐야 한다.

  1. Visual Studio 시작 
  2. 새 프로젝트 생성
  3. 간단한 C# 윈폼 프로젝트 선택
  4. 이름 맘대로 정하고 생성
  5. 간단한 버튼 추가해 주고
  6. 버튼에 간단한 코드 MessageBox.Show() 같은거 넣어주기
이제 이 다음부터는 프로젝트 속성에서 설정하는 것만 남았다. 사실 이 글이 쓰여진 시점으로 부터 워낙 많이 시간이 흘러 지금 내가 사용하는 2012에서는 약간 다른 점도 있지만 기본적으로는 아주 유사하다.


프로젝트 속성의 Publish 탭에 들어가면 각종 퍼블리슁 옵션이 나오는데 여기서 주목해야 할 것은 Publishing Location과 Install Mode and Setting 부분이다.

Publishing Location에서 어디에다 이 어플리케이션을 퍼블리슁 할거냐 묻는 건데 보시다시피 네트워크 공간도 가능하다. 고로 웹 서버에 올려놓기도 가능하다.

그리고 아래 버튼에 보면 Prerequisites 버튼이 있는데 이게 참 착한 놈이다. 


위 그림처럼 어떤 어셈블리가 필요한지 선택해주면 내가 만든 어플리케이션을 설치하기 전에 미리 이 조건이 충족되는지 확인해 보고 없으면 알아서 다운 받아서 설치한다. 참 착하다.

여기서 기타 등등 모든 세부 메뉴를 설명하기에는 시간 낭비인것 같고, 아무튼 이 ClickOnce라는 기능은 참으로 착하다... 웹 서버에 내가 작성한 어플리케이션을 넣어두고 업뎃까지 자동으로 알아서 하며 윈도우 운영체제의 보안 체계도 지키면서 필요한 놈들은 알아서 척척 미리 설치까지 하는 이 기능이야 말로 정말 대다나다. 

마무리 하자면 배포에는 몇가지 방법이 있다. 일단 제일 간단한 방법이 필요한 파일, 즉, EXE 파일과 DLL을 걍 복사해서 USB나 CD로 다른 컴퓨터에 넣는 방법이다. 이 방법은 문제가 있을 확률이 높다. 왜냐면 내가 복사를 할 컴퓨터에 필요한 구성 요소들이 무조건 있다라고 가정하고 있기 때문이다. 이것은 매우 위험한 전제 가정이다. 

두 번째 방법은 위에서 언급한 방법보다 조금 진화된 방법인데, 필수 파일은 복사해서 주고 필요 구성 요소들은 마이크로소프트가 제공하는 Redistribution Package를 설치해서 충당하는 방법이다. 이것이 물론 좀더 진화되기는 했는만 여전히 어떤 Package를 설치해야 하는지 그리고 얼마만큼이나 설치를 해야 하는지에 대한 질문에 대답을 해야 한다. 고로 복잡하기는 마찬가지다.

세 번째 방법은 Setup 프로젝트를 솔루션에 추가하여 Setup.msi 파일을 생성해내는 것이다. 이것은 ClickOnce의 Offline 버전이라고 보면 된다. 일반적으로 CD로 배포되는 어플리케이션들이 죄다 이런 방식이다. 물론 웹에서 다운 받는 파일도 대부분이 이런 형태를 띄고 있다. 이 방법은 ClickOnce와 마찬가지로 각종 옵션을 설정할수 있으며 Prerequisites를 설정할 수 있기 때문에 좋다.

마지막이 아마도 이 ClickOnce라는 방법이 아닐까 싶다. 코드 보안도 유지하고 공간 낭비도 적고 매번 새로운 파일을 제공하지 않아도 알아서 업뎃도 하며 각종 편의 사항은 모두 지원하는... 다만 인터넷이 빨라야 하고 큰 크기의 어플리케이션 설치에 사용하기에는 조금 무리가 있지 않나 싶다. 하지만 요즘 나오는 대형 게임을 보면 알수 있다시피 거의 이런 ClickOnce 형태의 독자적인 웹 서버 베이스의 설치 과정을 가지는 것을 보면 분명 배포의 최종 단계는 중앙 서버를 이용한 인터넷 퍼블리슁이라고 봐야 겠다. 





'프로그래밍 > MSDN' 카테고리의 다른 글

Implicit Platform Invoke  (0) 2013.09.24
Explicit PInvoke C++ (DllImport Attribute)  (0) 2013.09.24
Mixed, Pure, Verifiable  (0) 2013.09.20
[MSDN] .NET Framework 구조  (4) 2013.05.03
Pure C++: Hello, C++/CLI  (0) 2013.04.25
posted by 대갈장군