애플리케이션 도메인

애플리케이션 도메인(application domain)은 공통 언어 기반(CLI) 내에서 실행되는 소프트웨어 애플리케이션을 서로 격리하여 상호 간에 영향을 주지 않도록 하는 데 사용되는 메커니즘(운영체제의 프로세스와 유사함)이다. 각 애플리케이션 도메인은 고유한 가상 주소 공간을 가지며, 해당 주소 공간을 사용하는 애플리케이션 도메인의 리소스 범위를 한정한다.

.NET Core 및 .NET 5+에서는 동일한 프로세스 내에서 여러 애플리케이션 도메인을 생성하는 것이 불가능하다.

 특징 
CLI 애플리케이션 도메인은 하나의 운영체제 프로세스 내에 포함된다. 하나의 프로세스는 여러 개의 애플리케이션 도메인을 포함할 수 있다. 애플리케이션 도메인은 운영체제 프로세스와 유사한 격리 특성을 갖는다.
 단일 애플리케이션 도메인 내에 여러 개의 스레드가 존재할 수 있다.
 동일 프로세스 내의 다른 도메인 상태에 영향을 주지 않고 특정 도메인 내의 애플리케이션을 중지할 수 있다.
 한 도메인의 오류나 예외는 다른 도메인의 애플리케이션에 영향을 주거나 도메인을 호스팅하는 전체 프로세스를 중단시키지 않는다.
 설정 정보는 프로세스 범위가 아닌 도메인 범위의 일부로 취급된다.
 각 도메인에 서로 다른 보안 액세스 수준을 할당할 수 있다.
 한 도메인의 코드는 다른 도메인의 코드에 직접 액세스할 수 없다.

이런 의미에서 CLI는 미니 운영체제와 같다. CLI는 다수의 하위 프로세스, 즉 애플리케이션 도메인을 포함하는 단일 프로세스를 실행한다.

애플리케이션 도메인의 장점은 여러 운영체제 프로세스를 실행하는 것보다 여러 애플리케이션 도메인을 실행하는 것이 메모리와 같은 리소스를 적게 소모할 수 있다는 점이다. 도메인 간의 통신에는 여전히 마샬링이 필요하므로, 오버헤드는 단일 도메인 내 통신보다는 여러 프로세스를 사용하는 경우에 더 가까울 수 있다.

 도메인 간 통신 
애플리케이션 도메인 간에는 직접적인 통신이 불가능하다. 하지만 애플리케이션 도메인은 값에 의한 마샬링(바인딩되지 않은 객체)이나 프록시를 통한 참조에 의한 마샬링(애플리케이션 도메인에 바인딩된 객체)으로 객체를 전달함으로써 서로 통신할 수 있다. 세 번째 유형의 객체는 컨텍스트 바인딩 객체로, 도메인 간뿐만 아니라 자체 애플리케이션 도메인의 컨텍스트 내에서도 참조에 의해 마샬링될 수 있다. 관리 코드의 검증 가능한 타입 안전성 덕분에 CLI는 운영체제 프로세스보다 훨씬 적은 비용으로 도메인 간 결함 격리를 제공할 수 있다. 격리에 사용되는 정적 타입 검증은 운영체제 프로세스가 요구하는 프로세스 전환이나 하드웨어 링 전이가 필요하지 않다.

 관리 코드 
애플리케이션 도메인은 순수하게 관리 코드의 개념이다. 포함된 모든 네이티브/비관리 코드(예: C++)는 기본적으로 이를 인식하지 못한다. 정적 변수는 도메인 간에 공유되는 것처럼 보이며, 콜백은 문제를 일으킬 수 있고, 한 도메인의 메모리 손상 버그는 다른 도메인을 손상시킬 가능성이 높다.

 각주 

 애플리케이션 도메인에 관한 마이크로소프트 개발자 네트워크 페이지
 애플리케이션 도메인 간 비관리 콜백 

분류:소프트웨어 구조
분류:닷넷 용어