본문 바로가기

Wanna be a Programmer/C#

.NET Remoting

원격 서비스(.Net Remoting Service)를 통해서 외부로 공개할 수 없는 컴포넌트나 보안상 중요한 데이터베이스와 같은 자원을 이용할 수 있다. 자원 자체가 원격 서버에 존재하고 클라이언트는 서비스만 받는 형식이다.

클라이언트에서 원격 객체의 함수를 호출했을 때 함수 자체는 원격 서버에서 호출되기 때문에 원격 서버의 CPU를 사용한다. 매개변수는 클라이언트에서 네트워크를 통해 전달되며 이것을 넘겨받은 원격 객체는 함수를 호출한 후, 리턴 값을 다시 클라이언트에게 넘겨준다.


■ .Net Remoting 서비스를 위한 구성요소.

서버

1. 원격 클래스(Remote Class)와 원격 객체(Remote Object)

2. 채널(Channel)

3. 포매터(Formatter)

클라이언트

1. 프록시 객체(Proxy Object) - 원격 참조 객체.

2. 채널

3. 포매터


■ 채널과 포매터

채널로 전송되는 데이터는 필요한 형식에 맞게 인코딩, 디코딩 된다. .Net Remoting에서 기본적으로 제공되는 포매터는 SOAP 포매터와 Binary 포매터이다.

SOAP은 XML 형식으로 구성되어 있고, Binary는 이진 형식으로 구성되어 있다. 인코딩 속도면에서 Binary 포매터가 빠른것은 분명하나 상호운용성이 중요시되는 이기종간의 통신에서는 SOAP 포매터를 고려해볼 필요가 있다.

채널은 HTTP 채널과 TCP 채널이 제공된다.

1. HTTP 채널은 기본값으로 SOAP 포매터를 이용한다.

2. TCP 채널은 기본값으로 Binary 포매터를 이용한다.


■ 원격 클래스 작성

서버를 통해 노출되는 원격 클래스의 필요 조건은 다음과 같다.

- MarshalByRefObject 를 상속받아 구현되어야만 한다.

클라이언트에서 이 원격 클래스를 참조하기 위해서는 위의 설명대로 프록시 객체(Proxy Object)가 필요하다. 클라이언트는 원격 서버에 접속해서 프록시 객체를 생성해야 하는데, 이 때 원격 클래스의 메타데이터가 있어야 한다. 이는 원격 클래스에 대한 DLL 참조를 통해 이루어질 수 있다.

프록시 객체를 생성하는 코드는 아래 한줄로 이루어진다. 구현엔 큰 부담을 주지 않는 .Net Remoting의 장점이라 할 수 있다.

object obj = Activator.GetObject(typeof(원격 클래스 명), "리모팅 서비스 URL");

: 원격 서버에서는 원격 클래스로 객체를 생성한 후 원격에서 참조할 수 있는 정보를 담고 있는 ObjRef형의 객체를 만들 것이다. 이 객체는 값 마샬링으로 클라이언트로 전달되며, 클라이언트는 전달된 ObjRef형의 객체를 이용해서 프록시 객체를 생서할 것이다. 그 결과가 위의 object obj에 저장된다.

이 작업은 참조 마샬링을 하기 위해서 반드시 거쳐야 하는 과정이다.


■ 마샬링이란?

마샬링이란 이기종간의 통신을 위해서 서로간의 형식을 맞추는 것을 말한다.

.Net Remoting에서 사용되는 마샬링은

값 마샬링 (Marshal By Value)와 참조 마샬링 (Marshal By Reference) 두 가지로 나뉜다.

1. 값 마샬링

객체의 메모리를 통째로 저장한 후 다른 머신에서 객체를 복원해서 사용하는 기술을 말한다. 이러한 기법을 .Net 에서는 직렬화라고 부른다.

2. 참조 마샬링

객체를 핸들하기 위한 정보만을 묶어서 넘긴 후 그 정보를 이용해서 원격으로 객체를 핸들하는 기술을 말한다.

** 앞서 프록시 객체가 언급 되었다. 이것이 바로 객체를 핸들하기 위한 정보를 묶어 놓은 것이다. 진짜 객체를 프록시 객체 즉 가짜 개체가 호출하는 방식이다.

*** 참조 마샬링 자체가 바로 .Net Remoting인 것이다.

'Wanna be a Programmer > C#' 카테고리의 다른 글

닷넷이란?  (0) 2012.09.10