Windows 서비스 애플리케이션 소개Introduction to Windows Service Applications

과거에 NT 서비스라고 불리던 Microsoft Windows 서비스를 사용하면 고유한 Windows 세션에서 장시간 실행되는 애플리케이션을 만들 수 있습니다.Microsoft Windows services, formerly known as NT services, enable you to create long-running executable applications that run in their own Windows sessions. 이러한 서비스는 컴퓨터가 부팅될 때 자동으로 시작될 수 있고, 일시 중지 및 다시 시작할 수 있으며, 사용자 인터페이스를 표시하지 않습니다.These services can be automatically started when the computer boots, can be paused and restarted, and do not show any user interface. 이러한 특징 때문에 서버에서 사용하거나 같은 컴퓨터에서 작업하는 다른 사용자를 방해하지 않는 장기 실행 기능이 필요한 경우 유용합니다.These features make services ideal for use on a server or whenever you need long-running functionality that does not interfere with other users who are working on the same computer. 로그온한 사용자나 기본 컴퓨터 계정과 다른 특정 사용자 계정의 보안 컨텍스트에서 서비스를 실행할 수도 있습니다.You can also run services in the security context of a specific user account that is different from the logged-on user or the default computer account. 서비스 및 Windows 세션에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요.For more information about services and Windows sessions, see the Windows SDK documentation.

서비스로 설치되는 애플리케이션을 만들어 서비스를 쉽게 만들 수 있습니다.You can easily create services by creating an application that is installed as a service. 예를 들어 성능 카운터 데이터를 모니터링하고 임계값에 대응하려 한다고 가정합니다.For example, suppose you want to monitor performance counter data and react to threshold values. 이 경우 성능 카운터 데이터를 수신하고, 애플리케이션을 배포하고, 데이터 수집 및 분석을 시작하는 Windows 서비스 애플리케이션을 만들 수 있습니다.You could write a Windows Service application that listens to the performance counter data, deploy the application, and begin collecting and analyzing data.

서비스를 Microsoft Visual Studio 프로젝트로 만들고, 서비스로 전송할 수 있는 명령과 해당 명령이 수신될 때 수행할 작업을 제어하는 코드를 서비스 내에 정의합니다.You create your service as a Microsoft Visual Studio project, defining code within it that controls what commands can be sent to the service and what actions should be taken when those commands are received. 서비스에 전송할 수 있는 명령은 서비스를 시작, 일시 중지, 다시 시작 및 중지하는 등의 명령이며, 사용자 지정 명령을 실행할 수도 있습니다.Commands that can be sent to a service include starting, pausing, resuming, and stopping the service; you can also execute custom commands.

애플리케이션을 만들고 빌드한 후 명령줄 유틸리티 InstallUtil.exe를 실행하고 서비스의 실행 파일 경로를 전달하여 애플리케이션을 설치할 수 있습니다.After you create and build the application, you can install it by running the command-line utility InstallUtil.exe and passing the path to the service's executable file. 그런 다음, 서비스 제어 관리자를 사용하여 서비스를 시작, 중지, 일시 중지, 다시 시작 및 구성할 수 있습니다.You can then use the Services Control Manager to start, stop, pause, resume, and configure your service. 서버 탐색기서비스 노드를 통해서나 ServiceController 클래스를 사용하여 같은 작업을 대부분 수행할 수도 있습니다.You can also accomplish many of these same tasks in the Services node in Server Explorer or by using the ServiceController class.

서비스 애플리케이션 및 기타 Visual Studio 애플리케이션Service Applications vs. Other Visual Studio Applications

서비스 애플리케이션은 다른 여러 프로젝트 유형과는 다음의 여러 가지 면에서 다르게 작동합니다.Service applications function differently from many other project types in several ways:

  • 서비스 애플리케이션 프로젝트에서 생성하는 컴파일된 실행 파일을 서버에 설치해야만 프로젝트가 의미 있는 방식으로 작동할 수 있습니다.The compiled executable file that a service application project creates must be installed on the server before the project can function in a meaningful way. F5 키 또는 F11 키를 눌러 서비스 애플리케이션을 디버그하거나 실행할 수 없습니다. 즉, 서비스를 즉시 실행하거나 코드를 한 단계씩 실행할 수 없습니다.You cannot debug or run a service application by pressing F5 or F11; you cannot immediately run a service or step into its code. 대신 서비스를 설치하고 시작한 다음, 서비스의 프로세스에 디버거를 연결해야 합니다.Instead, you must install and start your service, and then attach a debugger to the service's process. 자세한 내용은 방법: Windows 서비스 애플리케이션 디버그를 참조하세요.For more information, see How to: Debug Windows Service Applications.

  • 일부 프로젝트 유형과 달리 서비스 애플리케이션의 경우 설치 구성 요소를 만들어야 합니다.Unlike some types of projects, you must create installation components for service applications. 설치 구성 요소는 서버에 서비스를 설치 및 등록하고 Windows 서비스 제어 관리자를 사용하여 서비스에 대한 항목을 만듭니다.The installation components install and register the service on the server and create an entry for your service with the Windows Services Control Manager. 자세한 내용은 방법: 서비스 애플리케이션에 설치 관리자 추가를 참조하세요.For more information, see How to: Add Installers to Your Service Application.

  • 서비스 애플리케이션의 Main 메서드는 프로젝트에 포함된 서비스에 대해 Run 명령을 실행해야 합니다.The Main method for your service application must issue the Run command for the services your project contains. Run 메서드는 해당 서버의 서비스 제어 관리자로 서비스를 로드합니다.The Run method loads the services into the Services Control Manager on the appropriate server. Windows 서비스 프로젝트 템플릿을 사용하는 경우에는 이 메서드가 자동으로 작성됩니다.If you use the Windows Services project template, this method is written for you automatically. 서비스 로드는 서비스 시작과 같은 작업이 아닙니다.Note that loading a service is not the same thing as starting the service. 자세한 내용은 아래에서 “서비스 수명”을 참조하세요.See "Service Lifetime" below for more information.

  • Windows 서비스 애플리케이션은 로그온한 사용자의 대화형 스테이션과 다른 윈도우 스테이션에서 실행됩니다.Windows Service applications run in a different window station than the interactive station of the logged-on user. 윈도우 스테이션은 클립보드, 전역 아톰 집합 및 데스크톱 개체 집합을 포함하는 보안 개체입니다.A window station is a secure object that contains a Clipboard, a set of global atoms, and a group of desktop objects. Windows 서비스의 스테이션은 대화형 스테이션이 아니므로 Windows 서비스 애플리케이션 내에서 대화 상자가 발생할 경우 대화 상자가 표시되지 않으며 프로그램이 응답하지 않게 될 수 있습니다.Because the station of the Windows service is not an interactive station, dialog boxes raised from within a Windows service application will not be seen and may cause your program to stop responding. 마찬가지로 오류 메시지는 사용자 인터페이스에서 발생하지 않고 Windows 이벤트 로그에 기록됩니다.Similarly, error messages should be logged in the Windows event log rather than raised in the user interface.

    .NET Framework에서 지원하는 Windows 서비스 클래스는 대화형 스테이션 즉, 로그인한 사용자와의 상호 작용을 지원하지 않습니다.The Windows service classes supported by the .NET Framework do not support interaction with interactive stations, that is, the logged-on user. 또한 .NET Framework에는 스테이션 및 데스크톱을 나타내는 클래스가 포함되어 있지 않습니다.The .NET Framework also does not include classes that represent stations and desktops. Windows 서비스가 다른 스테이션과 상호 작용해야 하는 경우 관리되지 않는 Windows API에 액세스해야 합니다.If your Windows service must interact with other stations, you will need to access the unmanaged Windows API. 자세한 내용은 Windows SDK 설명서를 참조하세요.For more information, see the Windows SDK documentation.

    사용자 또는 다른 스테이션과 Windows 서비스의 상호 작용은 로그온한 사용자나 예기치 않은 데스크톱 개체 집합이 있는 사용자가 없는 등과 같은 시나리오를 포함하도록 주의해서 설계해야 합니다.The interaction of the Windows service with the user or other stations must be carefully designed to include scenarios such as there being no logged on user, or the user having an unexpected set of desktop objects. 때로는 사용자의 제어하에서 실행되는 Windows 애플리케이션을 작성하는 것이 더 적절할 수 있습니다.In some cases, it may be more appropriate to write a Windows application that runs under the control of the user.

  • Windows 서비스 애플리케이션은 자체 보안 컨텍스트에서 실행되며 설치된 Windows 컴퓨터에 사용자가 로그인하기 전에 시작됩니다.Windows service applications run in their own security context and are started before the user logs into the Windows computer on which they are installed. 서비스를 실행할 사용자 계정을 계획할 때는 신중해야 합니다. 시스템 계정에서 실행되는 서비스가 사용자 계정에서 실행되는 서비스보다 권한이 많습니다.You should plan carefully what user account to run the service within; a service running under the system account has more permissions and privileges than a user account.

서비스 수명Service Lifetime

서비스는 수명 동안 여러 내부 상태를 거칩니다.A service goes through several internal states in its lifetime. 먼저 서비스가 실행될 시스템에 설치됩니다.First, the service is installed onto the system on which it will run. 이 프로세스에서는 서비스 프로젝트의 설치 관리자를 실행하고 서비스를 해당 컴퓨터의 서비스 제어 관리자로 로드합니다.This process executes the installers for the service project and loads the service into the Services Control Manager for that computer. 서비스 제어 관리자는 Windows에서 제공하는 중앙 유틸리티로, 서비스를 관리합니다.The Services Control Manager is the central utility provided by Windows to administer services.

서비스가 로드되면 서비스를 시작해야 합니다.After the service has been loaded, it must be started. 서비스를 시작하면 서비스가 작동하기 시작합니다.Starting the service allows it to begin functioning. 서비스 제어 관리자서버 탐색기에서 또는 코드에서 Start 메서드를 호출하여 서비스를 시작할 수 있습니다.You can start a service from the Services Control Manager, from Server Explorer, or from code by calling the Start method. Start 메서드는 처리를 애플리케이션의 OnStart 메서드에 전달하고 해당 메서드에서 정의한 코드를 처리합니다.The Start method passes processing to the application's OnStart method and processes any code you have defined there.

