.NET 리모팅

.NET 리모팅(.NET Remoting)은 서로 다른 프로세스 영역, 혹은 서로 다른 호스타에 존재하는 모듈간에 정보 교환을 손쉽게 할 수 있는 방법 입니다. 

.NET에서 제공하는 리모팅은 DCOM이나 CORBA의 한계를 극복하고자 나온 것 이라고 할 수 있습니다. 웹 서비스 역시 내부적으로는 리모팅을 사용하고 있으며 사실상 리모팅을 손쉽게 사용할 수 있는 일종의 껍데기에 불과합니다.


.NET 리모팅의 동작 원리

개발자가 기본적으로 작성해야 하는 부분은 서버 객체, 호스팅 어플리케이션, 그리고 클라이언트 어플리케이션 입니다. 수행하고자 하는 서버 작업은 서버 객체가 처리하며, 말 그대로 객체이기 때문에 클라이언트로의 요청을 받아 객체의 생성과 소멸을 처리해주는 대리인이 필요합니다. 이 대리인을 어플리케이션에게 특정 객체를 사용하겠다는 요청을 하면 호스팅 어플리케이션은 먼저 그 객체를 자기가 관리하고 있는지 체크하고 객체를 생성하여 클라이언트와 연결시켜 줍니다. 


원격객체(Remote Object)

리모팅이 나오게 된 가장 큰 목적 중의 하나는 원격 객체의 메서드를 호출하고 결과값을 전달받아 복잡한 과정을 개발자에게 숨기고 단순한 인터페이스를 제공하기 위함입니다. 여기서 원격 객체라 함은 클라이언트와 다른 어플리케이션 도메인에 객체가 존재한다는 의미 입니다.

클라이언트에 객체를 전달하는 방식에는 객체에 대한 참조값만 넘기는 방법과 객체 자체를 넘기는 방법이 있는데, 객체와 클라이언트가 같은 어플리케이션 도메인에 있느냐 아니냐에 따라 어떤 방법을 쓸 것인지가 결정됩니다. 객체와 클라이언트가 같은 어플리 케이션 도메인에 있는 경우에는 객체에 대한 참조값만을 넘김으로써 클라이언트가 그 객체를 사용할 수 있으나, 서로 다른 어플리케이션 도메인에 존재하는 경우에는 반드시 객체 자체를 클라이언트로 전달해야 합니다.

이 때 .NET 프레임워크는 객체를 시리얼라이즈(Serialize)하여 클라이언트에게 전달하고 클라이언트는 그 데이터를 사용하여 객체를 생성합니다. 로컬객체를 시리얼라이즈하기 위해서는 [serializable]이라는 성송을 부여하는데, 이 속성이 지정되지 않았거나 인터페이스가 구현되지 않은 객체는 시리얼라이즈가 되지 않기 때문에 원격 객체로 사용할 수 없습니다.

.NET에서는 객체를 MarshalByRefObject로부터 상속시킴으로써 원격 객체를 생성할 수 있는데, 이 때클라이언트는 이 객체에 대한 프록시를 사용하게됩니다. 프록시와 원격 객체가 같은 어플리케이션 도메인에 있으면 프록시는 원격 객체의 메서드를 직접 호출하고 결과를 받아 클라이언트에게 돌려줍니다. 만약 프록시와 원격 객체가 별개의 어플리케이션 도메인에 존재한다면 프록시는 클라이언트의 요청을 메시지로 변환하여 원격 객체에게 전송합니다. 원격 객체쪽에서는 메시지를 자신이 이해할 수 있는 방식으로 변환한 후 클라이언트의 요청을 수행하고 결과값을 다시 메시지로 바꾸어 프록시에게 보냅니다. 프록시는 이 메시지로 부터 결과값을 얻어내어 클라이언트에게 넘겨줍니다.


프록시 객체

클라이언트가 원격 객체를 사용하고자 할 때 프록시가 생성됩니다. 프록시는 TransparentProxy와 RealProxy로 나뉘는데 클라이언트가 사용하는 것은 TransparentProxy이다. 원격 객체와 TransparentProxy가 같은 어플리케이션 도메인에 있으면 TransparentProxy는 원격 객체에 직접 접근하여 메서드를 호출한다. 만약 원격 객체와 TransparentProxy가 서로 다른 어플리케이션 도메인에 있으면 TransparentProxy는 클라이언트가 호출한 메서드의 매개변수를 메시지로 변환하여 RealProxy에게 전송한다. RealProxy는 원격 객체에 접근하여 매개변수가 담긴 메시지를 넘겨주며 메서드의 결과값은 RealProxy와 TransparentProxy를 거쳐 클라이언트가 받게 된다. 

클라이언트가 TransparentProxy에 대해 메서드를 호출하면 그정보는 메시지로 변환되여 RealProxy로 전달되고, RealProxy는 메시지를 포맷터 싱크에 넘긴다.(formatter sink) 포맷터 싱크는 하나 이상의 포매터가 파이프처럼 연결된 형태이며, 메시지를 바이너리 스트림 혹은 XML 스트림으로 변환해서 트랜스포트 싱크(transport sink)에 전닳나다. 트랜스포트 싱크 역시 하나 이상의 트랜스포트 포맷터로 구성되어 있는 형태이며 서버측의 트랜스포트 싱크와 연결하여 데이터를 전송하고, 서버측의 트랜스포트 싱크는 시리얼라이즈되어 전달된 데이터를 포맷터 싱크로 전달한다. 포맷터 싱크는 데이터 스트림을 원격 객체가 사용할 수 있는 데이터로 복원하여 원격 객체에게 전달한다. 결과값 전송은 이와 반대 순서로 진행된다.


활성화와 프록시 객체의 개요

· 원객 객체 활성화 방법

   ° 서버 활성화 객체(SAO : Server Activated Object)

      · SingleCall 방식 - 함수 호출 요청이 있을 때마다 객체 생성

      · Singleton 방식 - 클라이언트 함수 호출 요청이 있을 때 하나의 객체를 생성한 후 하나의 객체를 공유

   ° 클라이언트 활성화 객체(CAO : Client Activated Object)

· 서버 활성화와 클러이언트 활성화

   ° 서버에 의해서 원격 객체가 자동으로 만들어지면 서버 활성화 기법이라고 한다.

   ° 클라이언트에서 프록시 객체를 만들 때 원격 객체가 만들어지면 클라이언트 호라성화 기법이라고 한다.

·클라이언트의 프록시

   ° 클라이언트에서는 원격 객체를 참조하기 위한 가상의 객체를 만들게 되는데 이 객체를 프록시 객체라고 한다.

   ° 이 프록시 객체를 이용해서 클라이언트는 원격 객체를 핸들링 할 수 있다.

· 프록시 객체를 생성하는 방법

   ° new를 사용하는 방법 : 서버 활성화, 클라이언트 활성화에서 사용

   ° Activator.GetObject() 함수를 사용하는 방법 : 서버 활성화에서 사용

   ° Activator.CreateInstance() 함수를 사용하는 방법 : 클라이언트 활성화에 사용

'Programing > C#&.Net' 카테고리의 다른 글

speech To Text  (0) 2016.11.30
회원관리 연습  (0) 2016.11.30
직렬화(Serializable) 예제  (0) 2016.11.30
명시적 어셈블리 로딩  (0) 2016.11.30
인덱서(Indexer) 예제  (0) 2016.11.30

+ Recent posts