.Net Remoting - 해당되는 글 1건

Microsoft .NET Remoting Framework 소개

Paddy Srinivasan
Microsoft Corporation

요약: 본 기사에서는 Microsoft .NET Remoting Framework의 기본 내용을 설명합니다. .NET Remoting Framework의 주요 구성 요소를 설명하며 아울러 .NET Remoting을 통해 배포된 개체와 통신할 수 있는 여러 상황을 소개합니다(11페이지/인쇄 페이지 기준).

목차

소개
.NET Remoting 개체
.NET Remoting 개체 호스트
.NET Remoting 메타데이터 구성 파일
.NET Remoting 시나리오
결론

소개

Microsoft? .NET Remoting은 다양한 AppDomains, 프로세스, 컴퓨터에 있는 개체들이 서로 문제 없이 통신할 수 있도록 풍부하고 확장 가능한 프레임워크를 제공합니다. .NET Remoting은 매우 강력하면서도 간단한 프로그래밍 모델 및 런타임 지원을 제공함으로써 이런 환경에사 작업을 보다 쉽게 합니다. 이 기사에서는 Remoting 구조의 일부를 살펴 보고 .NET Remoting을 레버리지할 수 있는 일반적인 시나리오를 살펴 보겠습니다. .NET Remoting 개체는 웹 서비스로 사용될 수 있습니다.

 

.NET Remoting 개체

.NET 원격 개체로 사용하도록 구성할 수 있는 개체 종류가 세 가지 있습니다. 응용 프로그램 요구 사항에 따라서 개체 종류를 선택할 수 있습니다. 이런 개체를 자세하게 설명해 보겠습니다.

"Single Call" 개체는 하나의 클라이언트에만 사용할 수 있고 한 개의 요청에만 응답합니다. 단일 호출 개체는 한정된 작업 양을 처리해야 하고 상태 정보를 저장할 필요가 없는 경우에 유용합니다. Single Call(단일 호출) 개체는 로드 균형 조정된 방식으로 구성할 수 있으며 메서드를 호출하는 사이에 상태 정보를 유지할 수 없습니다.

Singleton Objects는 여러 클라이언트에 사용할 수 있으므로 클라이언트 호출 사이에 상태를 공유함으로써 데이터를 공유하는 개체입니다. 클라이언트 사이에 데이터를 명시적으로 공유해야 하는 경우나 개체를 작성하고 유지하는 작업이 많은 경우에 유용합니다.

CAO(Client Activated Objects)는 서버 개체로 클라이언트에서 요청하면 활성화됩니다. 이런식으로 서버 개체를 활성화하는 방법은 기존의 COM coclass 활성화와 유사합니다. 클라이언트에서 "새로운" 연산자를 사용하는 서버 개체를 요청하는 경우에 활성화 요청 메시지는 원격 응용 프로그램으로 전송됩니다. 그런 다음 서버에서 요청한 클래스의 인스턴스를 만들어서 호출한 클라이언트 응용 프로그램으로 ObjRef를 돌려 줍니다. 클라이언트에서 ObjRef를 사용하여 프록시를 만듭니다. 클라이언트 메서드 호출이 프록시에서 실행됩니다. CAO(Client Activated Objects)는 특정 클라이언트용 메서드 호출 사이에 상태 정보를 저장할 수 있습니다. 이때 서로 다른 클라이언트 개체에 대한 호출인 경우에는 저장할 수 없습니다. "새로운" 연산자를 호출할 때마다 서버 종류의 독립적인 인스턴스로 프록시를 반환합니다.

.NET Remoting을 사용하여 개체 전달

.NET Remoting에서 다음과 같은 방법으로 개체를 응용 프로그램 사이에서 전달할 수 있습니다.

  1. 메서드 호출에서 매개 변수로

: public int myRemoteMethod (MyRemoteObject myObj)

  1. 메서드 호출의 반환 값

: public MyRemoteObject myRemoteMethod(String myString)

  1. .NET 구성 요소의 속성 또는 필드 액세스 결과 값

: myObj.myNestedObject

Marshal By Value (MBV) 개체의 경우에 개체를 다른 응용 프로그램으로 전달하면 개체의 복사본이 만들어집니다.

Marshal By Reference (MBR) 개체의 경우에 다른 응용 프로그램을 전달할 때 개체의 참조가 만들어집니다. 개체 참조(ObjRef)가 원격 응용 프로그램에 도착할 때 이 참조는 원래 개체에 대한 "프록시"로 전환됩니다.

 

간단한 .NET Remoting 서버 개체용 예제 코드

using System;

using System.Runtime.Remoting;

namespace myRemoteService

{

    // Well Known Web Service object

    public class myRemoteObject : MarshalByRefObject

    {

        // Method myRemoteMethod

        public String myRemoteMethod(String s)

        {

         return "Hello World";

        }

    }

}

이 개체를 액세스할 수 있는 예제 클라이언트 코드

using System;

using System.Runtime.Remoting;

using myRemoteService;

public class Client

{

    public static int Main(string[] args)

    {

        ChannelServices.RegisterChannel(new HTTPChannel(7055));

      // Create an instance of a myRemoteObject class

   myRemoteObject myObj = ( myRemoteObject)Activator.GetObject(typeof(myRemoteObject),

            "http://myHost:7021/host/myRemoteObject.soap");

      myObj. myRemoteMethod ("Hello World");

        return 0;

    }

}

임대 기반 수명

응용 프로그램 밖으로 전송된 개체 참조가 있는 개체의 경우에 임대가 만들어집니다. 임대에는 임대 시간이 있습니다. 임대가 0에 이르면 임대는 만기가 되고 개체의 연결이 .NET Remoting Framework에서 끊어집니다. AppDomain 내에서 개체에 대한 모든 참조가 제거되면 다음 GC가 발생할 때 개체가 수집됩니다. 임대는 개체의 수명을 제어합니다.

개체는 기본 임대 기간을 가지고 있으며 클라이언트가 같은 서버 개체에서 상태를 유지하려는 경우에 개체를 살려 두기 위해서 임대 기간을 연장하는 방법이 여러 개 있습니다.

  1. 서버 개체에서 임대 시간을 무한으로 설정하면 잘못된 컬렉션 주기 동안 이를 수집하지 않도록 Remoting에게 지시됩니다.
  2. 클라이언트는 RemotingServices.GetLifetimeService 메소드를 호출하여 AppDomain의 임대 관리자로부터 서버 개체의 임대를 가져올 수 있습니다. 또한 Lease 개체로부터 Lease.Renew 메소드를 호출하여 임대를 연장할 수 있습니다.
  3. 클라이언트는 AppDomain의 임대 관리자와의 특정 임대용으로 스폰서를 등록할 수 있습니다. 원격 개체의 임대가 만기되면 임대 관리자는 스폰서를 다시 호출하여 임대 갱신을 요청할 수 있습니다.
  4. ILease::RenewOnCallTime 속성이 설정되면 원격 개체에 대한 각 호출이 RenewOnCallTime 속성에서 지정한 시간 만큼 임대를 갱신합니다.

 

 

Single Call/Singleton Objects

CAO(Client Activated Objects)

클라이언트 측 활성화 코드 (클라이언트에서 활성화한 코드)

자세한 내용은 구성 파일에 대한 부분을 참고하십시오.

a) Activator.GetObject()

b) CFG 파일에서 new()

클라이언트의 CFG 파일에서 다음 URL을 참조합니다.

Foo= http://localhost:80/ObjectZone/Foo.soap

a) Activator.CreateInstance()

b) CFG 파일에서 new()

클라이언트의 CFG 파일에서 서버 라이브러리 및 서버 응용 프로그램의 URL을 참조하며 개체의 URL을 제공합니다. 다음 라이브러리를 참조하여 클라이언트를 구축합니다.

Assembly#MyObjectLibrary#ObjectZone#
  MyObjectLibrary.Baz

RemoteApplication#ObjectZone#
  HTTP://localhost:80/ObjectZone

서버 개체의 활성화

첫 번째 메서드 호출이 이뤄질 때까지 활성화 메시지를 네트워크를 통해 전송하지 않습니다.

클라이언트에서 개체를 작성하고 클라이언트에 프록시가 작성될 때 활성화 메시지가 서버로 전송됩니다. 매개 변수가 포함된 생성자가 지원됩니다.

서버 개체의 수명

서버의 구성에서 수명을 결정합니다. SingleCall이나 Singleton입니다.

다음과 같은 경우에 수명이 짧아집니다.

a) 임대 만기

b) 클라이언트가 서버 개체에 대한 참조를 잃는 경우

서버측 등록

a) 구성 파일을 사용하여 종류(SingleCall 또는 Singleton)를 지정합니다.

b) RegisterWellKnownType() api로 종류 등록

구성 파일을 사용하여 CAO(Client Activated object)를 가져옵니다.

자세한 내용은 구성 파일에 대한 부분을 참고하십시오.

모델의 장점

a) 서버 구성 요소의 기본 클래스나 인터페이스 정의인 Common Language Runtime 메타데이터에 대해서 클라이언트를 컴파일할 수 있습니다.

b) 서버에서 한정된 작업을 수행하는데 유용합니다.

c) Single Call 개체는 상태를 유지하지 않기 때문에 로드 균형 조정된 시스템에서 쉽게 배포할 수 있습니다.

d) Singleton Objects는 클라이언트 개체 사이에 상태 정보를 유지할 수 있습니다.

a) 서버 개체의 호출과 같은 기존 COM "coclass"

b) 서버 개체의 수명을 관리하기 위해서 클라이언트에 유연성을 부여합니다.

c) 클라이언트가 만들어진 개체로 생성자 매개 변수를 전달할 수 있습니다.

d) 서버 개체가 메소드 호출 사이에 특정 클라이언트용 상태를 유지할 수 있습니다.

 

 

.NET Remoting 개체 호스트

다음과 같이 .NET Remoting 개체를 호스트할 수 있습니다.

  1. 관리되는 실행 파일 .NET Remoting 개체를 일반 .NET  EXE 또는 관리되는 서비스로 호스트할 수 있습니다.
  2. IIS Remoting 개체를 Internet Information Server (IIS)에서 호스트할 수 있습니다. 기본적으로 IIS에서 호스트하는 Remoting 개체는 HTTP 채널을 통해 메시지를 받습니다. IIS 하에서 Remoting 개체를 호스트하려면 가상 루트를 만들고 "remoting.cfg" 파일을 이 루트에 복사해야 합니다. 원격 개체가 포함된 실행 파일이나 DLL IIS 루트가 가리키는 디렉터리 아래에 있는 빈 디렉터리에 놓아야 합니다. IIS 루트 이름이 구성 파일에 지정된 응용 프로그램 이름과 동일해야 하므로 주의하십시오. 첫 번째 메시지가 응용 프로그램에 도착할 때 Remoting 구성 파일이 자동으로 로드됩니다. 이렇게 하면 .NET Remoting 개체가 웹 서비스로 표시될 수 있습니다.

예제 Remoting.cfg 파일:

Name#HelloService

WellKnownObject#HelloService.Hello#HelloService#HelloService/

   Hello.soap#SingleCall

 

설명:

Name#[응용 프로그램 이름]

WellKnownObject#[종류이름]#[어셈블리이름]#[개체URI]#[개체모드]

  1. .NET 구성 요소 서비스 .NET Remoting 개체를 .NET 구성 요소 서비스 인프라에서 호스트하면 Transactions, JIT, 개체 풀링 등과 같은 다양한 COM+ 서비스의 장점을 이용할 수 있습니다.

채널 서비스(System.Runtime.Remoting.Channels)

.NET 응용 프로그램과 AppDomains는 메시지를 사용하여 서로 통신합니다. .NET 채널 서비스는 이 통신의 기본 전송 메커니즘을 제공합니다.

.NET 프레임워크는 HTTP, TCP SMTP 채널을 제공하며 제 3업체가 직접 작성하여 자신의 채널로 플러그인할 수 있습니다. HTTP SMTP 채널은 기본적으로 SOAP를 사용하여 통신하는 반면 TCP 채널은 바이너리 페이로드를 사용합니다.

채널 서비스는 다른 유형의 응용 프로그램을 통합하기 위해서 작성할 수 있는 사용자 정의 채널을 사용하여 플러그 가능합니다(IChannel 사용).

채널 서비스를 로드하는 예제 코드

public class myRemotingObj

{

    HTTPChannel httpChannel;

    TCPChannel    tcpChannel;

    public void myRemotingMethod()

    {

httpChannel =  new HTTPChannel();

tcpChannel  =  new TCPChannel();

        ChannelServices.RegisterChannel(httpChannel);// Register the HTTP Channel

        ChannelServices.RegisterChannel(tcpChannel);// Register the TCP Channel 

 

 

    }

}

 

순서화 형식 지정자(System.Runtime.Serialization.Formatters)

.NET 순서화 형식 지정자는 .NET 응용 프로그램과 AppDomains 사이에서 메시지를 인코드 및 디코드합니다. .NET 런타임은 두 가지 원시 형식 지정자를 가지는 데, Binary(System.Runtime.Serialization.Formatters.Binary) SOAP(System.Runtime.Serialization.Formatters.Soap)이 이에 해당합니다.

순서화 형식 지정자는 IRemotingFormatter 인터페이스를 구현하고 위에서 설명한 채널에 플러그함으로써 플러그가 가능합니다. 따라서 사용하는 응용 프로그램에 알맞은 채널과 형식 지정자의 배합을 선택할 수 있습니다. 아래 부분에서 보다 자세하게 설명하겠습니다.

: 바이너리 데이터를 순서화하는 바이너리 형식 지정자를 사용하는 HTTP 채널과 SOAP 형식 지정자를 사용하는 TCP 채널을 가질 수 있습니다.

Remoting 컨텍스트

컨텍스트는 공통적인 런타임 속성을 공유하는 개체가 포함된 범위를 말합니다. 컨텍스트 속성의 일부 예는 동기화 및 스레드 선호도입니다. .NET 개체가 활성화될 때 현재 컨텍스트가 호환 가능한지 런타임에서 확인하며 호환되지 않는 경우에 새로운 컨텍스트가 만들어집니다. 컨텍스트는 동시에 여러 개체를 실행할 수 있으며 하나의 AppDomain은 여러 컨텍스트를 가질 수 있습니다.

한 컨텍스트의 개체에서 다른 컨텍스트의 개체로 호출하면 컨텍스트 프록시를 통과하며 결합된 컨텍스트 속성이 실시하는 정책의 영향을 받습니다. 새 개체의 컨텍스트는 클래스의 메타데이터 속성을 기준으로 보통 선택됩니다.

한 컨텍스트로 연결된 클래스는 컨텍스트 연결 클래스라고 합니다. 컨텍스트 연결 클래스에 컨텍스트 속성으로 알려진 특별한 사용자 정의 속성을 지정할 수 있습니다. 컨텍스트 속성은 확장 가능하며 이런 속성을 만들어서 클래스에 첨부할 수 있습니다. 한 컨텍스트에 연결된 개체는 System.ContextBoundObject에서 파생됩니다.

 

.NET Remoting 메타데이터 및 구성 파일

.NET 프레임워크에서 메타데이터와 어셈블리를 사용하여 구성 요소에 대한 정보를 저장하며 언어에 관계없는 프로그래밍을 가능하게 합니다. .NET Remoting은 메타데이터를 사용하여 프록시 개체를 역동적으로 만듭니다. 클라이언트 측에서 만들어진 프록시 개체는 같은 멤버를 원래 클래스로 가집니다. 그러나 프록시 개체를 구현하면 .NET Remoting 런타임의 모든 요청을 원래 개체로 포워드만합니다. 순서화 형식 지정자는 메타데이터를 사용하여 메소드 요청을 페이로드 스트림으로 변환합니다.

