'분류 전체보기'에 해당되는 글 189건

  1. 2009.03.04 Microsoft SQL Server 2005/2008용 데이터베이스 문서화 도구
  2. 2009.02.21 DB 분실
  3. 2009.02.13 비스타에서 秀作 론처가 실행되지 않는 문제 1
  4. 2009.01.15 NoM 1.5 업데이트 - 웹 다운로드(만화 다운로드용) 3
  5. 2008.12.29 NoM 1.4 업데이트 8
  6. 2008.12.15 MP Default 패키지 내 일부 클래스의 이름 변경
  7. 2008.12.08 배포 (웹)서버를 위한 MIME 설정
  8. 2008.12.08 MP 버그 하나
  9. 2008.12.06 자동 업데이터 (HAU, Http Auto Updater) 1.1 업데이트 2
  10. 2008.12.04 자동 업데이터 (HAU, Http Auto Updater) 1

Microsoft SQL Server 2005/2008용 데이터베이스 문서화 도구

RTFM/SQL 2009. 3. 4. 12:42

http://www.codeproject.com/KB/database/DatabaseDocumentation.aspx


SQL Server 2005/2008를 지원하는 데이터베이스 문서화 도구입니다.

:

DB 분실

秀作 2009. 2. 21. 00:07

호스팅 받고 있던 DB가 분실된 불행한 사고가 있었습니다.

운영한지 며칠 되지 않고 워낙에 사이즈가 작은 DB여서 스키마 복구가 힘들지는 않았는데,

다만 10여 분 정도의 계정 정보는 복구하지 못하였습니다.

 

그래서 2009.2.20 이전에 등록하신 분들은 번거로우시더라도 다시 가입을 하셔야 됩니다.

나름 천재지변에 준하는 사고였긴 하지만, 불편함을 드린 부분에 대해서는 사과 드립니다.

더 열심히 살겠습니다. 꾸벅.

:

비스타에서 秀作 론처가 실행되지 않는 문제

秀作 2009. 2. 13. 01:22

비스타에서는 폴더의 퍼미션 때문에 秀作 론처가 실행되지 않는 문제가 있음이 발견되었습니다.

제보해주신 D 님께 감사드립니다.


해결방법은 다음과 같습니다.

秀作이 설치된 C:\Program Files\Sujak 폴더의 속성 창을 열고 보안 탭을 선택하고 편집 버튼을 클릭합니다.

사용자 계정 컨트롤 창이 뜨면 계속을 클릭합니다.

마지막으로 그룹 또는 사용자 이름에서 Users를 선택하고 모든 권한허용으로 체크하고 확인을 클릭합니다.

:

NoM 1.5 업데이트 - 웹 다운로드(만화 다운로드용)

NoM 2009. 1. 15. 13:59

<주의>

이 툴은 다운로드의 대상이 되는 웹 서버에 무리한 부하를 줄 수 있습니다.

이 툴을 악용하여 웹 서버에 피해가 발생하면 이는 전적으로 사용자의 책임 입니다.

이런 맥락에서 10,000 개 이상의 파일은 한 번에 다운로드 받을 수 없게 막혀 있습니다.

<설치>

이번 버전에서는 설치 방법에 많은 변화가 있었습니다.

 http://kimgwajang.tistory.com/142를 참고하세요.

<웹 다운로더>

image

웹 다운로더는 웹에 있는 파일을 일괄 다운로드 받는 툴 입니다.

예를 들어서 http://abc.com/001.jpg 부터 http://abc.com/100.jpg 까지 백 개의 그림 파일을 다운로드 받고자 한다면, 웹 다운로더를 사용하면 백 개의 주소를 일일히 웹 브라우저에서 입력할 필요 없이 간단한 조작만으로 다운로드 받을 수 있습니다.

 

실제 사용 예를 보면서 설명을 하도록 하겠습니다.

미션 : 일간 스포츠에서 (무료) 서비스하고 있는 야설록의 작품 '진혼검객'을 모두 다운 받아라. (130페이지 * 20권 == 2,600개의 그림 파일)

 

웹 다운로드 작업은 크게 두 단계로 이루어져 있습니다.

