STUB(스텁) 과 SKELETON(스켈레톤)

Dev/Network 2012. 6. 18. 16:27

개발을 할려면 컨셉이 애매모호 하거나, 논리는 이미 알고 있지만 그걸 가리키는 용어를 모르는 경우가 있다.


이번에 gSoap과 OnVif를 하는데 STUB, SKELETON이 정확히 무슨의미인지 알아볼려고 찾다가


잘 설명한 글들이 있어서 스크랩 한다.





스텁(Stub)과 스켈레톤(Skeleton)


스텁은 객체 그 자체와 동일한 비즈니스 메소드를 가진 인터페이스를 구현하지만, 스텁의 메소드는 비즈니스 로직 자체를 담고있지는 않으며, 클라이언트가 스텁의 비즈니스 메소드를 호출하면 호출된 메소드 명과 매개변수로 전달된 값들이 스트림 형태로 네트워크를 통해 스켈레톤에 전달된다.

 

해당 스트림을 스켈레톤이 받게 되면 스켈레톤은 스트림을 분석하여 어떤 메소드가 요청되었는지를 파악하고, 서버에 있는 객체의 비즈니스 메소드를 호출하게 된다. 메소드의 실행 결과값은 다시 스켈레톤에 의해 스텁으로 전달되며, 스텁은 마치 해당 비즈니스 로직을 로컬 컴퓨터에서 처리한 것처럼 클라이언트 애플리케이션에 결과값을 전달한다.


짐작하겠지만, 이 과정은 네트웍을 통한 자료교환을 포함하므로, 로칼에서의 메소드 콜보다는 훨씬 많은 시간을 소모한다. 따라서 원거리 호출의 횟수를 줄이는 것은 수행성능 향상을 위해 반드시 고려되어야 할 사항이다.

 

아래 그림은 Java RMI를 이용하였을 경우의 클라이언트 측의 스텁과 서버측의 스켈레톤의 형상을 보여주고 있다.





출처 : http://blog.naver.com/PostView.nhn?blogId=cache798&logNo=130004442784






<Stub/Skeleton을 통한 RMI 통신 메커니즘>

 

미들웨어인 Stub/Skeleton에 대해 상세히 설명하겠습니다.

RMI가 외부에 보여지는 모습이라면, Stub과 Skeleton은 이런 메커니즘을 가능하게끔 RMI가 내부에서 여러가지 복잡한 과정을 처리하기 위해 사용하는 미들웨어입니다. Stub과 Skeleton은 우리가 만든 원격 객체를 rmic라는 컴파일러를 사용해서 만드는데, 이렇게 만들어진 Stub과 Skeleton은 각각 클라이언트와 서버에 위치하여 실제로 클라이언트와 서버 사이의 통신 과정을 처리해줍니다.

 

Stub은 클라이언트 프로그램에게 원격 객체가 마치 로컬에 있는 것처럼 보이도록 해줍니다. 실제로, 클라이언트 프로그램이 원격 객체의 메서드를 호출하면, 내부적으로는 Stub의 메서드가 호출이 됩니다. 호출된 Stub의 메서드는 클라이언트의 메서드 호출을 네트워크를 통해 원격 객체에게 전송해 줍니다. Stub은 원격 객체에게 메서드 호출을 전송해주기 위해 서 다음과 같은 단계를 거칩니다.

 

1.  원격 객체를 가지고 있는 서버의 JVM(자바 가상 머신)과 연결 상태를 만든다.

2. 원격지의 JVM에게 전송될 메서드 호출의 매개변수를 특정한 형식에 맞춰서 정렬 시키고(이 과정을 Marshaling이라고  합니다) 전송한다.

3. 원격 메서드의 실행 결과를 기다린다.

4. 원격 메서드의 반환 값이 전송되어 오면, 그 값을 읽어서 해석한다.(이 과정을 UnMarshaling이라고 한다).

5. 반환 값을 호출자에게 반환 한다.

 

 잠시 Marshaling과 UnMarshaling에 대해 설명을 드리고 넘어가겠습니다. 먼저 Marshaling은 데이터를 바이트로 쪼개서 TCP/IP 같은 통신 채널을 통해 전송될 수 있는 형태로 바꿔주는 과정입니다. 그와 반대로 UnMarshaling은 데이터를 전송받은 후에 원래의 형태로 복원하는 것을 말합니다. Marshaling을 수행하기 위해서는 ObjectOutputStream클래스를 사용하며, UnMarshaling을 수행하기 위해서는 ObjectInputStream클래스를 사용합니다.

→ 이런 면에서 보면 참 JAVA는 개발자가 사용하기 편하도록 만든 거 같다니까... ^^

 

서버는 클라이언트가 가지고 있는 Stub에 상응하는 Skeleton을 가지고 있습니다. Skeleton은 Stub이 하는 것과 반대의 일을 한다고 보시면 됩니다. Skeleton은 Stub으로부터 메서드 호출을 전송 받아서, 해당하는 원격 객체에게 호출을 넘겨주고 다시 그 결과를 Stub에게 전송하는 역할을 합니다. Skeleton은 다음과 같은 단계를 거쳐 클라이언트의 메서드 호출을 처리합니다.

 

1. 클라이언트의 Stub으로부터 메서드 호출이 전송되어 오기를 기다린다.

2. Stub이 메서드 호출을 전송해주면, 네트워크로부터 매개 변수 값을 읽고 해석한다.(UnMarshaling)

3. 해당하는 원격 객체의 메서드에게 매개 변수를 넘겨주고 실행시킨다.

4. 실행된 메서드의 결과를 특정한 형식에 맞춰서 정렬시키고 전송한다. (Marshaling)

 

아래 그림은 정수 값 두 개를 매개변수로 넘겨주면 합을 계산해주는 add()라는 메서드를 가진 원격 객체를 클라이언트가 호출하고, 그 결과값을 반환 받는 과정을 표현한 것입니다.

 

그림 18‑6 원격 메서드를 호출

그림 18‑7 메서드 결과를 반환

 

※ Stub, Skeleton은 매개변수의 직렬화, 역 직렬화 같은 처리와 네트워크 레벨에서의 통신을 감춰줌으로써, 우리가 작성할 어플리케이션과 RMI의 내부 구조 사이의 인터페이스 역할을 합니다. 이런 특성으로 인해, 프로그래머는 마치 로컬에 존재하는 객체의 메서드를 호출하는 것처럼 일반적인 자바 플랫폼상의 프로그래밍 스타일을 그대로 사용할 수 있습니다. 이렇게 객체 지향적으로 만들어지는 분산 시스템을 분산 객체 모델(Distributed Object Model)이라고 합니다.


출처 : http://blog.naver.com/chetgood/80045310424

: