원본 비디오(YouTube) 보기 (9 min): 아래 원본 비디오에는 이 요약글 보다 더 자세한 예시와 설명이 있습니다.
DelphiCon 의 2023 시리즈 중, "A quick look at the Benefits of Windows Services" - Ian Barker (10 min) 의 한글 요약본입니다.
- 이 세션에서는 윈도우 서비스의 장점과 델파이에서 활용하는 방법을 요점 위주로 살펴봅니다.
발표자
- Ian Barker
- 엠바카데로 MVP
발표자료 등이 있는 링크
윈도우 서비스
-
서비스가 필요한 상횡에서 매우 유용하다.
- 참고로, 서비스가 모든 앱에서 필요한 것은 아니다.
윈도우 서비스의 특징
- 사용자가 로그아웃을 해도 계속 실행될 수 있다 (일반 윈도우 애플리케이션이라면 이런 경우에는 작동할 수 없다).
- 서버에서든, 일반 PC에서든 모두 작동한다.
- 백그라운드에서 실행될 수 있다 (백신 즉, Antivirus 소프트웨어가 대표적이다).
- 중요한 기능을 하는 많은 소프트웨어에서 사용된다 (웹서버 등).
- 웹서버 애플리케이션 등 서버 등에서 사용자가 직접적으로 사용하지 않는 유형의 소프트웨어를 실행할 때 특히 유용하다.
윈도우 서비스 기동(start up)하기
- 컴퓨터가 시작될 때 해당 윈도우 서비스가 자동으로 시작되도록 할 수 있다 (기본 설정은 자동 시작이다).
- 또는 수동으로 시작하도록 지정할 수도 있다.
윈도우 서비스 실행 주체(사용자)
- 'service user'라고 하는 '가공된' 사용자가 주체가 된다.
- 하지만, 주체(사용자)를 직접 지정하여 덮어쓸 수도 있다 (특정 사용자, 네트워크, 로컬 시스템 계정 등).
-
대체로 서버가 아니라 일반 PC에 설치하는 경우, 로컬 시스템 계정을 사용한다. 그러면,
- 경고 창 등 PC의 모든 서비스와 상호작용할 수 있도록 할 것인지를 선택할 수 있다.
- 로컬 시스템 계정이 아닌 다른 계정도 지정할 수 있으므로, 상황에 맞게 지정하면 된다.
RAD 스튜디오를 사용해 윈도우 서비스를 만드는 방법은 간단하다
- 메인 메뉴>File>New>Windows>Windows service를 선택한다.
-
아래 메시지는VCL을 사용할 지를 묻는 것이다. 이 창에서는 "Yes"를 클릭한다 (VCL을 사용할 필요가 있기 때문)
-
그러면 빈 윈도우 서비스가 만들어 진다.
-
위와 같이 기본 골력이 생성된다.
- 즉, 모든 서비스에 있어야 하는 기본 기능 즉 서비스 시작, 일시 중지, 정지 등이 완성되어 있다.
- 다만, 기본 기능 외에 다만 실제 서비스 내용은 비어있다.
윈도우 서비스를 위한 중요한 유닛과 TService 클래스
-
위 그림과 같이 자동 생성된 유닛 안에 있는 TService 클래스를 활용하면 된다.
- 빈 유닛(폼)이 자동으로 생기는데, 여기에서 Object Inspector 창 안에서 Events 탭을 보면 OnStart, OnStop, OnExecute, OnPause 이벤트가 있다.
- 즉, 윈도우 서비스에서 활용할 수 있는 것들이다. 이름에서 알 수 있듯이, 서비스가 시작될 때, 중단될 때, 실행될 때, 일시 정지될 때, 무엇을 할 것인지를 각 알맞은 이벤트 핸들러에 넣으면 된다.
윈도우 서비스를 만들 때 실무 팁
-
프로퍼티 중 Name과 DisplayName를 직접 알맞은 이름으로 명시하면 좋다.
- 그러면, 윈도우 서비스 관리자(Windows Service Manager) 창에서 식별하기 쉽다 (특히 버그 해소 작업 시 필요할 것이다).
윈도우 서비스에 대한 설명 붙이기
윈도우 서비스 관리자 창의 서비스 목록 화면에서 설명(discription)에 해당 서비스에 대한 설명이 표시되도록 할 수 있다.
윈도우 서비스에 설명이 표시되지 않으면, 윈도우 서비스 관리자를 보는 사람들은 해당 서비스가 무엇을 하는 것인지를 전혀 알 수 없다.
그래서 이름만 보고 추측을 하게 되는데, 이 때 서비스 이름이 바이러스 이름 같아 보인다면, 걱정이 되어 해당 서비스를 삭제해 버릴 수도 있을 것이다.
내 윈도우 서비스에 설명을 붙이는 방법은 간단하다.
- OnAfterInstall 이벤트의 핸들러에 위 그림과 같이 코드를 넣으면 된다. 레지스트리 키 항목을 추가하는 간단한 코드이다.
윈도우 서비스 설치하기
-
윈도우 서비스는 대부분 Administrator 계정으로 설치해야 한다.
-
권한이 없는 사용자가 설치를 시도하면 아래 그림과 같이 (일반 사용자는 윈도우 서비스를 설치할 수 없다는) 접근 불가 에러가 표시된다.
-
권한이 없는 사용자가 설치를 시도하면 아래 그림과 같이 (일반 사용자는 윈도우 서비스를 설치할 수 없다는) 접근 불가 에러가 표시된다.
-
윈도우 서비스를 Administrator 계정으로 설치하려면, Admin용 콘솔 창에서 설치를 진행해야 한다.
- Admin 계정으로 명령 창을 열려면,
- 윈도우 메뉴>작업 관리자를 선택>명령창을 선택하면 관리자 계정으로 실행 (Run As Administrator)을 선택할 수 있는 창이 표시된다.
-
아래 그림 처럼 관리자 권한으로 콘솔창을 열고, 맨 아랫 줄처럼 입력한다.
- 실행 파일이름 (위 예에서는, example_windows_service.exe)을 적고 한칸 띄고, /install을 적고 나서 엔터키를 친다.
- (권한이 있는 사용자라면) 해당 윈도우 서비스가 설치된다. 해당 Admin의 비밀번호 입력이 필요할 수도 있다.
-
성공적으로 설치되면 표시되는 알림
-
설치 스크립트에서 사용되는 옵션
- /INSTALL
- /UNINSTALL
-
/SILENT (위 2개와 섞어서 사용)
- 예를 들어, [ 실행파일명] /INSTALL /SILENT를 실행하면, 설치 중에 많은 대화창이 표시되는 것을 방지할 수 있다.
윈도우 서비스를 수동으로 기동(start) 하기
윈도우 서비스를 설치했다고 해서 실행까지 되는 것은 아니다.
직접 실행하려면, NET START [서비스명]을 입력하고 엔터 키를 친다.
윈도우 서비스가 작동되고 있는 지 확인하기
윈도우 서비스 관리자를 열면 해당 서비스의 상태가 Running이라고 표시될 것이다.
윈도우 서비스 동작을 로그에 남기기
문제가 있어서 서비스가 작동하지 않을 때를 대비하려면 로그를 남기도록 해 놓는 것이 좋다.
사용자와 상호 작용하는 일반적인 앱이 아니기 때문에, 서비스가 어떻게 하고 있는 지를 알기가 힘들기 때문이다.
-
로그 기록용 외부 도구를 사용하면 수준높게 구현할 수 있다.
-
https://github.com/danieleteti/loggerpro
- 매우 좋다
-
https://github.com/grijjy/GrijjyCloudLogger
- 원하는 클라우드에 남길 때 좋다.
-
https://github.com/danieleteti/loggerpro
또는
-
TService.LogMessageMethod를 사용하여 윈도우 이벤트 로그에 남도록 송출할 수 있다.
- 이벤트 로그를 남길 때, 이벤트 로그의 구분 항목 (에러인지 정보인지 등)에 알맞게 내용을 담아서 기록할 수 있다.
- 윈도우 이벤트 로그에 대해서 잘 모른다면 이번 기회에 알아두는 것도 좋다.
또는
-
OutputDebugString 을 사용하여 디버그 콘솔 (Debug Console)에 출력할 수도 있다.
- 위 그림과 같이 파라미터에 문자열을 적어주면 디버그 콘솔에 출력된다.
- 실행되고 있는 일반적인 앱에서는 RAD 스튜디오 IDE 안에서 'Events' 탭을 열면 출력되는 내용을 볼 수 있다.
- IDE를 닫았다면 그리고, 다른 디버그 콘솔 앱을 연다면 OutputDebugString은 그곳에 기록한다.
-
고객의 컴퓨터 안에 RAD 스튜디오의 로깅 앱을 설치할 수는 없을 것이다. 그래도 OutputDebugString을 통해 기록되는 내용을 볼 수 있는 방법이 있다.
-
추천할만 한 도구는 마이크로소프트가 소유한 SysInternals에서 제공하는 DebugView이다.
- 훌륭한 앱이다. 여기에서는 모든 곳에서 나오는 모든 디버그 콘솔 아웃풋을 볼 수 있다.
- https://learn.microsoft.com/en-us/sysinternals/downloads/debugview
-
예를 들면 아래 그림과 같이 어떤 개발자가 만든 프로그램에서 invalid parameter를 전달하려고 하려는 에러가 몇차례 발생했음을 알 수 있다.
- 또한 빨간색 상자 안을 보면, 우리가 앞에서 OutputDebugString 사용하여 남긴 문자열이 표시되고 있다.
-
추천할만 한 도구는 마이크로소프트가 소유한 SysInternals에서 제공하는 DebugView이다.
RAD 스튜디오로는 원하는 거의 모든 것을 할 수 있다.
- 라즈베리파이에서 작동하는 앱을 만들 수도 있다.
- 매우 값싼 아마존 파이어 태블릿에서 작동하는 앱을 만들 수 있다. 그저 RAD 스튜디오에서 안드로이드 앱을 만들면 된다.
- 윈도우, 맥OS(인텔, ARM 둘다), iOS, 안드로이드, 뿐만 아니라 웹용 앱까지도 단일 프로젝트와 코드 베이스에서 만들 수 있다.
-
운영체제 전체가 업그레이드 된 이후에도 여러분이 만든 앱이 여전히 작동하기를 원하는가?
- 새로 다운로드 하거나 재구성을 할 필요없이도 실행되는 것은 델파이로 만든 프로그램에서는 매우 전형적이며, 델파이 만 가진 독특한 점이다.
- 이렇게 할 수 있는 개발 환경은 거의 없다. 다른 개발환경에서는 대부분 런타임과 지원 라이브러리를 업데이트해야 하지만, RAD 스튜디오와 델파이에서는 그럴 필요가 없다.
- 내가 델파이를 선택하는 이유이기도 하다.
Recommended Comments
There are no comments to display.