
.NET Framework 에서 Service 개발
처음 .NET Framework 에서 서비스를 개발 할 당시에는 당연하게 Windows 서버를 기반으로 사용하기 때문에 Windows Service Template 를 기반으로 개발을 하면 된다고 생각했었다. (이걸 2022년도에 글을 쓰고 있으니 아련하게 떠오른다)
.NET Framework 에서 Windows Service 개발 템플릿을 선택하여 Worker 프로젝트를 만든다.

static void Main(string[] args)
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
new MyNewService(args)
};
ServiceBase.Run(ServicesToRun);
}
public partial class MyNewService : ServiceBase
{
public MyNewService(string[] args)
{
InitializeComponent();
// To do something..
}
}
위와 같은 코드의 시작으로 쉽게 Windows Service 에 올릴 수 있는 프로그램이 만들어지는 형태로 제작을 했다.
디버그 하려고 F5 누르게 되면 실행이 안되기 때문에, 좀 번거로운 과정을 거쳐야만 했다. 이 과정에서 net.exe
명령어와 sc.exe
명령어를 잘 알게 되었다.
개발 하려고 했던 모든 Worker들은 Queue 메시지를 소비하는 역할을 기본으로 해야 하기에, Message Queue 서버에 연결 되어 항상 큐서버를 바라보는 Consume 역할을 해야만 했다.
.NET Framework로 Service 프로젝트 만들 때 중요한 몇 가지 요소가
- (서비스에서) 실행하는 권한 주체에 대한 설정 (권한 문제)
- 디버그의 어려움 (F5 실행 X)
- 이벤트 로그 설정 혹은 logger 를 활용하여 디버그 활용 필수
- 프로그램의 실행과 서비스의 실행을 분리 하는 개념이 필수
특히 권한에 대해서 잘 이해하고, 프로그램이 동작할 때 원하는 보안을 적절하게 부여해야만 했다.
- User - 네트워크의 단일 사용자가 지정한 계정의 컨텐스트에서 서비스가 설치 및 실행될 때 시스템에서 유효한 사용자 이름과 암호를 묻는 메시지를 표시합니다.
- LocalService - 로컬 컴퓨터에서 권한 없는 사용자의 역할을 하며 원격 서버에 익명 자격 증명을 제공하는 계정의 컨텍스트에서 실행됩니다.
- LocalSystem - 광범위한 로컬 권한을 제공하며 원격 서버에 컴퓨터의 자격 증명을 제공하는 계정의 컨텍스트에서 실행됩니다.
- NetworkService - 로컬 컴퓨터에서 권한 없는 사용자 역할을 하며 원격 서버에 컴퓨터의 자격 증명을 제공하는 계정의 컨텍스트에서 실행됩니다.
또한 개발하는 과정에서 Windows Service 프로젝트의 이벤트들 OnStart
및 OnStop
의 코드 구현을 해야 했는데,
Windows Service 가 시작될 때에 실행 되는 시점 = OnStart
Windows Service 가 종료될 때에 실행 되는 시점 = OnStop
이런 내용이라서 Exception 발생이 되었을 때 서비스가 중지 되는 상태가 되었다.
그래서 다음 코드에는 OnStart나 OnStop이 없고, Queue 연결에 대한 부분부터 소비되어 처리까지 서비스 실행 내부에 구현을 하게 되었다. 물론 모든 것은 다 트레이드 오프이기 때문에 장단점이 존재하는 것은 어쩔 수 없었다.
자세하게 설명을 하지 못하는 것은 이미 .NET Framework 쪽 코드는 오래 되었으며, 공개하기 까다롭고, 새롭게 만들고 싶지 않으며, 사실 지금에 와서는 .NET Framework 관련된 내용은 효용 가치가 크게 중요하지 않게 되버린게 주요한 것 같다.
Rerferences
