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

  1. 2010.09.17 윈도우즈 서비스 라이브러리
  2. 2010.08.09 NoM 1.6 업데이트 3
  3. 2010.06.20 T4를 이용한 WCF 클라이언트 래퍼 생성
  4. 2010.06.20 미리 보는 MSDN 라이브러리의 변화
  5. 2010.06.20 비주얼 스튜디오 2010 응용프로그램 수명주기 관리 – 작업 항목 관리
  6. 2010.06.20 WCF 4.0의 새로운 기능
  7. 2010.06.20 쉐어포인트와 닷넷의 통합
  8. 2010.05.03 제네릭 WCF 호스트와 클라이언트
  9. 2010.03.30 VS2010의 정적 코드 분석
  10. 2010.03.30 연관 하위 쿼리 vs. case 문

윈도우즈 서비스 라이브러리

RTFM/기타 2010. 9. 17. 01:00

Ron Wilson 의 윈도우즈 서비스 라이브러리

경우에 따라서는 응용 프로그램이 일반적인 형태의 데스크탑 응용 프로그램이 아닌 윈도우즈 서비스 형태로 구현되어야 하는 경우가 있습니다.

물론 비주얼 스튜디오를 이용하면 상당히 편리하게 서비스를 개발할 수 있긴 하지만, 그래도 디버깅과 서비스 설치 등에 있어 일반적인 응용 프로그램 보다는 번거로운 것이 사실입니다.

최근에 어줍잖은 윈도우즈 서비스를 하나 만드는 과정에서 Ron Wilson 이라는 분의 윈도우즈 서비스 라이브러리를 알게 됐는데, 그 유용함에 매료되어 이를 널리 알리고자 합니다.

Ron Wilson 이 코드 프로젝트에 쓴 원문은 아래와 같습니다.

http://www.codeproject.com/KB/system/SimpleServiceDotNet.aspx

간단히 요약하자면 이 라이브러리를 이용하면,

1. Windows Service 가 아닌 Console 프로젝트를 사용하기 때문에, 일반적인 콘솔 프로그램의 편리함을 그대로 유지할 수 있습니다.

2. 빌드한 결과물인 exe 파일을 바로 서비스로 등록할 수 있어, 번거로운 서비스 설치 작업(InstallUtil.exe)이 필요하지 않습니다.

라고 할 수 있겠습니다.


서비스 작성 연습

이 글에서는 이 라이브러리를 사용하여 간단한 윈도우즈 서비스를 구축하는 과정을 보여드릴까 합니다.

하루에 한 번 하드디스크의 용량을 체크하여 관리자에게 메일을 보내는 서비스를 개발하도록 하겠습니다.


프로젝트의 생성과 구성

먼저 콘솔 프로젝트를 하나 만듭니다.

이름은 WindowsServiceDemo 라고 하지요.

Ron 의 기사에서 라이브러리를 다운 받고, 그 중 아래 세 파일을 WindowsServiceDemo 프로젝트에 추가합니다.

ISimpleServiceWorker.cs
SimpleService.cs
SimpleServiceInstaller.cs

WindowsServiceDemo  프로젝트에 아래 어셈블리에 대한 참조를 추가합니다.

System.configuration.dll
System.Configuration.Install.dll
System.Management.dll
System.ServiceProcess.dll

프로젝트의 등록 정보의 설정 탭에서 새로운 설정 파일을 추가합니다.

설정 파일을 열어 아래 값을 입력해 둡니다.

MailReceivers 는 메일을 받을 수신자 목록입니다. ; 으로 각 메일 주소를 구분합니다.

HoursToWork 는 하루 중 서비스가 동작할 시각의 목록입니다. 각 시각은 역시 ; 으로 구분합니다.

예를 들어 2;14 라는 것은 이 서비스가 2시와 14시에 한 번씩 실행된다는 의미입니다.


Utility 클래스

Utililty 클래스를 하나 추가한 후 몇 가지 헬퍼 메서드를 추가합니다.

이 글에서는 윈도우즈 서비스에 집중하기 위해 이 헬퍼 메서드에 대한 설명을 생략하지만, 좀 더 자세한 것은 주석과 첨부파일에 있는 소스를 참고하십시오.

