원격으로 사용 가능한 개체 및 사용 불가능한 개체

이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.

응용 프로그램 도메인에서 생성되어 이 도메인에 특정되는 개체는 해당 도메인에서 직접 호출할 수 있지만 개체를 도메인 외부에서 사용할 수 있으려면 몇 가지 작업이 수행되어야 한다는 점을 기억해야 합니다. 모든 개체 유형을 효율적으로 도메인 경계를 가로질러 게시하거나 사용할 수는 없습니다. 따라서 응용 프로그램의 요구 사항에 따라 게시할 개체의 형식을 결정해야 합니다. 분산 응용 프로그램의 목적에 따라 개체에는 원격으로 사용 가능한 개체와 원격으로 사용 불가능한 개체의 두 가지 개체 범주가 있습니다.

원격으로 사용 불가능한 개체

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

원격으로 사용 가능한 개체

원격으로 사용 가능한 개체는 프록시를 사용하여 응용 프로그램 도메인 또는 컨텍스트 외부에서 액세스할 수 있습니다. 또는 복사도 가능하며 복사한 내용을 응용 프로그램 도메인이나 컨텍스트 외부로 전달할 수 있습니다. 즉, 일부 원격으로 사용 가능한 개체는 참조로 전달되며 일부는 값으로 전달됩니다.

원격으로 사용 가능한 개체는 넓게 분산된 환경에서 효과적으로 작동하는 개체입니다. 원격으로 사용 가능한 개체에는 크게 다음 두 가지 종류가 있습니다.

  • 응용 프로그램 도메인에서 복사되고 전달되는, 값에 의한 마샬링 개체

  • 프록시가 만들어지고 클라이언트가 이를 사용하여 개체에 원격으로 액세스하는, 참조에 의한 마샬링 개체

값에 의한 마샬링 개체

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

h8f0y3fc.note(ko-kr,VS.100).gif참고:
.NET Framework 버전 1.1부터 원격 인프라는 서버에서 특정 형식을 자동으로 deserialize하지 않습니다. 응용 프로그램이 자동으로 serialize되지 않는 형식을 전달하려고 하는 경우에는 서버 deserialization 수준을 Full로 설정해야 서버가 MBV 개체를 deserialize하고 사용할 수 있습니다. 자세한 내용은 .NET Remoting에서의 자동 deserialization를 참조하십시오.

성능이나 처리상의 이유로 개체 및 모든 실행 가능 기능의 전체 상태를 대상 응용 프로그램 도메인으로 옮기는 것이 합당할 때는 MBV 개체를 사용합니다. 대개의 경우 이렇게 하면 네트워크, 프로세스 및 응용 프로그램 도메인 경계를 가로지르는, 시간이 오래 걸리고 자원을 많이 소비하는 라운드트립이 줄어듭니다. MBV 개체는 개체의 원래 응용 프로그램 도메인 내에서도 직접 사용됩니다. 이 경우에는 마샬링이 수행되지 않기 때문에 복사가 이뤄지지 않고 액세스가 효율적으로 수행됩니다.

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

원격 시스템은 serialize 가능한 개체를 많이 이용합니다. 원격 시스템에서 ObjRef 클래스로 표시되는, 다른 응용 프로그램 도메인의 개체에 대한 참조는 자체적으로 serialize 가능합니다. 이를 정확하게 복사하여 클라이언트에 복사본을 전송할 수 있어야 합니다. 또한 데이터를 전송하는 개체도 serialize 가능한 개체일 경우가 있습니다. 예를 들어 DataSetISerializable을 구현하는 MarshalByValueComponent를 확장합니다.

원격 사용자 정의 예외

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

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

참조에 의한 마샬링 개체

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

h8f0y3fc.note(ko-kr,VS.100).gif참고:
클라이언트가 MBR 개체와 동일한 응용 프로그램 도메인에 있는 경우 인프라에서는 마샬링의 오버헤드를 피하기 위해 MBR 개체에 대한 직접 참조를 클라이언트에게 반환합니다.

System.MarshalByRefObject가 매개 변수로 전달되는 경우 이것은 호출이 수신될 때 다른 응용 프로그램 도메인에서 프록시가 됩니다. MBR이 값을 반환하고 out 매개 변수가 동일한 방식으로 작동합니다.

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

개체 및 모든 실행 가능 기능의 상태가 원래 만들어진 응용 프로그램 도메인에 남아 있어야 하는 경우에는 MBR 개체를 사용해야 합니다. 예를 들어 운영 체제 핸들인 내부 필드가 있는 개체는 System.MarshalByRefObject를 확장해야 합니다. 운영 체제 핸들은 다른 응용 프로그램 도메인, 다른 프로세스 또는 다른 컴퓨터에서는 의미가 없기 때문입니다. 경우에 따라 개체가 지나치게 커서 강력한 서버에서는 작동할 수 있지만 유선을 통해 33.6KBps 모뎀으로 전송될 때는 적합하지 않을 수 있습니다.

컨텍스트 바인딩 개체

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

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

각 경계를 가로지르는 데는 처리 시간이 소요되기 때문에 서버에서 사용할 원격으로 사용 가능한 개체의 형식을 결정하기 전에 개체가 가로질러야 할 경계를 결정해야 합니다. 특정 컨텍스트에 한정된 개체는 해당 컨텍스트에서만 직접 액세스할 수 있습니다. 특정 응용 프로그램 도메인에 한정된 개체의 경우에도 마찬가지입니다. 이들 중 한 개체를 원격으로 사용하려면 서버 개체 특정 경계 내에서 해당 개체를 호출하기 전에 원격 시스템이 컨텍스트 경계, 응용 프로그램 경계 또는 둘 모두를 성공적으로 가로질러야 합니다. 개체를 호출하기 위한 컨텍스트 검사가 필요하지 않은 경우에는 원격 형식이 System.ContextBoundObject를 확장하지 않도록 해야 합니다. System.MarshalByRefObject의 성능이 더 좋습니다. 컨텍스트 검사가 필요한 경우에는 System.ContextBoundObject를 확장해야 하지만 개체를 호출하기 전에 추가 경계를 가로질러야 한다는 것을 이해해야 합니다.

게시 범위

원격으로 사용 가능한 멤버 및 멤버 형식을 결정하는 방법은 각 원격 시스템마다 다릅니다. 다음을 제외하고 .NET Remoting은 로컬에서처럼 다른 응용 프로그램 도메인에 개체를 노출합니다.

  • 정적 멤버

    정적 필드 및 메서드는 원격으로 사용할 수 없으며 직접 메모리를 통해 필드에 액세스합니다. 즉, .NET Remoting에서는 항상 일부 형식의 인스턴스 멤버를 처리합니다.

  • 인스턴스 필드 및 접근자

    인스턴스 필드 및 접근자 메서드의 경우 시스템은 런타임에 검사를 삽입하여 개체가 프록시인지 여부를 결정합니다. 프록시가 아니면 필드 액세스가 직접 액세스입니다. 그렇지 않으면 프록시는 호출자에 대한 접근자를 제공합니다.

  • 전용 메서드

    전용 메서드는 원격으로 사용할 수 없습니다. 대리자를 원격으로 전용 메서드로 래핑하고 전달할 수 없습니다.

  • 대리자

    대리자는 값에 의한 마샬링 개체입니다. 대리자 내의 개체는 serialize 가능 개체, MarshalByRefObject 개체 또는 ContextBoundObject 개체와 같은 모든 형식의 원격으로 사용 가능한 개체일 수 있습니다. 한 가지 예외는 인터페이스 메서드에 대한 대리자는 성공적으로 원격으로 사용할 수 없다는 점입니다. 대리자는 인터페이스 메서드의 구현을 래핑하며, 이 경우 서버가 사용할 수 있는 클라이언트의 형식 정보가 필요합니다.

  • 개체에 대한 메서드 재정의

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

    • Equals

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

    • GetHashCode

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

    • ToString

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

    • Equals(정적 버전)

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

    • MemberwiseClone

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

참고 항목

작업

방법: 원격 개체에서 throw할 수 있는 예외 형식 만들기

관련 자료

.NET Framework Remoting 개요
개체를 원격으로 사용 가능하도록 설정