1. 일괄 다운로드할 주소(URL)들의 목록을 만듭니다.

2. 위 단계에서 만들어진 목록들을 순서대로 다운로드 받습니다.

 

2번 단계의 경우는 단순히 시작 버튼만 눌러주면 되는 간단한 일입니다만, 1번 단계는 조금 머리를 써야 합니다.

우리의 미션 같은 경우에는 2,600 개의 주소 목록이 필요한데, 이를 복사하기/붙여넣기하여 일부 수정하는 식으로 만들 수는 없지 않습니까.

그래서 웹 다운로더에는 매크로 라는 기능이 있는데, 이는 다운로드 받을 URL에서 # 라는 부분이 있으면 이를 연속되는 숫자로 치환하여 각 주소를 생성해내는 기능입니다.

예를 들어 http://abc.com/#.jpg URL에는 매크로가 들어 있는데, 여기서 #는 나중에 1 부터 10까지로 치환이 됩니다. (물론 치화되는 값은 매크로의 숫자에 따라 다릅니다.)

그렇다면 결과적으로 우리는 http://abc.com/1.jpg, http://abc.com/2.jpg, http://abc.com/10.jpg ... 같은 목록을 얻게 되는 것입니다.

 

또한 두 개 이상의 매크로를 중첩하여 사용할 수도 있습니다.

이번에는 http://abc.com/#/#.jpg를 예로 들어 볼까요.

보시다시피 매크로 기호인 #가 두 개 있습니다. 이 때 첫번재 매크로가 1 ~ 2, 두번재 매크로가 3 ~ 4로 설정되어 있다면, 결과적으로 우리는 아래 네 개의 URL을 얻게 됩니다.

http://abc.com/1/3.jpg

http://abc.com/1/4.jpg

http://abc.com/2/3.jpg

http://abc.com/1/4.jpg

 

다시 미션으로 돌아가서 생각을 해봅시다.

위에서 한 이야기에 의하면 우리가 해야 할 일은,

1. 진혼검객의 그림 파일 2,600개에 대한 URL 목록을 만들어야 합니다. 이때 각 주소의 규칙을 찾아내어 매크로를 사용하면 아주 편리합니다.

2. 만들어진 URL목록을 다운로드 합니다.

 

1번 작업부터 해봅시다.

2,600개 그림 파일의 주소에는 아마도 규칙성이 있을 것입니다.

일단 그림 파일 몇 개의 주소를 알아 봅시다.

웹에서 진혼검객 1권의 첫 번째 페이지를 봅니다.

image

그림 파일에서 마우스 우클릭한 후 속성을 선택합니다.

image

등록 정보를 보면 그림 파일의 주소를 알 수 있습니다. 여기서는 http://coimg.joins.com/진혼검객/001/001.jpg 임을 알 수 있습니다.

마찬가지로 몇 페이지의 넘겨 가며 그림 파일의 주소를 몇 개 더 모아 봅니다. 아래는 이런 방식으로 모은 주소들입니다.

http://coimg.joins.com/진혼검객/001/001.jpg

http://coimg.joins.com/진혼검객/001/002.jpg

http://coimg.joins.com/진혼검객/001/003.jpg

아 이런 참, 일간 스포츠는 그림 파일의 주소를 너무나 친절하고 예쁘게 매겨 놓았군요.

금방 눈치 채셨겠지만 여기의 규칙은 다음과 같습니다.

http://coimg.joins.com/진혼검객/권 번호/페이지 번호.jpg

그렇다면 결국 굵은 글씨로 된 부분(권 번호, 페이지 번호)을 아래와 같이 매크로로 바꾸면 2,600개의 주소를 모두 알 수 있겠습니다.

http://coimg.joins.com/진혼검객/#/#.jpg

 

여기서 두 가지 의문이 들 것입니다.

1. 권 번호야 20권으로 고정되어 있지만, 각 권의 페이지 수는 일정하지 않을 수 있습니다.

--> 맞는 말입니다. 웹에서 만화를 주욱 보시면 아시겠지만, 각 권은 대략 130 페이지 내외로 구성되어 있습니다.

