윈도우 서비스 카테고리에서 이것 저것 서비스 프로그래밍을 하면서 필요한 것들을 하나 둘 씩 진행해 보았다.

이런 것들을 정리하여, 서비스는 왜 필요한 것이며? 무엇 때문에 사용하는가?
어떻게 동작되며, 과연 어느 순간에 실행되는지...
서비스는 일반 콘솔 프로그램과 무엇이 다른지 하나씩 정리를 해보려한다.


일반적으로 윈도우가 기동되는 과정을 단순화 시키면 아래 그림과 같다.




즉, 서비스 프로그램은 윈도우가 부팅된 이후에, 로그온 되지 않은 상태에서도 구동되어진다는 큰 장점을 가지게 된다.

또한 일반적으로 Local System Account 로 구동되기 때문에 시스템을 제어하는데 필요한 가장 강력한
권한을 가진다고 말할 수 있다. 서비스를 설치할 때 혹은 설치한 이후에 특별하게 로그온에 필요한 사용자를
변경하지 않는 이상 강력한 권한을 행사할 수 있다.

두 번째와 같은 이유로, 비스타 커널 부터 적용되는
시스템 경로에 파일쓰기, 프로그램 파일즈 경로에
파일 쓰기, 로컬 시스템 레지스트리 액세스와 같은
모든 작업에 영향을 받지 않고...


특히나 UAC에 영향을 받지 않는다.


이렇게나 많은 장점이 있는데도 불구하고, 응용 프로그램을 서비스로 작성하지 않는 이유는 무엇일까?

1. GUI를 가질 수 없다.
    -> 서비스 프로그램은 콘솔 어플리케이션과 같은 방식으로 프로그래밍이 되면서도 stdin, stdout, stderr 와 같은
        콘솔 핸들을 가지지 못한다. 즉, 화면상의 출력이란것은 불가능하다.

2. 데스크탑과의 연계가 어렵다.
   -> 로그온 되기 이전에 SYSTEM 계정으로 실행되기 때문에, 특정 로그온된 유저와 연계되어 어떤 작업을 진행
        하려면 까다로운 절차를 거쳐야 한다. 보통 이런걸 무시하기 위해서 보통 SOCKET를 이용해서 통신하기도 하는데
        하여튼 서버계열에서 로그온된 여러 유저와 개별적으로 분리된 통신을 하는건 상당히 피곤한 일이다.

3. 디버깅이 난해하다.
   -> 서비스로 실행되기 때문에 기본적으로 개발툴에서 직접 디버깅하는 것은 않된다.
        이를 위하여, 프로그램에 인자를 주어 debug 모드로 구동될 경우 서비스 핸들러를 거치지 않고 바로
        서비스 메인 함수를 호출하는 방식으로 콘솔 프로그램 처럼 디버깅이 가능하도록 할 수 는 있으나...
        서비스의 동작 특성에 맞도록 완전하게 디버깅 하는 것은 불가능하다.

        그래서, 일반적으로 디버깅을 위해서 별도의 로깅 장치를 만들어 놓고 열심히 써서 디버깅 하기도 한다.

4. 파일 처리나 MMF의 생성 등과 같은 작업에 제약을 받는다.
  -> 서비스에서 파일을 생성하면, Users 그룹은 읽기와 수행 권한만
      기본적으로 제공된다. 
      즉, 수정이나 쓰기 권한은 배재된다.

  -> MMF (Memory Mapped File) 의 경우 서비스에서 생성하게되면
      User 권한에서는 읽기 전용으로 여는 것조차 불가능하다.
     
      CreateFileMapping() 함수의 2번 째 인자..
      LPSECURITY_ATTRIBUTES lpAttributes에 적당한 권한을 채워서
      생성해 주어야 한다. 

      그냥 생성했을 경우, Users 그룹에서 해당 MMF를 오픈하게 되면
      ACCESS DENIED 에러를 만나게 될것이다.

      클라이언트 OS나, 일반 서버용 프로그램들은 거의 Administrators
      그룹에 속한 형태로 실행되기는 하지만, 모두 그러한 것은 아니니까


 


서비스에는 위에서 설명한 장/단점을 포함하여 조금더 많은 제약사항을 가지며, 각종 상태 표시의 까다로움, 난해한 에러 처리... 등등
간단하게 작성하면 이전의 샘플 코드 처럼 아주 쉽게 작성할 수 있고..  세밀하게 처리하려면 윈도우라고 하는 OS 에 대하여 꽤나 많은
지식을 필요로 하게 된다.

-------------------------------------------------------------------------------------------------------------------------

오랜시간 하나의 커다란 프로젝트를 진행하다 보니, 많이 지치고 너무도 구태의연해지는 내 모습에 새로운 활기를 불어 넣어 보고 싶어
강좌라는 이름으로 새롭게 각오를 다지고자 이 글을 쓰게 되었습니다.

머 특출나게 할줄 아는것도 없고, 한가지 분야에 대해 내세울만한 것도 없고.. 이것 저것 생각해 보다 선택한게.. ^^;;;
짬짬히 시간 만들어서 하나씩 진행해 보도록 하겠습니다.






+ Recent posts