클라이언트는 원격 개체를 액세스하는 데 필요한 메타데이터 정보를 다음과 같은 방법으로 확보할 수 있습니다.

  1. 서버 개체의 .NET 어셈블리 - 서버 개체는 메타데이터 어셉블리를 만들어서 클라이언트에 배포할 수 있습니다. 클라이언트 개체는 클라이언트 개체를 컴파일하는 반면 어셈블리를 참조할 수 있습니다. 클라이언트와 서버가 관리 구성 요소인 폐쇄된 시나리오에서 매우 유용합니다.
  2. Remoting 개체는 개체와 메소드를 설명하는 WSDL("WSDL(Web Services Description Language) 1.1" 참조) 파일을 제공할 수 있습니다. WSDL 파일에 일치하는 SOAP 요청을 읽고 생성할 수 있는 클라이언트는 이 개체를 호출하고 SOAP를 사용하여 개체와 통신할 수 있습니다. .NET Remoting Server 개체는 .NET SDK와 함께 제공되는 SOAPSUDS.EXE 툴을 사용하여 메타데이터로 사용할 수 있는 WSDL 파일을 생성할 수 있습니다. 한 조직에서 클라이언트가 액세스하고 사용할 수 있는 공공 서비스를 제공하려고 할 때 유용합니다.
  3. .NET 클라이언트는 메타데이터만 포함되고 코드는 없는 소스 파일이나 어셈블리를 생성하기 위해서 SOAPSUDS 유틸리티를 사용하여 서버에서 XML 스키마(서버에서 생성됨)를 다운로드할 수 있습니다. 소스 파일은 한 계층의 개체가 다른 계층의 원격 개체를 액세스하는 다중 계층 응용 프로그램에서 유용합니다.

구성 파일(.CFG 파일)은 지정된 개체에 대한 다양한 Remoting 특정 정보를 지정하는 데 사용됩니다. CFG 파일을 사용하면 위치 정확성이 향상됩니다. CFG 파일에 지정된 세부 사항을 프로그래밍할 수 있습니다. 이 파일을 사용하는 장점은 클라이언트 코드에 해당되는 구성 정보를 분리할 수 있으므로 나중에 내용을 변경할 때 소스 파일을 편집하고 다시 컴파일할 필요 없이 CFG 파일만 변경하면 됩니다. .NET Remoting 클라이언트와 서버 개체에서 모두 구성 파일을 사용합니다.

CFG 파일에는 다음 내용이 포함됩니다.

  1. 호스트 응용 프로그램 정보
  2. 개체 이름
  3. 개체 URI
  4. 등록된 채널(동시에 여러 채널을 등록할 수 있습니다.)
  5. 서버 개체용 임대 시간 정보

예제 구성 파일(나중 릴리스에서 현재 포맷이 XML로 변경될 수 있으니 참고하십시오.):

Name#MyRemoteApp

myRemoteObj = HTTP://myCompany:80/MyRemoteApp/myRemoteObj.soap

Channel#System.Runtime.Remoting#System.Runtime.Remoting.Channels.TCP.TCPChannel

Channel#System.Runtime.Remoting#System.Runtime.Remoting.Channels.HTTP.HTTPChannel

 

.NET Remoting 시나리오

.NET Remoting의 기본 사용법을 이해했으면 이제 다양한 시나리오를 살펴보고 시나리오에 따라 .NET Remoting을 최적으로 사용하는 방법을 알아보기로 하겠습니다. 다음 표는 기본으로 사용하는 프로토콜과 페이로드 및 사용 가능한 클라이언트-서버 배합을 목록으로 보여 줍니다. .NET Remoting 프레임워크는 확장 가능하며 원하는 통신 채널 및 순서화 형식 지정자를 직접 작성할 수 있습니다.

클라이언트

서버

페이로드

프로토콜

.NET 구성 요소

.NET 구성 요소

SOAP/XML

http

.NET 구성 요소

.NET 구성 요소

바이너리

TCP

관리/비관리

.NET 웹 서비스

SOAP/XML

http

.NET 구성 요소

관리되지 않는 기존 COM 구성 요소

NDR (Network Data Representation)

DCOM

관리되지 않는 기존 COM 구성 요소

.NET 구성 요소

NDR

DCOM

 

 

모든 클라이언트 <-> HTTP-SOAP을 사용하는 .NET

웹 서비스는 URL로 표시 가능한 리소스로 정보를 원하는 클라이언트에게 반환하도록 프로그래밍되어 있습니다. 클라이언트는 구현 방법에 대해 걱정하지 않고 웹 서비스를 사용할 수 있습니다. 웹 서비스는 계약이라고 하는 잘 정의된 인터페이스를 사용합니다. 계약서는 WSDL(Web Services Description Language) 파일을 사용하여 설명됩니다. WSDL에 대한 자세한 내용은 "WSDL(Web Services Description Language) 1.1"을 참고하십시오.

