본문 바로가기

IT 살이/04. 기술 - 프로그래밍

AppDomainManager, Hosting Process.....

오늘은 특별한 팁이나 해결책을 적으려는 것은 아니다. 다만 현재 진행하고 있는 프로젝트에서 논의되었던 얘기에 대해서 고민한 내용을 정리해 보려고 한다.

■상황

현재 달봉이가 참여하고 있는 L기업의 프로젝트는 일반 SI 프로젝트이기는 하지만 좋다는 솔루션은 다 투입된 것 같다. 그래서 그것을 통합하고 테스트하는데 상당한 시간이 투입되고 있다.
업무 ERP 시스템은 스마트클라이언트로 개발하고 있는데, 달봉이가 하는 주요 역할은 스마트클라이언트 어플리케이션 프레임웤과 그리고 어플리케이션 배포다. 스마트클라이언트의 Shell 형태는 윈도우 폼 실행 프로그램이고 배포 방식은 ClickOnce를 사용하고 있다. 어플리케이션이 클라이언트에 설치되는 모드는 "인스톨 모드" 즉 어플리케이션 실행이 온라인으로도 가능하고 "시작-> 모든 프로그램"의 바로가기를 통해서도 가능하다.
현재 EP 사이트가 별도로 존재하고 있고 최종 사용자들중 많은 사람들이 EP 사이트에 있는 링크를 통해서 스마트클라이언트 어플리케이션을 실행시키게 된다. 뿐만 아니라 EP쪽에 있는 어떤 링크들은 스마트클라이언트가 시작되면서 로딩할 최초 페이지에 대한 ID도 넘겨줄 수 있도록 되어 있다.  시작메뉴ID가 넘어오는 경우 스마트클라이언트의 프레임워크에서는 그 ID를 인식하고 ID에 해당하는 페이지를 동적으로 로딩시켜주게 된다.

■요구 사항

요구 사항은 이렇다. 스마트클라이언트 어플리케이션이 이미 실행되고 있는 상황에서 EP나 기타 웹 페이지에서 페이지 ID를 가지고 있는 링크가 클릭되면 새로운 스마트클라이언트 어플리케이션 프로세스를 생성하지 않고 기존에 실행되고 있는 스마트클라이언트 어플리케이션에서 링크에 추가된 페이지만을 새로 로딩할 수 있겠느냐는 것이다.

[그림] 요구사항


■ 방안

[그림] 방안

두가지 방안이 논의되었다. 첫번째 논의된 방안은 웹 페이지와 스마트클라이언트에서 공유할 수 있는 저장 공간을 이용하는 방법이었다. 웹 페이지에서는 컨트롤(액티브 X 컨트롤이던 임베딩된 스마트클라이언트 컨트롤이던)에 의해서 공용 저장소에 페이지ID를 저장해두고 스마트클라이언트 어플리케이션에서는 공용 저장소를 계속 폴링하는 구조로 만들어서 새로운 페이지 ID가 저장소에서 발견되면 스마트클라이언트는 그 ID에 해당하는 페이지를 로딩하도록 하자는 것이었다.  두번째 방안은 웹 페이지의 컨트롤과 스마트클라이언트간에 IPC 통신을 통해서 직접 페이지ID를 전달하자는 것이었다. 

둘 다 가능한 방법들이었다. 그러나 적용되지는 않았다. 왜? 그렇게 중요한 이슈도 아니었고, 시간도 없었다. 쿵야!!

■세번째 방안

근데, 달봉이가 얼른 떠올린 것은 AppDomain 생성을 직접 제어할 수 있으면 어떻게 될까 하는 것이었다. AppDomain생성에 개발자가 참여할 수 있다는 것까지는 알고 있었기 때문이었다. AppDomain의 CreateDomain()을 이용하면, 원하는 이름의 AppDomain이 이미 생성되어 있을 경우  AppDomain을 새로 생성하지 않고 기존의 것을 반환하는 방법을 사용하면 어플리케이션을 중복해서 생성하지 않을 수 있을 것이라 생각이 얼른 들었다.

어플리케이션 도메인 관리자(AppDomainManager)는 하나의 프로세스에 생성되는 어플리케이션 도메인을 관리하는 클래스로서 이 관리자를 확장하면 CLR이 어플리케이션 도메인을 생성하는 과정에 직접 참여할 수 있게 된다. 

그러나 생각해보니 힘들다는 것을 알게 되었다.

어플리케이션 도메인은 프로세스내에 생성된다. 따라서 어플리케이션 생성을 커스터마이징하기 전에 그 도메인이 포함되어 있는 프로세스를 알 필요가 있다. 즉 프로세스 정보를 읽고 관리하는 호스팅 프로그램이 있어야 한다. 이런 작업은 AppDomainManager가 할 수 없다. 현재 생성되어 있는 스마트클라이언트 어플리케이션 도메인이 포함된 프로세스를 선택해서 그 프로세스에 다시 어플리케이션 도메인을 생성하는 작업은 어플리케이션 도메인 관리자(AppDomainManager)에서는 불가능하다.

이렇게 프로세스를 관리해서 하나의 프로세스에 복수개의 어플리케이션 도메인을 생성하기 위해서는 Hosting Process 프로그램을 작성해야 한다. 이것은 하나의 프로세스에 여러 개의 어플리케이션을 구동할 수 있는 프로그램이다. ASP.NET도 일종의 Hosting Process 프로그램이고 개발자가 흔히 사용하는 Visual Studio 2005도 Hosting Process 프로그램이다.

이것을 만든다는 것은 벼룩 잡으려다 초간 삼간 태우는 격이다. 현업과 업무적으로 해결하는 것이 빠르다. 크윽!!

■부연

Hosting Process 을 구현하는 방법을 알아보다 다음과 같은 흥미로운 아티클을 찾게 되었다.

Hosting the ASP.NET runtime in your own application( http://www.microsoft.com/belux/msdn/nl/community/c... )

ASP.NET 런타임을 클라이언트측의 프로그램에서 호스팅하는 방법에 대한 이야기이다.