그렇다면 페이지 번호는 1 부터 시작해서 어디까지 반복해야 하는 것일까요?

답은 넉넉하게 큰 숫자로 지정하면 된다는 것입니다.

각 권이 대략 130페이지니까 우리는 150 정도로 지정하겠습니다.

이에 관한 이야기는 뒤에서 좀 더 자세히 말씀드리겠습니다.

2. 권 번호와 페이지 번호의 자릿수가 세 자리로 고정되어 있습니다. 그래서 권 번호의 경우 1 ~ 20 을 반복하는 것이 아니고 001 ~ 020 을 반복하여야 합니다.

--> 예리한 지적입니다. 이 문제는 웹 다운로더를 직접 보면서 설명하도록 하겠습니다.

 

이제 NoM을 실행시키고 도구 상자에서 웹 다운로더를 클릭합니다.

image

1. 매크로가 포함된 다운로드 주소를 입력하는 곳입니다.

2. 각 매크로의 설정을 조정합니다. 이 상자의 수는 다운로드 주소에 포함된 매크로 갯수(#의 갯수) 만큼 자동으로 늘어나거나 줄어듭니다.

3. 목록을 만들거나 다운로드를 시작합니다. 또한 다운로드가 시작되었으면 이를 중지할 수도 있습니다.

4. 다운로드 진행 상황을 나타냅니다.

5. 매크로에 의해 치환된 목록이 표시됩니다.

 

먼저 다운로드 주소에 위에서 생각해 낸 주소(http://coimg.joins.com/진혼검객/#/#.jpg)를 입력합니다.

매크로(#)가 두 개 있기 대문에 매크로 상자도 두 개가 나타납니다.

매크로의 이름은 주소에서 왼쪽 -> 오른쪽 순으로 매크로 1, 매크로 2라고 부르겠습니다.

(따라서 매크로 1은 권 번호이고, 매크로 2는 페이지 번호 입니다.)

 

지금부터는 각 매크로를 설정해 봅시다.

먼저 매크로 1(권 번호)을 보겠습니다.

image

우리는 001 ~ 020 을 만들어 내야 합니다.

그렇다면 설정을 아래와 같이 해야겠네요.

image

미리보기를 눌러 값이 제대로 나왔는지 확인합니다.

image

앗, 001 과 같이 세 자리로 나와야 하는데 한 자리로 표시됩니다.

이번에는 빈 자리를 0으로 채웁니다 옵션을 켜고 총 자리 수를 3으로 설정합니다.

image

원하는 결과가 나왔습니다.

매크로 2(페이지 번호)의 설정도 대동소이합니다.

image

마지막 번호만 150으로 변경해주면 되겠습니다.

 

이제 다운로드 상자에 있는 목록 만들기 클릭하여 목록을 만들어 봅시다.

image

잠시 기다리면 아래와 같이 매크로에 의해 생성된 URL이 화면 우측에 표시됩니다.

image

여기서는 20권 * 150페이지 이므로 3,000개의 주소가 만들어졌습니다.

주소를 확인했으면 이제 시작을 누르고 파일을 저장할 폴더를 지정한 후 대망의 다운로드를 시작합니다.

image

image

image

1. 다운로드된 파일은 주소 왼쪽에 체크 표시가 켜집니다.

2. 다운로드 진행 상황을 %와 '다운 받은 파일 수 / 전체 파일 수' 형식으로 표시합니다.

 

다운로드 받은 파일은 위에서 지정한 폴더에 순차적인 번호가 매겨진 상태로 들어 있습니다.

 

마지막 페이지 번호를 알 수 없는 문제와 관련하여 아래 스샷을 보시기 바랍니다.

image

1권의 124 페이지까지는 다운을 받았지만, 이후 부터는 다운을 못받고 2권의 1페이지부터 다시 다운을 받기 시작했습니다.

이 말은 http://coimg.joins.com/진혼검객/001/125.jpg 부터 http://coimg.joins.com/진혼검객/001/150.jpg 에 해당하는 파일이 서버에 없다는 의미입니다.

따라서 페이지의 마지막 번호를 알 수 없거나 번호가 일정하지 않을때는 넉넉하게 큰 값으로 지정해 놓으면, 해당 파일이 서버에 존재하지 않아도 무시하고 넘어가기 때문에 문제가 없습니다.

:

NoM 1.4 업데이트

NoM 2008. 12. 29. 14:21

추천 사이트 추가

image

추천 사이트는 TXT 파일로 변환하기에 적합한 사이트 중 제작자가 추천하는 리스트입니다.

주로 언론 사이트로 구성되어 있습니다.

혹 다른 사용자와 나누고 싶은 사이트가 있어 제작자에게 알려주시면 추가하도록 하겠습니다.

 

즐겨찾기

image

즐겨찾기는 웹 브라우저의 그것과 마찬가지로 자주 찾는 사이트를 등록해 두는 기능입니다.

상단에 있는 두 개의 메뉴는 즐겨찾기에 추가하고 즐겨찾기를 관리하기 위한 메뉴이며, 그 아래에 있는 메뉴는 각 즐겨찾기의 목록입니다.

 

현재 페이지 추가를 누르면 '즐겨찾기 추가' 창이 열려 새 즐겨찾기를 추가할 수 있습니다.

image

현재 페이지의 제목과 URL이 기본값으로 설정되어 있는데, 적당한 이름을 지정한 후 추가를 누르면 즐겨찾기가 추가됩니다.

 

'즐겨찾기 관리'는 즐겨찾기 항목을 삭제할 때 사용됩니다.

image

삭제할 즐겨찾기 항목을 선택한 후 삭제 버튼을 누르면 됩니다.

 

즐겨찾기 목록은 내문서 폴더의 NomFavoriteSites.txt 파일에 저장됩니다.

:

MP Default 패키지 내 일부 클래스의 이름 변경

Midnight Peach 2008. 12. 15. 14:20

[주의]
이 글은 MP의 현재 버전 (3.X)에 맞지 않습니다.

단순 참고용으로만 활용하십시오

처음부터 계속 마음이 걸려왔던 일인데, Manager 클래스들(ContactManager, MemoManager 등)의 이름이 항상 마땅찮았습니다.

MP의 처음 버전에서는 MemoManager의 이름이 MemoDto 였습니다.

즉 Memo 엔터티를 전달하는 역할을 하는 클래스(Data Transfer Object, 제가 만든 말이 아니고 공식 용어입니다.) 라는 의미였습니다.

하지만, MemoManager를 예를 들어 생각해 보면, MP의 아키텍쳐에서 MemoManager의 역할은 일반적인 데이터 전달 객체 이상입니다.

경우에 따라서는 MemoManager에 비지니스 로직이 담기는 경우도 있습니다.

(엄밀히 말하자면, MemoManager의 여러 부분 클래스 중 MP가 생성해 낸 부분 클래스에는 데이터 전달 객체로서의 역할만 하고, 사용자가 작성한 부분 클래스에는 비지니스 로직이 들어가는 것이 MP의 설계 의도입니다.)

그래서 MemoDto라는 이름은 적당하지 않은 것 같아 고심하다 장고 끝에 MemoManager라고 결정을 하였었습니다.

하지만 이 MemoManager라는 이름도 별로 마음에 들지 않습니다.

Manager가 다소 애매모호한 의미를 가지고 있어, MemoManager라는 이름을 들었을 때 직관적으로 MemoManager의 역할이 연상되지 않기 때문입니다.

(이렇게 애매모호하여 잘못된 이름의 또 다른 예로 GeneralUtility 같은 이름을 들 수 있겠습니다. 경험 상 이러한 이름의 클래스가 나타나게 되면 클래스 간의 설계에 빈 틈이 있을 확률이 높았습니다.)


결국 MemoManager를 MemoBiz로 변경하기로 하였습니다.

아래는 MP의 Defulat 패키지가 생성해 낸 코드의 구조입니다.

이전과 비교해서 이름이 바뀐 폴더나 파일에는 밑줄을 그어 두었습니다.

하나씩 살펴보면,

  1. Managers 폴더 -> Biz 폴더
  2. [Entity]Manager -> [Entity]Biz  // [Entity]는 각 엔터티(예, Memo)의 이름
  3. EntityManager -> EntityBiz
  4. ManagerRepository -> Business

와 같습니다.


각 Biz 객체에 접근하는 Facade 역할을 하는 ManagerRepository 클래스의 이름이 Business로 변경되었기 때문에, 위의 코드를 사용하는 코드도 아래와 같이 변경되어야 합니다.

:

배포 (웹)서버를 위한 MIME 설정

HAU 2008. 12. 8. 15:48

이 포스트의 정보는 배포 웹서버로 IIS를 사용하는 경우에 관한 것입니다.

리눅스 서버의 경우에는 웹 호스팅 서비스를 받고 있는 곳(X-Y.net)에서 테스트해봤는데 특별한 설정이 필요없었습니다.

호스팅 서버의 구성이 어떻게 되어 있는지에 대해서는 정확히 모르겠습니다.


HAU를 사용하기 위해서는 배포용으로 사용할 웹서버에 두 가지 설정을 해주어야 합니다.

1. MIME 형식 등록

배포 파일의 루트 디렉토리의 등록 정보 -> HTTP 헤더 -> MIME 형식을 차례로 선택합니다.

배포할 파일의 모든 확장자 마다 하나씩의 MIME 형식을 등록하여야 합니다.

아래 스샷은 모든 MIME 형식을 등록한 뒤의 이미지입니다.

여기서는 dll 을 등록하는 예를 들어보겠습니다.

새 형식 버튼을 누릅니다.

확장명에 .dll 을 MIME 형식에 application/zip을 입력합니다.

확장명은 물론 각 확장자 마다 다르지만, MIME 형식은 모두 application/zip로 입력하면 됩니다.

2. 실행 권한 제거

배포할 파일에 dll 이나 exe 같은 실행 파일이 포함된 경우에는 배포할 파일의 루트 디렉토리에 실행 권한을 줘서는 안됩니다.

등록 정보에서 실행 권한을 없음 이나 스크립트 전용으로 변경합니다.

:

MP 버그 하나

Midnight Peach 2008. 12. 8. 15:47

[주의]
이 글은 MP의 현재 버전 (3.X)에 맞지 않습니다.

단순 참고용으로만 활용하십시오

EntityManager<T> 클래스의 T GetFirst<U>(Expression<Func<T, bool>> where, Expression<Func<T, U>> orderBy, bool ascending) 메서드에서 버그를 발견하였습니다.

정렬 식을 null 이고 내림차순으로 첫번째 요소를 가져오면(GetFirst(null, null, false)와 같이  ) 오동작을 합니다.

query = query.OrderByDescending(orderBy) 문장이 실행되어야 하지만, if (orderBy != null) 조건에 의해  query = query.OrderBy(orderBy) 문장이 실행되기 때문입니다.

아래는 수정된 코드 입니다.

중간에 query.Count()로 쿼리식이 실행되는 부분이 마음에 들지는 않지만, 현재로서는 이게 최선의 방법인 것 같습니다. 좀 더 고민을 해봐야겠습니다.

수정된 버전은 클릭원스에 반영되어 있으므로 MP를 실행하면 자동으로 새 버전을 다운받게 됩니다.

:

자동 업데이터 (HAU, Http Auto Updater) 1.1 업데이트

HAU 2008. 12. 6. 00:57


1. 소스를 정리하였습니다.

아래 표는 각 프로젝트와 그에 속한 클래스에 대한 설명입니다.

Hau 자동 업데이터 컴퍼넌트 프로젝트. 아래 두 프로젝트에 의해 참조됨.
     AutoUpdater 자동 업데이터 컴퍼넌트
     RemoteFile 웹서버의 파일을 표현
     TransferingInfo 전송 상태를 표현
     UpdateListDataSet 업데이트 파일 목록을 읽고 쓰기 위한 스키마
Hau.Sample 자동 업데이터 컴퍼넌트를 이용하는 샘플 프로젝트
     NomAutoUpdater 자동 업데이터 컴퍼넌트를 이용하여 구현된 NoM의 자동 업데이터
Hau.UpdateListEditor 업데이트 파일 목록 편집기 프로젝트
    UpdateListEditorForm 업데이트 파일 목록 편집기

2. AutoUpdater에 LocalRoot 라는 속성이 추가되었습니다.

이전 버전에는 다운로드 위치가 항상 AutoUpdater 컴퍼넌트가 사용된 실행파일과 같은 위치였지만, 이제는 LocalRoot 속성을 지정하면 아무 곳에나 다운로드를 받을 수 있게 되었습니다.


3. 업데이트 파일 목록 편집기에서 제외 정규식과, 그리드의 편집 기능이 없어졌습니다.


4. 업데이트 파일 목록 편집기 '마지막 수정 시각 1초 증가' 버튼이 추가되었습니다.

이 기능은 기존 업데이트 목록을 열어서 특정 파일만 최신 버전으로 지정하는 경우에 유용하게 사용할 수 있습니다.

1초가 증가된 행의 배경색은 베이지로 변경됩니다. 또한 한번 1초가 증가된 행은 더 이상 증가되지 않습니다. (논리적으로 2초 이상을 증가시킬 이유가 없습니다.)


5. 업데이트 파일 목록 편집기의 그리드에서 Delete 키를 누르면 행이 두 개씩 삭제되던 버그를 수정하였습니다.

:

자동 업데이터 (HAU, Http Auto Updater)

HAU 2008. 12. 4. 00:15

주의 : 이 포스트의 일부 내용은 더 이상 정확하지 않습니다. 최신 정보는 http://kimgwajang.tistory.com/category/HAU에 있는 포스트를 참조하십시오.


김과장! 이게 뭐야?

자동 업데이터 입니다.

클릭온스 같은 거야?

네. 훨씬 더 단순한 로직이긴 하지만 결과적으로 비슷한 일을 합니다.

그런데 '클릭원스' 라고 발음해야 하는 것 아닌가요? 클릭(click) 한 번(once)으로 설치가 된다는 의미일테니 '원스'가 맞지 않겠습니까? '온스'는 ounce 라는 질량 단위가 있긴 하지만 클릭과는 상관이 없잖아요.

따지기는, 양놈들이 뭐라고 하든 국내에서는 클릭온스로 통해. 그리고 유명한 XX님도 클릭온스라고 발음해.

그건 그렇고, 왜 만든거야?

부장님도 아시다시피, 제가 클릭원스와 링크(LINQ) 매니아지 않습니까?

링크도 XX님은 '링큐'라고 하던데.

'링크'가 맞을 것 같아요. 왜냐 하면...

아니 됐고, 하던 이야기나 마저 해봐.

클릭원스가 나오기 전에, 그러니까 닷넷 1.X 시절에 HAU의 초기 버전을 만들어서 사용하곤 했었는데요. 클릭원스가 등장하면서 부터는 클릭원스만 애용하고 있습니다.

어떤 사람들은 클릭원스가 필드에 맞지 않는 쓸모 없는 기술이라고도 이야기하는데요. Smart Client Deployment with ClickOnce라는 책을 읽고 나서는 클릭원스는 제가 알고 있는 것보다 훨씬 많은 일을 할 수 있다는 것을 알게 되었습니다.

그래서 클릭원스를 사용하는 것이 배포의 베스트 프랙티스라고 생각은 하지만, 클릭원스를 사용할 수 없는 환경도 있으니까 대안으로 웹 서버를 이용한 단순한 자동 업데이터를 만들게 된 것입니다.

웹 서버만 있으면 된다고? 리눅스에 아파치가 설치된 서버도 돼?

네 그렇습니다.

사장님이 좋아하시겠네.

사장님 좋아하시라고 만든 건 아니고요.

김과장이 만든 자동 업데이터는 어떤 장점이 있는데? 가볍다거나 무료다라는 것 말고. 그건 보통 완성도가 떨어지는 소프트웨어에 관습적으로 붙이는 말이니까.

풍부한 이벤트를 제공합니다.

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이 업데이트 되면, 업데이트 목록 파일 만들기와 웹서버로 업로드하기를 반복하면 됩니다.

아 그렇군. 김과장 수고했어.

네.

: