다음을 통해 공유


원격화할 수 있는 개체와 원격화할 수 없는 개체

특정 응용 프로그램 도메인에서 만들었으며 따라서 해당 응용 프로그램 도메인에 고유한 개체는 해당 도메인에서 직접 호출할 수 있지만, 해당 도메인 외부에서 이 개체를 사용하려면 먼저 특별한 처리가 필요합니다. 모든 형식의 개체가 전부 도메인 경계를 넘어 효율적으로 게시되거나 소비될 수 있는 것은 아니므로 응용 프로그램의 필요에 따라 게시할 개체 형식을 결정해야 합니다. 분산 응용 프로그램용 개체는 원격화할 수 없는 개체와 원격화할 수 있는 개체의 두 가지 범주로 간단하게 나눌 수 있습니다.

원격화할 수 없는 개체

일부 개체는 해당 개체의 응용 프로그램 도메인을 떠날 수 없으며 serialization 메서드를 선언하지 않으므로 마샬링되지 않습니다. 이러한 원격화할 수 없는 개체는 해당 개체가 만들어진 응용 프로그램 도메인 내에서만 사용할 수 있도록 디자인되며 항상 해당 응용 프로그램 도메인에서만 직접 액세스할 수 있습니다. .NET Framework 클래스 라이브러리에 있는 대부분의 기본 클래스는 원격화할 수 없는 개체입니다. 원격화할 수 없는 개체는 다른 응용 프로그램 도메인에서 복사하거나 나타낼 수 없습니다. 이러한 개체는 원래 응용 프로그램 도메인에서만 액세스할 수 있습니다.

원격화할 수 있는 개체

원격화할 수 있는 개체는 해당 응용 프로그램 도메인 또는 컨텍스트 외부에서 프록시를 사용하여 액세스할 수도 있고, 개체를 복사한 다음 복사본을 해당 응용 프로그램 도메인 또는 컨텍스트의 외부로 전달할 수도 있습니다. 즉, 원격화할 수 있는 개체 중 일부는 참조로 전달되고 일부는 값으로 전달됩니다.

원격화할 수 있는 개체는 광범위하게 분산되는 환경에서 잘 작동하는 개체입니다. 원격화할 수 있는 개체에는 기본적으로 두 가지 종류가 있습니다.

  • 값으로 마샬링되는 개체 - 이 개체는 응용 프로그램 도메인에서 복사되고 전달됩니다.

  • 참조로 마샬링되는 개체 - 이 개체에 원격으로 액세스하기 위해 클라이언트에서는 프록시를 만들어 사용합니다.

값으로 마샬링되는 개체

MBV(Marshla-By-Value) 개체 즉, 값으로 마샬링되는 개체는 ISerializable을 구현하여 해당 개체의 serialization을 구현하거나 해당 개체를 자동으로 serialize하도록 시스템에 알리는 SerializableAttribute로 데코레이트되어 개체의 serialization 규칙을 선언하지만 MarshalByRefObject를 확장하지는 않습니다. 원격 시스템에서는 이러한 개체의 전체 복사본을 만들고 이 복사본을 호출하는 응용 프로그램 도메인에 전달합니다. 호출자의 응용 프로그램 도메인에 복사본이 있으면 해당 복사본에 대한 호출은 이 복사본에 대해 직접 수행됩니다. 또한 인수로 전달되는 MBV 개체도 값으로 전달됩니다. 클래스 인스턴스를 응용 프로그램 또는 컨텍스트 경계를 넘어 값으로 전달하려는 경우, SerializableAttribute 특성을 선언하거나 ISerializable을 구현하는 것 외에는 어떤 작업도 수행할 필요가 없습니다.

참고

.NET Framework 버전 1.1부터 원격 인프라는 서버에서 특정 형식을 자동으로 deserialize하지 않습니다. 따라서 .NET Framework 버전 1.1 이상에서는 서버의 deserialization 수준을 Full로 설정해야 서버가 MBV 개체를 deserialize하고 사용할 수 있습니다. 자세한 내용은 .NET Remoting에서의 자동 Deserialization을 참조하십시오.

성능 또는 처리상의 이유로 개체의 전체 상태 및 실행 기능을 대상 응용 프로그램 도메인으로 이동하는 것이 적합한 경우에는 MBV 개체를 사용합니다. 이렇게 하면 대부분의 시나리오에서 네트워크, 프로세스 및 응용 프로그램 도메인 경계 간에 시간이 많이 걸리며 리소스가 많이 소모되는 라운드트립이 줄어듭니다. MBV 개체는 해당 개체의 원래 응용 프로그램 도메인 내에서 직접 사용할 수도 있습니다. 이 경우 마샬링은 수행되지 않으므로 복사본이 만들어지지 않으며 액세스가 효율적입니다.

반면 게시된 개체의 크기가 매우 큰 경우 사용량이 많은 네트워크에서 전체 복사본을 전달하는 것은 응용 프로그램에 최선의 선택이 아닐 수도 있습니다. 또한 복사된 개체의 상태에 대한 변경 내용은 원래 응용 프로그램 도메인의 원본 개체에 다시 전달되지 않습니다. 추상적인 수준에서 이 시나리오는 클라이언트 브라우저에 의해 요청되는 정적 HTML 페이지의 시나리오와 유사합니다. 즉, 서버에서는 파일을 복사하고 스트림에 써서 보낸 다음에는 해당 파일에 대해 잊어버립니다. 후속 요청은 단지 다른 복사본에 대한 다른 요청일 뿐입니다.

이미 ISerializable을 구현하는 클래스를 확장하는 경우를 제외하고는 SerializableAttribute를 사용하여 값 형식으로 마샬을 만듭니다. 이 경우 형식의 ISerializable을 구현해야 합니다.

원격 시스템에서는 serialize할 수 있는 개체를 광범위하게 사용합니다. 원격 시스템에서 ObjRef 클래스로 나타낸 다른 응용 프로그램 도메인에 있는 개체에 대한 참조는 그 자체로 serialize할 수 있으며, 이를 정확하게 복사하여 해당 복사본을 요청에 보낼 수 있어야 합니다. 여기에는 IMessage를 구현하는 메시지 개체도 해당됩니다. 이러한 메시지 개체는 호출 데이터 및 기타 필요한 개체 참조의 일반적인 컨테이너이기 때문입니다. 또한 데이터를 단지 전송만 하는 개체도 대개 serialize할 수 있는 개체입니다. 예를 들어,DataSetISerializable을 구현하는 MarshalByValueComponent를 확장합니다.

사용자 정의 예외 원격화

시스템 정의 예외는 모두 ISerializable 인터페이스를 구현하므로 값으로 마샬링되는 형식입니다. 원격 개체가 시스템 정의 예외를 Throw하는 경우 원격 구성에서 허용하면 해당 예외가 자동으로 호출자에게 복사됩니다. .NET Framework 버전 1.1부터는 <customErrors> 요소를 off로 설정해야 예외가 호출자에게 전달될 수 있습니다.

원격 개체가 throw하고 원격 호출자가 catch할 수 있는 예외 형식을 만드는 방법은 방법: 원격 개체에 의해 throw될 수 있는 예외 형식 만들기를 참조하십시오.

참조로 마샬링되는 개체

MBR(Marshal-By-Reference) 개체 즉, 참조로 마샬링되는 개체는 최소한 System.MarshalByRefObject를 확장하는 원격화할 수 있는 개체입니다. 선언된 활성화 형식에 따라 클라이언트가 자체 응용 프로그램 도메인에서 MBR 개체의 인스턴스를 만들 때 .NET Remoting 인프라에서는 호출자의 응용 프로그램 도메인에 해당 MBR 개체를 나타내는 프록시 개체를 만들고 호출자에게 해당 프록시에 대한 참조를 반환합니다. 그런 다음 클라이언트가 프록시를 호출하면 .NET Remoting 인프라에서 이 호출을 마샬링하여 원래 응용 프로그램 도메인에 다시 보낸 다음 실제 개체를 호출합니다.