.NET Remoting 개체는 IIS에서 호스트함으로써 웹 서비스로 표시될 수 있습니다. WSDL 파일을 소비할 수 있는 클라이언트라면 WSDL 파일에 저정된 계약대로 원격 개체에 대한 SOAP 호출을 할 수 있습니다. IIS ISAPI 확장을 사용하여 요청을 알맞은 개체로 보냅니다. 따라서 Remoting 개체는 웹 서비스 개체처럼 작동될 수 있으며 풍부한 .NET Framework 인프라를 레버리지할 수 있습니다. 이 구성은 다른 플랫폼/환경의 프로그램에서 여러분의 개체를 액세스할 수 있도록 허용할 때 유용합니다.

그림 1. 클라이언트가 HTTP-SOAP를 통해 Remoting 개체의 웹 서비스를 호출한 예

.NET<-> SOAP-HTTP 채널을 사용한 .NET

HTTP 채널은 SOAP 형식 지정자를 기본으로 사용하므로 클라이언트가 인터넷 상에서 개체를 액세스하는 경우에 사용할 수 있습니다. 이 과정에서 HTTP를 사용하기 때문에 이 구성을 사용하여 방화벽을 통해 .NET 개체를 원격으로 액세스할 수 있습니다. 이렇게 노출된 개체는 위에서 설명한대로 IIS에서 호스트하면 웹 서비스 개체로 쉽게 구성할 수 있습니다. 그런 다음 개체의 WSDL 파일을 읽으면 SOAP를 사용하여 Remote 개체와 통신할 수 있습니다.

.NET<->TCP 채널을 사용하는 .NET

TCP 채널은 바이너리 형식 지정자를 기본으로 사용합니다. 이 형식 지정자는 데이터를 바이너리 형태로 순서화해서 원시 소켓을 사용하여 데이터를 네트워크를 통해 전송합니다. 이 방식은 개체가 방화벽이 있는 폐쇄된 환경에서 배포될 때 이상적입니다. 이 접근법은 개체 사이에서 소켓을 사용하여 바이너리 데이터를 통신할 때 더욱 최적화됩니다. TCP 채널을 사용하여 개체를 표시하면 폐쇄된 환경에서 오버헤드가 낮아지는 장점이 있습니다. 방화벽 및 구성 문제 때문에 인터넷 상에서는 이 방법을 사용할 수 없습니다.

그림 2. 클라이언트가 TCP 채널을 통해 컴퓨터 경계에서 Remoting 개체를 호출한 예

.NET <-> 관리되지 않은 COM 구성 요소 <-> .NET

COM Interop Services를 통해 관리되지 않은 기존 COM 구성 요소를 호출할 수 있습니다. .NET Remoting 클라이언트 개체에서 COM 개체의 인스턴스를 만들 때 개체는 관리되지 않은 실제 개체의 프록시처럼 작동하는 RCW(Runtime Callable Wrapper)를 통해 표시됩니다. 이런 래퍼는 .NET 클라이언트에 대한 관리되는 다른 클래스처럼 보입니다. 그러나 실제로는 관리된(.NET) 코드와 비관리(COM) 코드 사이에서 호출을 마샬링합니다.

비슷한 방법으로 .NET Remoting 서버 개체를 기존 COM 클라이언트로 노출할 수 있습니다. COM 클라이언트가 .NET 개체의 인스턴스를 만들 때 개체는 관리되는 실제 개체의 프록시처럼 작동하는 CCW(COM Callable Wrapper)를 통해 노출됩니다.

이 두 가지 시나리오 모두 DCOM을 사용하여 통신합니다. 서로 다른 기존 COM .NET 구성 요소가 함께 사용되는 경우에 이런 상호 운영성이 더욱 유용해집니다.

 

결론

Microsoft .NET Framework는 강력하고 확장 가능하며 언어에 관계 없는 프레임워크를 제공하므로 믿을 수 있고 융통성 있는 배포 시스템을 개발할 수 있습니다. .NET Remoting Framework는 시스템 요구 사항에 따라 강력한 원격 상호 작용을 가능하게 해 주는 여러 방법을 제공합니다. .NET Remoting은 웹 서비스와 자연스럽게 통합되며 여러 플랫폼에서 액세스할 수 있도록 .NET 개체를 노출하는 방법을 제공합니다.

 


|

No7Do's Blog is powered by Daum & tistory