실행 중인 서비스는 중지 또는 일시 중지되거나 컴퓨터가 종료될 때까지 이 상태로 무기한 유지될 수 있습니다.A running service can exist in this state indefinitely until it is either stopped or paused or until the computer shuts down. 서비스 상태는 Running , Paused 또는 Stopped의 세 가지 기본 상태 중 하나일 수 있습니다.A service can exist in one of three basic states: Running, Paused, or Stopped. 또한 서비스에서 보류 중인 명령의 상태를 ContinuePending , PausePending , StartPending, StopPending 등으로 보고할 수도 있습니다.The service can also report the state of a pending command: ContinuePending, PausePending, StartPending, or StopPending. 이러한 상태는 실행 중인 서비스를 일시 중지하는 명령 등과 같은 명령이 실행되었지만 아직 수행되지 않았음을 나타냅니다.These statuses indicate that a command has been issued, such as a command to pause a running service, but has not been carried out yet. Status을 쿼리하여 서비스의 상태를 확인하거나 WaitForStatus를 사용하여 이러한 상태가 발생할 경우 작업을 수행할 수 있습니다.You can query the Status to determine what state a service is in, or use the WaitForStatus to carry out an action when any of these states occurs.

서비스 제어 관리자서버 탐색기에서 또는 코드에서 메서드를 호출하여 서비스를 일시 중지, 중지 또는 다시 시작할 수 있습니다.You can pause, stop, or resume a service from the Services Control Manager, from Server Explorer, or by calling methods in code. 이러한 각 작업은 서비스의 관련 프로시저(OnStop , OnPause 또는 OnContinue)를 호출할 수 있으며, 이러한 프로시저 내에 서비스 상태가 변경될 때 수행할 추가 처리를 정의할 수 있습니다.Each of these actions can call an associated procedure in the service (OnStop, OnPause, or OnContinue), in which you can define additional processing to be performed when the service changes state.

서비스 유형Types of Services

.NET Framework을 사용하여 Visual Studio에서 만들 수 있는 서비스 유형은 두 가지입니다.There are two types of services you can create in Visual Studio using the .NET Framework. 프로세스의 유일한 서비스인 경우 Win32OwnProcess 유형이 할당됩니다.Services that are the only service in a process are assigned the type Win32OwnProcess. 다른 서비스와 프로세스를 공유하는 서비스에는 Win32ShareProcess 유형이 할당됩니다.Services that share a process with another service are assigned the type Win32ShareProcess. ServiceType 속성을 쿼리하여 서비스 유형을 검색할 수 있습니다.You can retrieve the service type by querying the ServiceType property.

Visual Studio에서 만들지 않은 기존 서비스를 쿼리하면 다른 서비스 유형도 가끔 볼 수 있습니다.You might occasionally see other service types if you query existing services that were not created in Visual Studio. 이에 대한 자세한 내용은 ServiceType을 참조하세요.For more information on these, see the ServiceType.

서비스 및 ServiceController 구성 요소Services and the ServiceController Component

ServiceController 구성 요소는 설치된 서비스에 연결하고 서비스 상태를 조작하는 데 사용됩니다. ServiceController 구성 요소를 사용하면 서비스를 시작 및 중지하고, 서비스 작동을 일시 중지하거나 계속하고, 서비스에 사용자 지정 명령을 전송할 수 있습니다.The ServiceController component is used to connect to an installed service and manipulate its state; using a ServiceController component, you can start and stop a service, pause and continue its functioning, and send custom commands to a service. 하지만 서비스 애플리케이션을 만들 때는 ServiceController 구성 요소를 사용할 필요가 없습니다.However, you do not need to use a ServiceController component when you create a service application. 실제로 대부분의 경우 ServiceController 구성 요소는 서비스를 정의하는 Windows 서비스 애플리케이션과 별도의 애플리케이션에 있어야 합니다.In fact, in most cases your ServiceController component should exist in a separate application from the Windows service application that defines your service.

자세한 내용은 ServiceController를 참조하세요.For more information, see ServiceController.

요구 사항Requirements

  • 서비스는 Windows 서비스 애플리케이션 프로젝트나 다른 .NET Framework 지원 프로젝트에서 만들어야 합니다. 이러한 프로젝트는 빌드될 때 .exe 파일을 생성하고 ServiceBase 클래스에서 상속됩니다.Services must be created in a Windows Service application project or another .NET Framework–enabled project that creates an .exe file when built and inherits from the ServiceBase class.

  • Windows 서비스를 포함하는 프로젝트에는 프로젝트 및 해당 서비스에 대한 설치 구성 요소가 있어야 합니다.Projects containing Windows services must have installation components for the project and its services. 이 작업은 속성 창에서 간단히 수행할 수 있습니다.This can be easily accomplished from the Properties window. 자세한 내용은 방법: 서비스 애플리케이션에 설치 관리자 추가를 참조하세요.For more information, see How to: Add Installers to Your Service Application.

참조See also