참고

클라이언트가 MBR 개체와 동일한 응용 프로그램 도메인에 있는 경우 인프라에서는 MBR 개체에 대한 직접 참조를 클라이언트에 반환하여 마샬링 오버헤드가 발생하지 않도록 합니다.

MarshalByRefObject가 매개 변수로 전달되는 경우, 다른 응용 프로그램 도메인에서 이 개체는 호출이 도착할 때 프록시로 전환됩니다. MBR 반환 값 및 out 매개 변수는 동일한 방식으로 작동합니다.

참고

.NET Framework 버전 1.1부터 원격 인프라는 서버에서 특정 형식을 자동으로 deserialize하지 않습니다. 예를 들어, 매개 변수로 전달되는 MBR 개체에 대한 지원을 얻으려면 서버의 deserialization 수준을 Full로 설정해야 서버가 MBR 매개 변수를 deserialize하고 사용할 수 있습니다. 자세한 내용은 .NET Remoting에서의 자동 Deserialization을 참조하십시오.

개체의 상태 및 실행 기능이 해당 개체가 만들어진 응용 프로그램 도메인에 유지되어야 하는 경우에는 MBR 개체를 사용해야 합니다. 예를 들어, 운영 체제 핸들인 내부 필드가 있는 개체는 MarshalByRefObject를 확장해야 합니다. 운영 체제 핸들은 다른 응용 프로그램 도메인, 다른 프로세스 또는 다른 컴퓨터에서는 의미가 없게 되기 때문입니다. 때로는 개체의 크기가 허용할 수 없는 정도로 클 수도 있습니다. 이러한 개체는 강력한 서버에서는 문제가 되지 않을 수 있지만 33.6KBps 모뎀에서는 온라인으로 전송할 수 없습니다.

컨텍스트 바인딩 개체

컨텍스트 바인딩 개체는 System.MarshalByRefObject에서 상속하는 System.ContextBoundObject에서 다시 상속하는 MBR 개체입니다. 컨텍스트는 실행 도중 해당 컨텍스트에 있는 개체에 대해 강력한 환경을 제공하는 응용 프로그램 도메인의 하위 영역으로 생각할 수 있습니다. 예를 들어, 컨텍스트에서는 개체가 여러 스레드에 의해 동시에 액세스되지 않도록 할 수 있습니다. 모든 응용 프로그램 도메인에는 기본 컨텍스트가 있습니다. 대부분의 관리 코드에서는 개체를 만든 다음 컨텍스트 관련 문제 없이 해당 도메인의 기본 컨텍스트를 사용하여 동일한 응용 프로그램 도메인 내에서 직접 멤버를 호출합니다. ContextBoundObject에서 상속하는 모든 형식은 동일한 도메인에 있거나 다른 도메인에 있는 다른 컨텍스트에 프록시로 노출됩니다.

예를 들어, 트랜잭션의 일부이며 따라서 해당 형식이 만들어진 컨텍스트의 고유 규칙에 의해 바인딩되는 형식에 대한 메서드가 있는 경우, 해당 형식을 ContextBoundObject에서 상속해야 해당 컨텍스트에서 개체에 액세스할 수 있으며 시스템에서는 해당 개체 및 메서드와 연관된 트랜잭션의 관련 규칙을 적용할 수 있습니다. ContextBoundObject가 동일한 응용 프로그램 도메인 내의 다른 컨텍스트에서 호출되는 경우에는 호출자를 위해 프록시가 만들어지지만 컨텍스트 간 통신은 채널 시스템을 통과하지 않으므로 호출 효율성이 향상됩니다.

