http://kimgwajang.tistory.com/category/HAU
주의 : 이 포스트의 일부 내용은 더 이상 정확하지 않습니다. 최신 정보는 http://kimgwajang.tistory.com/category/HAU에 있는 포스트를 참조하십시오.
김과장! 이게 뭐야?
자동 업데이터 입니다.
클릭온스 같은 거야?
네. 훨씬 더 단순한 로직이긴 하지만 결과적으로 비슷한 일을 합니다.
그런데 '클릭원스' 라고 발음해야 하는 것 아닌가요? 클릭(click) 한 번(once)으로 설치가 된다는 의미일테니 '원스'가 맞지 않겠습니까? '온스'는 ounce 라는 질량 단위가 있긴 하지만 클릭과는 상관이 없잖아요.
따지기는, 양놈들이 뭐라고 하든 국내에서는 클릭온스로 통해. 그리고 유명한 XX님도 클릭온스라고 발음해.
그건 그렇고, 왜 만든거야?
부장님도 아시다시피, 제가 클릭원스와 링크(LINQ) 매니아지 않습니까?
링크도 XX님은 '링큐'라고 하던데.
'링크'가 맞을 것 같아요. 왜냐 하면...
아니 됐고, 하던 이야기나 마저 해봐.
클릭원스가 나오기 전에, 그러니까 닷넷 1.X 시절에 HAU의 초기 버전을 만들어서 사용하곤 했었는데요. 클릭원스가 등장하면서 부터는 클릭원스만 애용하고 있습니다.
어떤 사람들은 클릭원스가 필드에 맞지 않는 쓸모 없는 기술이라고도 이야기하는데요. Smart Client Deployment with ClickOnce라는 책을 읽고 나서는 클릭원스는 제가 알고 있는 것보다 훨씬 많은 일을 할 수 있다는 것을 알게 되었습니다.
하지만 클릭원스를 사용하기 위해서는 몇 가지 요구사항, 즉 배포 서버에 IIS와 프론트페이지 서버 익스텐션이 설치되어 있어야 하는데, 필드에서는 상황에 따라선 이런 요구 사항이 충족되지 않는 경우가 종종 있었습니다.
그래서 클릭원스를 사용하는 것이 배포의 베스트 프랙티스라고 생각은 하지만, 클릭원스를 사용할 수 없는 환경도 있으니까 대안으로 웹 서버를 이용한 단순한 자동 업데이터를 만들게 된 것입니다.
웹 서버만 있으면 된다고? 리눅스에 아파치가 설치된 서버도 돼?
네 그렇습니다.
사장님이 좋아하시겠네.
사장님 좋아하시라고 만든 건 아니고요.
김과장이 만든 자동 업데이터는 어떤 장점이 있는데? 가볍다거나 무료다라는 것 말고. 그건 보통 완성도가 떨어지는 소프트웨어에 관습적으로 붙이는 말이니까.
풍부한 이벤트를 제공합니다.
HAU는 물리적으로 컴퍼넌트(System.ComponentModel.Component)로 되어 있는데 이 컴퍼넌트를 윈도우 폼이나 사용자 정의 컨트롤에 올려 놓아 사용할 수 있습니다. HAU가 다양한 이벤트를 제공하기 때문에 HAU를 사용하여 자동 업데이터를 개발하는 개발자는 자유로운 UI를 구현할 수 있습니다.
또?
계층 구조로 된 파일의 자동 업데이트를 지원합니다.
또?
업데이트 체크를 위한 웹 서버에의 요청을 최소화 하여 속도가 빠릅니다.
예컨데, A, B, C 세 개의 파일이 서버에 있고, 이 중 A와 B가 최신 버전이면, HAU는 세 파일에 대해서 각각 웹 서버에 요청을 보내 최신 버전 여부를 확인하지 않고, 업데이트 파일 목록를 구하는 한 번의 요청으로 최신 버전 여부를 판단합니다.
만일 배포된 파일이 200개 라면, 매 사용자가 프로그램을 실행할 때 마다 최신 버전이 있든 없든 항상 웹 서버에 200번의 요청을 보내야 하는 오버헤드가 발생할 수 있습니다.
업데이트 파일 목록이 뭐야? 어떻게 만드는 거야?
서버에 배포된 파일의 정보(경로, 크기, 수정 시각)를 저장하고 있는 XML 파일입니다.
업데이트 파일 목록의 XML 스키마는 너무나 단순하지만 직접 작성하기에는 번거로운 일이라서, 업데이트 파일 목록 편집기를 같이 만들었습니다. 이를 이용하면 업데이트 파일 목록을 쉽게 만들 수 있습니다.
더 있어?
음... 이런 말씀은 안드리려고 했는데, 가볍고 무료입니다.
좀 구차하지 않나?
소스가 단순하고 직관적입니다.
무슨 근거로?
닷넷 프레임웍 2.0에는 WebClient 라는 클래스가 추가됨으로 해서 HTTP 프로토콜을 사용한 다운로드가 무척 간단해졌습니다. 이를 직접 구현한 HAU의 이전 버전에 비하면 몇 백 줄 이상이 줄어들었습니다.
그리고 처음부터 공개를 목적으로 작성한 소스이기 때문에 최대한 다른 개발자가 쉽게 파악하기 용이한 구조로 작성하고 주석을 성실하게 달았습니다. 쓰레드에 대한 약간의 지식만 있으면 누구나 쉽게 커스터마이징이 가능할 것으로 자신합니다.
김과장이 보내준 비주얼 스튜디오 프로젝트에 들어 있는 파일들은 다 뭐야?
AutoUpdater는 자동 업데이트 기능을 구현한 컴퍼넌트 입니다. 따라서 업데이트 진행 상황을 표시하는 UI 같은 것은 포함되어 있지 않습니다. 대신 AutoUpdater이 노출하는 이벤트에 대한 핸들러를 작성하여 UI를 붙일 수 있습니다.
SampleForm는 바로 이러한 UI를 구현하는 예제로 만든 폼입니다.
마지막으로 UpdateListEditor는 업데이트 파일 목록 편집기입니다.
어떻게 사용하는 거야? 그림과 함께 상세하게 설명해줘봐.
NoM의 배포를 예로 들어 설명해보겠습니다.
NoM의 배포에 필요한 파일의 목록은 아래와 같습니다.
파란색은 파일, 빨간색은 폴더를 나타내는 계층구조를 가지고 있습니다.
참고로 dummy 폴더는 NoM의 배포에 필요하지는 않지만 설명의 편의 상 추가한 폴더입니다.
파일들을 모두 D:\NoM 폴더에 모아 두고 이후 작업을 진행합니다.
업데이트 목록 만들기
먼저 위 파일들을 가지고 업데이트 목록을 만들어야 합니다.
소스에 있는 UpdateListEditor를 실행합니다.
쌩뚱맞게 '제외 정규식'은 뭐야?
정규식을 입력하면, 그에 매치되는 파일은 업데이트 목록에서 제외하는 기능입니다.
지금은 제외할 파일이 없으니까 비워 두고 디렉토리 읽기를 클릭합니다.
폴더 찾아보기 대화상자가 열리면 D:\NoM를 선택합니다.
필요하다면 그리드에서 목록을 수정할 수 있지만, 지금은 바로 '저장하기'를 클릭하여 이 목록을 XML파일로 저장합니다.
D:\NoM\UpdatingList.xml로 저장합니다.
이제 업데이트 목록 파일이 만들어졌습니다.
배포 파일을 웹서버로 업로드 하기
위 파일들을 계층 구조를 그대로 유지한채로 웹서버에 올립니다. 위에서 만든 UpdatingList.xml 파일도 같이 올려야 합니다.
여기서는 http://www.dolsan.org/nullnull/Nom에 업로드한 것으로 하겠습니다.
여기까지가 배포 서버를 준비한 과정이었습니다. 지금부터는 배포 서버를 이용하여 자동으로 업데이트를 하는 응용 프로그램을 만들도록 하겠습니다.
자동 업데이터 응용프로그램 만들기
비주얼 스튜디오에서 새 윈폼 응용프로그램을 만듭니다.
소스에 있는 Framework.AutoUpdater.dll에 대한 참조를 추가한 후 도구상자에서 AutoUpdater 컴퍼넌트를 선택하여 폼으로 끌어다 놓습니다.
autoUpdater1의 속성 중 RootUri를 http://www.dolsan.org/nullnull/Nom로 UpdateListFileName을 UpdatingList.xml로 설정합니다.
구현할 UI에 따라 autoUpdater1의 이벤트 핸들러를 적절하게 구현합니다.
자세한 내용은 소스에 포함된 SampleForm을 참조하시기 바랍니다.
각 이벤트의 의미는 다음과 같습니다.
이벤트 | 의미 |
UpdateCompleted | 업데이트가 끝났음 |
UpdatableListFound | 업데이트 할 파일의 목록이 발견되었음 |
UpdatableFileFound | 업데이트 할 파일이 발견되었음 |
FileTransfering | 개별 파일의 전송이 시작되려고 함 |
FileTransfered | 개별 파일의 전송이 완료되었음 |
UpdateProgressChanged | 업데이트 진행 상황이 변경되었음 |
물론 이 중에서 가장 중요한 이벤트는 업데이트가 끝났음을 알리는 UpdateCompleted라고 할 수 있겠습니다.
이에 대한 이벤트 핸들러는 일반적으로 다음과 같이 구현될 것입니다.
NoM.exe를 실행하고 HAU는 종료하는 코드입니다.
시간이 지나 NoM이 업데이트 되면, 업데이트 목록 파일 만들기와 웹서버로 업로드하기를 반복하면 됩니다.
아 그렇군. 김과장 수고했어.
네.
'개발 관련 글' 카테고리의 다른 글
C# List View v1.3 (0) | 2009.04.21 |
---|---|
A flag editor (0) | 2009.04.21 |
Smart Client (Web-embedded) 보안 (0) | 2009.04.15 |
[Java] 바이오리듬 구하는 소스 (0) | 2009.03.23 |
마이크로소프트 개발자 컨퍼런스 비디오 무료로 보기 (0) | 2009.02.21 |