.NET 기술을 활용한 Worker 서비스 개발기 -2-

.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 프로젝트 만들 때  중요한 몇 가지 요소가

  1. (서비스에서) 실행하는 권한 주체에 대한 설정 (권한 문제)
  2. 디버그의 어려움 (F5 실행 X)
  3. 이벤트 로그 설정 혹은 logger 를 활용하여 디버그 활용 필수
  4. 프로그램의 실행과 서비스의 실행을 분리 하는 개념이 필수

특히 권한에 대해서 잘 이해하고, 프로그램이 동작할 때 원하는 보안을 적절하게 부여해야만 했다.

  • User - 네트워크의 단일 사용자가 지정한 계정의 컨텐스트에서 서비스가 설치 및 실행될 때 시스템에서 유효한 사용자 이름과 암호를 묻는 메시지를 표시합니다.
  • LocalService - 로컬 컴퓨터에서 권한 없는 사용자의 역할을 하며 원격 서버에 익명 자격 증명을 제공하는 계정의 컨텍스트에서 실행됩니다.
  • LocalSystem - 광범위한 로컬 권한을 제공하며 원격 서버에 컴퓨터의 자격 증명을 제공하는 계정의 컨텍스트에서 실행됩니다.
  • NetworkService - 로컬 컴퓨터에서 권한 없는 사용자 역할을 하며 원격 서버에 컴퓨터의 자격 증명을 제공하는 계정의 컨텍스트에서 실행됩니다.

또한 개발하는 과정에서 Windows Service 프로젝트의 이벤트들 OnStartOnStop의 코드 구현을 해야 했는데,  
Windows Service 가 시작될 때에 실행 되는 시점 = OnStart
Windows Service 가 종료될 때에 실행 되는 시점 = OnStop
이런 내용이라서 Exception 발생이 되었을 때 서비스가 중지 되는 상태가 되었다.

그래서 다음 코드에는 OnStart나 OnStop이 없고,  Queue 연결에 대한 부분부터 소비되어 처리까지 서비스 실행 내부에 구현을 하게 되었다. 물론 모든 것은 다 트레이드 오프이기 때문에 장단점이 존재하는 것은 어쩔 수 없었다.

자세하게 설명을 하지 못하는 것은 이미 .NET Framework 쪽 코드는 오래 되었으며, 공개하기 까다롭고, 새롭게 만들고 싶지 않으며, 사실 지금에 와서는 .NET Framework 관련된 내용은 효용 가치가 크게 중요하지 않게 되버린게 주요한 것 같다.

Rerferences

Developing Windows Service Applications - .NET Framework
See links to articles that explain how to develop Windows service apps by using Visual Studio or the .NET SDK.