각 경계를 넘는 데는 약간의 처리 시간이 필요하므로 사용자의 서버에 필요한 원격화할 수 있는 개체의 형식을 결정하기 전에 개체가 넘어야 하는 경계를 결정해야 합니다. 특정 컨텍스트 고유의 개체는 해당 컨텍스트에서만 직접 액세스할 수 있으며, 특정 응용 프로그램 도메인 고유의 개체는 해당 응용 프로그램 도메인에서만 직접 액세스할 수 있습니다. 이러한 개체를 원격화하려면 원격 시스템에서는 개체가 관련된 경계 내에서 서버 개체를 호출하기 전에 컨텍스트 경계나 응용 프로그램 경계, 또는 이 둘 모두를 넘을 수 있어야 합니다. 개체를 호출하는 데 컨텍스트 확인이 필요하지 않은 경우에는 원격 형식이 ContextBoundObject를 확장하도록 해서는 안 됩니다. 이 경우에는 MarshalByRefObject가 보다 적합합니다. 컨텍스트 확인이 필요한 경우에는 ContextBoundObject를 확장해야 하지만, 이 경우 개체에 대한 호출이 수행되기 전에 추가 경계를 넘어야 한다는 것을 알고 있어야 합니다.

게시 범위

서로 다른 원격 시스템에서는 원격으로 사용할 수 있는 멤버 및 멤버 형식을 결정하는 방법이 서로 다릅니다. .NET Remoting에서는 다음 경우만 제외하고는 개체가 마치 지역 개체인 것처럼 다른 응용 프로그램 도메인에 개체를 노출합니다.

  • 정적 멤버

    정적 필드 및 메서드는 원격화할 수 있는 개체가 아니므로 직접 메모리를 통해 필드에 액세스해야 합니다. 즉, .NET Remoting에서는 항상 특정 형식의 인스턴스 멤버를 처리합니다.

  • 인스턴스 필드 및 접근자

    인스턴스 필드 및 접근자 메서드의 경우에는 시스템에서 런타임 도중 확인 작업을 통해 해당 개체가 프록시인지 여부를 확인합니다. 개체가 프록시가 아니면 필드 액세스는 직접 처리되고, 개체가 프록시인 경우에는 프록시에서 호출자에게 접근자를 제공합니다.

  • 전용 메서드

    전용 메서드는 원격화할 수 없으며, 원격으로 전용 메서드에 대한 대리자를 래핑하여 전달할 수도 없습니다.

  • 대리자

    대리자는 값으로 마샬링되는 개체입니다. 대리자 내의 개체는 serialize할 수 있는 개체, MarshalByRefObject 개체 또는 ContextBoundObject 개체를 포함한 모든 형식의 원격화할 수 있는 개체일 수 있습니다. 단, 인터페이스 메서드에 대한 대리자는 올바르게 원격화할 수 없습니다. 대리자는 인터페이스 메서드의 구현을 래핑하므로 클라이언트의 형식 정보를 서버에서 사용할 수 있어야 합니다.

  • Object의 재정의 메서드 

    성능상의 이유로 Object 메서드의 가상 메서드는 항상 해당 메서드가 호출된 응용 프로그램 도메인에서 로컬로 실행됩니다. 다음 메서드의 호출은 해당 메서드가 원격 개체에 대해 재정의된 경우에만 원격 개체로 이동합니다.

    • Equals 

      이 가상 메서드는 재정의된 경우 원격으로 실행됩니다.

    • GetHashCode 

      이 메서드는 로컬로 실행됩니다.

    • ToString 

      이 가상 메서드는 재정의된 경우 원격으로 실행됩니다.

    • Equals(정적 버전)

      이 메서드는 로컬로 실행됩니다.

    • MemberwiseClone 

      이 메서드는 로컬로 실행됩니다.

참고 항목

작업

방법: 원격 개체에 의해 throw될 수 있는 예외 형식 만들기

기타 리소스

.NET Framework Remoting 개요
개체 원격화