먼저 시스템에 부착되어 있는 모든 논리 디스크의 이름과 남은 용량을 반환하는 메서드입니다.

그리고 지메일을 통해 이메일을 발송하는 메서드를 추가합니다.

마지막으로 string.Split 메서드의 래퍼 메서드를 하나 추가합니다.


Worker 클래스

이제 본격적인 서비스 작업을 구현할 차례인데요.

먼저 이 작업을 할 Worker 클래스를 추가합니다.

Worker 클래스는 Ron 의 라이브러리에 있는 ISimpleServiceWorker 인터페이스에 있는 세 가지 메서드를 구현하여야 하는데,

이 중 Init 와 Cleanrup 메서드는 각각 리소스의 할당과 해제를 담당합니다.

우리의 서비스에선 별도의 리소스를 사용하지 않으므로 그냥 비워둡니다.

실질적인 서비스의 코드는 Run 메서드 안의 무한 루프에 있습니다.

먼저 현재 시각을 체크하여 서비스가 동작할 시각인지를 체크합니다.

서비스가 동작할 시간이 맞다면, 하드디스크의 남은 용량을 검사한 후 이메일을 발송합니다.

이 루프를 매 1시간 마다 반복합니다.


타이머

서비스 프로그램, 특히 우리의 예제와 같은 로그성의 서비스를 만들 때 가장 어려운 문제 중 하나는 아마도 타이머를 만드는 일일 것입니다.

이 예제에서는 간단하게 현재의 시각(hour)이 예약된 시각(hour)과 같은지를 검사하는 로직을 사용하겠습니다.

IsTimeToWork() 메서드는 서비스가 일할 시간인지를 알려주는 역할을 합니다.

예를 들어, 설정 파일에서 Settings.Default.HoursToWork 에 2:14 라고 입력을 하였다면,

현재 시간이 2시 몇 분 이거나 14시 몇 분 이면 이 메서드는 true 를 반환합니다.


하드디스크의 남은 용량 조사

CheckFreeSpace 메서드는 하드디스크의 남은 용량을 조사하여 StringBuilder 에 기록해 두는 일을 합니다.


메일 발송

설정 파일에 저장된 수신 목록의 각 이메일 주소에 대해 메일을 발송합니다.

모든 메일이 성공적으로 발송되면 true 를  반환합니다.

1. 물론 “지메일 아이디”와 “지메일 비밀번호”에는 맞는 값을 입력하여 합니다.
2. 지메일에서 하루에 보낼 수 있는 메일의 양에는 제한이 있습니다. 대충 100통 정도인 걸로 기억이 되는데, 확실하지는 않습니다.

디버깅

이제 서비스가 제대로 동작하는 지 테스트를 해 봅시다.

Program.cs 의 아래와 같이 변경합니다.

Ron 의 라이브러리를 사용하기 때문에 이 서비스를 실행하기 위해서는 실행파일의 끝에 –console 이라는 매개변수를 붙이면 됩니다.

Debug 모드에서는 매번 매개변수를 붙이기 힘드니까 비주얼 스튜디오에서 이 매개변수를 지정하겠습니다.

프로젝트의 등록 정보에서 아래와 같이 설정합니다.

F5 를 눌러 디버깅을 시작하면 서비스가 동작하는 것을 확인할 수 있습니다.

설정 파일의 HoursToWork 값을 현재 시간으로 맞춰놓고 테스트를 해보시기 바랍니다.


배포와 설치

마지막 단계는 개발한 서비스를 배포하고 설치하는 것입니다.

배포를 하기 위해서는 일단 Relese 모드로 빌드를 하고, bin\Release 폴더에 생성된 파일을 모두 배포할 컴퓨터에 복사를 합니다.

먼저 배포할 컴퓨터에서 명령창을 열어 아래와 같이 입력하여 도움말을 확인해보겠습니다.

현재는 서비스를 설치를 해야 하기 때문에 –install 옵션을 사용해야겠습니다.

그럼 아래와 같이 입력을 해야겠네요.

설치가 되었습니다.

설치된 서비스를 시작할 때는 –start 옵션을 사용합니다.

물론 서비스를 삭제할 때는 –uninstall 을 지정하면 됩니다.


정리

Ron Wilson 의 윈도우즈 서비스 라이브러리를 사용하면 윈도우즈 서비스를 아주 편리하게 개발/디버깅/설치할 수 있습니다.

감히 윈도우즈 서비스 개발의 (one of the) best practice 라고도 할 수 있을 것 같습니다.

:

NoM 1.6 업데이트

NoM 2010. 8. 9. 21:02

설치

설치 URL이 변경되었습니다.

http://d.lawnb.com/publish/nom/publish.htm

 

이전 버전을 설치한 분들은 삭제 후 위 URL에 접속하여 다시 설치를 하시기를 권장합니다.

 

상용 소프트웨어가 아닌지라, 비용이 들어가는 일에는 아무래도 어려움이 있습니다.

그 중 한 가지가 배포를 위한 호스팅 비용을 마련하는 일인데, 그동안 여러번 설치 URL이 변경되어 사용하시는 분들에게 불편을 드렸습니다.

 

클립보드 감시

image

NoM 에서 TXT 파일로 변경할 웹페이지의 목록을 만들기 위해서는(놈의 용어로는 ‘캡쳐’), 1) 캡쳐모드를 시작한 후, 2) 내장 브라우저에서 링크를 클릭하여야 했습니다.

이번 버전에서는 이에 더하여 ‘클립보드 감시’ 라는 기능이 추가되었습니다.

 

굳이 NoM 의 내장 브라우저를 이용할 필요 없이, 자신이 선호하는 아무 브라우저를 사용할 수 있는데요.

1) NoM 의 캡쳐모드를 ‘클립보드 감시’ 로 설정하고, 2) 브라우저에서 캡쳐할 페이지의 주소를 복사를 합니다.

 

그러면 NoM 은 클립보드를 계속 감시하고 있다가, http:// 로 시작하는 URL 형식의 주소가 들어오면 이를 캡쳐 목록에 저장을 하게 됩니다.

image

 

캡쳐 목록이 준비되면 이 페이지들을 ‘다운로드’ 한 후 TXT 파일로 저장하는 방법은 이전과 동일합니다.

 

 

PDF 변환

이번 버전의 가장 큰 변화는 캡쳐된 웹페이지 목록을 PDF 파일로 변환하는 기능입니다.

위 그림과 같이 캡쳐 목록이 준비되어 있을 때, ‘PDF 변환’ 을 누르면 변환된 파일이 저장될 폴더 선택창이 나온 후, 아래와 같이 창이 열리면서 웹 페이지들을 PDF 파일로 변환합니다.

image

1. 파일명은 자동으로 날짜_시각_일련번호.pdf 로 지정됩니다.

 

2. 이 기능의 핵심적인 부분은 외국의 상용 라이브러리를 사용합니다.

$1000 이 넘는 고가라 구매는 하지 못하고 평가판을 사용하고 있는데, 그래서 생성된 PDF 파일의 가운데에 평가판 라이브러리가 사용됐다는 워터마크가 삽입됩니다.

image

보시다시피 경우에 따라서는 열람에 상당한 방해가 될 수 있으니 주의를 요합니다.

 

감사합니다.

:

T4를 이용한 WCF 클라이언트 래퍼 생성

RTFM/WCF 2010. 6. 20. 15:21

http://www.codeproject.com/KB/codegen/WCFWrapperUsingT4.aspx

 

비주얼 스튜디오에 내장된 코드 생성기인 T4를 사용하여 WCF 클라이언트 래퍼 코드를 생성하는 방법에 대해 설명합니다.

:

미리 보는 MSDN 라이브러리의 변화

RTFM/기타 2010. 6. 20. 15:18

http://weblogs.asp.net/scottgu/archive/2010/06/15/preview-of-msdn-library-changes.aspx

 

본 포스트에서는 현재 두 가지의 변경사항에 대해 언급하고 있습니다.

1. 간소화된 네임스페이스 탐색

2. 클래스의 오버뷰 페이지의 멤버 페이지를 하나로 통합

:

비주얼 스튜디오 2010 응용프로그램 수명주기 관리 – 작업 항목 관리

RTFM/Visual Studio 2010. 6. 20. 15:14

http://www.c-sharpcorner.com/UploadFile/sanks/1644/Default.aspx

 

TFS에서 작업 항목을 소스의 변경사항과 연결하거나, 작업 항목에 대한 쿼리를 작성하는 등의, 작업 항목에 대한 기본 튜토리얼입니다.

:

WCF 4.0의 새로운 기능

RTFM/WCF 2010. 6. 20. 15:10

http://www.c-sharpcorner.com/UploadFile/john_charles/1486/

 

  • 간편해진 환경설정
  • 표준 끝점(end point) 지원
  • SVC 파일이 필요 없는 IIS 호스팅
  • WS-Discovery 지원
  • 라우팅 서비스
  • REST 지원 강화
  • 향상된 WF 통합
:

쉐어포인트와 닷넷의 통합

RTFM/Sharepoint 2010. 6. 20. 14:53

http://www.codeproject.com/KB/aspnet/WSS_Integration_Dot_Net.aspx

 

쉐어포인트와 닷넷을 연동하기 위한 방법에는 세 가지가 있습니다.

1. 쉐어포인트가 제공하는 웹 서비스를 이용

--> 구현이 복잡함

1

 

2. 쉐어포인트의 객체 모델을 사용

--> 쉐어포인트가 설치된 서버에서만 동작

2

 

3. 쉐어포인트의 객체 모델을 래퍼하는 웹 서비스를 작성

--> 통상적으로 권장되는 구조

3

:

제네릭 WCF 호스트와 클라이언트

RTFM/WCF 2010. 5. 3. 13:48

http://www.codeproject.com/KB/WCF/GenericWcfServiceHostAndC.aspx?msg=3458979#xx3458979xx

GenericWcfServiceHostAndClient

WCF 서비스를 호스팅하고 사용하기 위한 범용 프레임웍입니다.

비주얼 스튜디오를 사용하는 것 보다 가볍고 편리하게 사용할 수 있습니다.

주요 기능은 다음과 같습니다.

  • Fast net.tcp binding
  • Windows credentials and authentication
  • Encrypted and signed transport (no packet sniffing allowed)
  • Simplified configuration (hide everything I don't want to see)
  • Windows Service host that behaves like a Console app when I'm debugging
  • Dynamic loading of the service (no changes to the host code to add a new service)
  • Generic client so I don't have to write or generate proxy code
  • Client that is truly IDisposable (hide Abort vs Close for me)
  • Long timeout in DEBUG mode so I can really take my time while debugging
  • Inclusion of exception details in DEBUG mode only
  • Base service class with a simple Authorize method to support multiple Windows groups
  • Support for multiple Windows group authorization
  • Identical configuration for server and client
  • Cached resolution of service plugin service and contract types
  • Minimal number of assemblies (projects) in the solution
  • Keep the implementation of the service hidden from the client
  • :

    VS2010의 정적 코드 분석

    RTFM/Visual Studio 2010. 3. 30. 11:19

    http://visualstudiomagazine.com/articles/2010/03/25/working-with-static-code-analysis.aspx

    잠재적인 위험을 줄여 코드의 품질을 높이기 위한 한 가지 방법은 코드 검사 툴을 적극적으로 활용하는 것입니다.

    비주얼 스튜디오 2008 부터는 이런 툴이 내장되어 있습니다.

    이전 버전을 사용한다면 독립 버전인 FxCop (이름부터가 경찰입니다.^^) 을 사용할 수 있습니다.

    이 툴의 기능을 한 마디로 요약하자면, 대상 코드가 MS의 닷넷 설계 지침에 얼마나 부합하는지를 검사하는 툴이라고 할 수 있겠습니다.

    :

    연관 하위 쿼리 vs. case 문

    RTFM/SQL 2010. 3. 30. 11:06

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

    동일한 쿼리를 연관 하위 쿼리와 case 문으로 각각 작성한 후 그 효율성을 비교합니다.

    지루한 테스트 결과를 건너뛰고 결론을 말씀 드리자면, case 문의 압승입니다.

    다만 (언제나 그렇듯이) 사족이 붙습니다.

    ‘물론 절대적인 결과는 아니며, 상황에 따라 다를 수 있습니다.’

    :