* 원격 프로시저 호출(RPC:Remote Procedure Call)

원 격 프로시저 호출(RPC:Remote Procedure Call)은 이종 플랫폼에 상의 분산 어플리케이션의 상호처리작용, 이동 성, 유연성을 증가시키고 클라이언트/서버 인프라스트럭처의 하나이다. RPC는 어플리케이션 개발자를 다양한 운영체제와 네트워크 인터 페이스로부터 고립시킴으로써(RPC를 사용할 때는 함수 호출이 프로그래머의 인터페이스이다) 다중 운영체제와 네트워크 프로토콜 사이 의 어플리케이션 개발의 복잡도를 감소시킨다.

원격 프로시저 호출은 흐름제어를 caller와 callee로 대체하는 클 라이언트/서버(예를 들어 쿼리-응답) 상호작용에 잘 맞는다. 개념적으로, 클라이언트와 서버는 양쪽 모두 동시에 실행되지 않는 다. 대신에, 실행 쓰레드는 caller에서 callee로 옮겨 지고 나중에 다시 본래대로 돌아간다.

원격 프로시저를 호출하는 동안 다음의 절차를 거친다.

1. 클라이언트는 client stub 프로시저를 호출하고, 보통 방법처럼 파라미터를 전달한다. client stub은 클라이언트 자신의 주소공간에 들어있다.

2. client stub은 파라미터를 메시지로 마샬링(marshalling)한다. 마샬링(marshalling)은 파라미터의 표현을 표준 포맷으로 변환하는 것을 포함하며, 각 파라미터를 메시지로 복사한다.

3. client stub은 메시지를 전송 계층으로 전달하며, 전송계층은 그것을 원격 서버에 보낸다.

4. 서버상에서, 전송 계층은 메시지를 server stub으로 넘겨주고, server stub은 파라미터를 언마샬링(unmarshalling)하고 원하는 서버 루틴을 일반적인 프로시저 호출 메커니즘을 통해 호출한다.

5. 서버 프로시저가 끝나면 server stub(일반 프로시저 호출 복귀를 통해)으로 복귀하고 server stub은 리턴 값을 메시지로 마샬링(marshalling)한다. server stub은 메시지를 전송계층으로 넘긴다.

6. 전송 계층은 결과 메시지를 클라이언트의 전송 계층으로 전송하고 클라이언트의 전송 계층은 다시 client stub으로 보낸다.

7. client stub은 결과 파라미터를 언마샬링(unmarshalling)하고 실행결과를 caller에게 넘겨준다.

** 참조 사이트

1. RPC에 관한 소개
   http://www.sei.cmu.edu/str/descriptions/rpc_body.html

2. RFC1050-RPC:Remote Procedure Call Protocol Specification Version 2 
   http://www.cse.ohio-state.edu/cgi-bin/rfc/rfc1057.html 

'UP! > Web Service' 카테고리의 다른 글

Internet Core Protocols  (0) 2008.08.21
[토론4] 웹서비스와 시맨틱 웹  (0) 2008.08.21
RMI  (0) 2008.08.21
UDP(User Datagram Protocol)  (0) 2008.08.21
SCTP  (0) 2008.08.21
Posted by 으랏차
,

RMI

UP!/Web Service 2008. 8. 21. 14:13
* RMI(Java Remote Method Invocation)

자 바는 객체 지향 언어이다. 객체들은 그것들이 가지고 있는 데이터와 이 데이터를 사용하고 조작하기 위한 메쏘드(method)들로 정 의된다. RMI 시스템은 이런 객체 지향 자바 프로그래밍 언어에서 작동하고 객체들을 효율적으로 다룬다. 자바 RMI 시스템은 원 격 객체의 메쏘드를 정의하는 원격 인터페이스의 메쏘드를 호출함으로써 행동한다. 자바 RMI 시스템은 그것이 자바 가상 머신 상에 서 작동한다는 것을 가정하고, 그것은 호스트의 운영체제와 하드웨어를 이용하는 소프트웨어에 구현된 모조의 마이크로프로세서이 다. 그 마이크로프로세서는 내포되어 있고 실제가 아니기 때문에, 코드는 호스트 컴퓨터에 의해 실행되기 보다는 인터프리트 된다.

첨부 그림은 자바 RMI의 구조를 나타낸다.

이 다 이어그램은 자바 RMI 시스템을 표현해 놓은 것이고 클라이언트가 원격의 서버 객체에 있는 메쏘드를 호출할 때의 양방향 이동 경로 를 묘사한다. Stub/Skeleton은 애플릿과 어플리케이션 사이의 인터페이스이고 원격의 참조 계층으로 데이터를 전송한 다. Stub는 원격 참조 계층에 호출을 요청함으로써 원격 객체로의 호출을 초기화 하고 호출이 완료될 때 원격 참조 계층에 알려준 다. Skeleton은 원격 객체를 구현하기 위한 호출을 초기화 한다. 원격 참조 계층은 원격 주소로의 연결을 설정하고 조종하 고 감시하는 전송 계층과 통신을 한다.

* 참조 사이트

1. EDM/2 사이트의 RMI 페이지 : 
http://www.edm2.com/0601/rmi1.html 
2. Web Cornucopia 사이트의 RMI 페이지 : 
http://my.execpc.com/~gopalan/java/java_rmi.html 
3. java.sun.com 사이트의 RMI 페이지 : 
http://java.sun.com/developer/codesamples/rmi.html 

'UP! > Web Service' 카테고리의 다른 글

[토론4] 웹서비스와 시맨틱 웹  (0) 2008.08.21
RPC:Remote Procedure Call  (0) 2008.08.21
UDP(User Datagram Protocol)  (0) 2008.08.21
SCTP  (0) 2008.08.21
분산객체 시스템(COM,COm+,DCOM,MTS) 에 대한 개념  (0) 2008.08.21
Posted by 으랏차
,
UDP(User Datagram Protocol)

UDP(User Datagram Protocol) 는 IP(Internet Protocol)를 사용하는 네트워크에서 컴퓨터들 사이에 메시지가 교환될 때 제한된 서비스를 제공하는 통 신 프로토콜이다. UDP는 IP와 함께 TCP(Transmission Control Protocol)를 대체하는 것으로 때때 로 UCP/IP라고도 불린다. UDP는 TCP처럼 어떤 컴퓨터에서 다른 컴퓨터로의 데이터 개체(데이터그램(datagram)이라 불 리는)를 실제로 얻기 위해 IP를 사용한다. 그러나, TCP와는 달리 UDP는 메시지를 패킷들(데이터그램들)로 분할하여 다 른 쪽 끝에서 이것을 다시 재조립하는 서비스를 제공하지 않는다. 특히 UDP는 데이터가 도착할 때 패킷을 순서화 하지 않는다. 이 것은 완전한 메시지가 도착했을 때 올바른 순서로 만드는 것은 UDP를 사용하는 어플리케이션 프로그램이라는 것을 의미한다. 매우 작 은 데이터 유닛을 교환하기 때문에(그러므로, 매우 작은 메시지를 재조립하기 때문에) 처리 시간을 보존하기를 원하는 네트워크 어플리 케이션은 TCP 보다는 UDP를 선호할 수도 있다. TFTP(Trivial File Transfer Protocol)은 TCP 대 신에 UDP를 사용한다.

UDP는 IP 계층에 의해 제공되지 않는 두 가지 서비스를 제공한다. 다른 사용자의 요청을 구분하는 것을 도와주는 포트 번호와 데이터가 온전하게 도착했는지를 증명하는 체크섬(checksum) 기능을 제공한다.

OSI(Open Systems Interconnection) 통신 모델에서, UDP는 TCP와 마찬가지로 계층 4의 전송 계층에 속한다.

* 참조 사이트
1. UDP : the User Datagram Protocol ?Connectionless Transport
   http://www-net.cs.umass.edu/kurose/transport/UDP.html

2. RFC768 : User Datagram Protocol
   ftp://ftp.isi.edu/in-notes/rfc768.txt

3. The User Datagram Protocol(UDP)
   http://www.erg.abdn.ac.uk/users/gorry/course/inet-pages/udp.html

'UP! > Web Service' 카테고리의 다른 글

RPC:Remote Procedure Call  (0) 2008.08.21
RMI  (0) 2008.08.21
SCTP  (0) 2008.08.21
분산객체 시스템(COM,COm+,DCOM,MTS) 에 대한 개념  (0) 2008.08.21
분산객체 시스템(COM,COm+,DCOM,MTS)  (0) 2008.08.21
Posted by 으랏차
,

SCTP

UP!/Web Service 2008. 8. 21. 14:12
* SCTP(Stream Control Transmission Protocol)

SCTP(Stream Control Transmission Protocol) 은 데이터를 독립적인 연속된 스트림을 전송하는 종단 사이의 연결 지향 프로토콜이다. SCTP 끝점은 다중의 자동 유도(multi- homing)를 지원하고, 그렇기 때문에 인터페이스 중복이 프로토콜 내부에 만들어진다. 선택적 전송 메커니즘을 통해, SCTP 는 오류를 해결하고 데이터 전송 프로세스를 버퍼에 저장한다.

SCTP는 발전된 성능, 신뢰성, 그리고 제어 기능을 가 진 어플리케이션을 제공한다. 이 프로토콜은 연결 실패의 발견과 관련된 감시가 의무적인 곳에서는 필수적이다. 게다가, SCTP는 음 성/데이터를 전달하고 수준 높은 실시간 서비스를 지원하는 네트워크 시스템과 어플리케이션에서 구현될 수 있다.

SCTP 표 준개발은 1997년 IETF SIGTRAN(Signaling Transport) WG에서 시작되었으며, IP 망에 서 VoIP(Voice over IP) 시그널링 트래픽 전송을 위한 프로토콜 개발이 주요 목적이었다. 이를 위해 시그널링 게이트웨 이간에 실시간으로 수 많은 사용자의 다양한 신호처리 정보를 신뢰적으로 전송하고 또한 망 장애에 대비하여 신속한 복구기능이 제공되 는 SCTP 프로토콜을 개발하였다. SCTP는 UDP의 메시지지향(message-oriented) 특성과 TCP의 연결지향 (connection-oriented) 및 신뢰전송 특성을 모두 포함하는 등 TCP와 UDP의 장점을 살리도록 설계되었다.

SCTP 는 SCTP 사용자 어플리케이션 사이의 계층과, IP와 같은 비연결적 패킷 네트워크 서비스처럼 보인다. SCTP가 제공하는 기 본 서비스는 피어(peer) SCTP 사용자들 사이에서 사용자 메시지를 신뢰적으로 전송하는 것이다. SCTP는 이 서비스 를 두 SCTP 끝점 사이의 관련된 내용 안에서 수행한다.

SCTP를 대략적으로 도식화 하면 첨부와 같다.

* 참조 사이트
1. IETF Home Page 의 SCTP 페이지: http://www.ietf.org/rfc/rfc2960.txt 
2. Computational Science and Mathematics 의 SCTP 페이지: http://www.csm.ornl.gov/~dunigan/net100/sctp.html 

'UP! > Web Service' 카테고리의 다른 글

RMI  (0) 2008.08.21
UDP(User Datagram Protocol)  (0) 2008.08.21
분산객체 시스템(COM,COm+,DCOM,MTS) 에 대한 개념  (0) 2008.08.21
분산객체 시스템(COM,COm+,DCOM,MTS)  (0) 2008.08.21
분산객체기술종류  (0) 2008.08.21
Posted by 으랏차
,
윈도우의 분산객체 기술은 지난 92년 OLE 기술이 소개 된 이후 끊임없이 발전해 COM, DCOM 환경이 개발됐으며 현재의 COM+ 환경에 다달았다. COM+는 3티어 모델 기반의 분 산 환경에서 비즈니스 로직 처리 부분을 완전히 분리시켜 개발, 실행할 수 있는 미들웨어(MTS, MSMQ)를 공급함으로써 보다 쉽 고 편리하게 윈도우 분산 환경을 구축할 수 있는 지름길을 제시하고 있다.

김경현 아이메카 분산객체 시스템 연구실
-------------------------------------------------------------------
지 난 수년동안 소프트웨어 개발 방법은 크게 변화하지 않았다. 대다수 소프트웨어 개발 작업은 시간과 비용에 얽매여 있었으며, 개발된 소프트웨어는 종종 수많은 버그와 유지보수의 문제로 어려움을 겪곤 했다. 지금까지 플로우 차트에서 객체 지향까지 수많은 개발 방법론이 제시됐으며, 그 중 일부는 마치 만병통치약인 것처럼 받아들여지기도 했다. 아마 이러한 방법론이 정말 뛰어난 해결책이었다면 소프트웨어 개발만큼이나 쉬운 일이 없을지도 모른다. 하지만 오늘날 역시 예전과 별반 차이없이 동일한 고민에 시달리고 있다. 플로우 차트 혹은 객체 지향 방법론이 무용지물이라는 얘기는 아니다. 이러한 개념으로 인해 보다 견고한 소프트웨어를 보다 빠르게 개발할 수 있는 건 사실이지만, 날이 갈수록 복잡해지는 컴퓨팅 환경 전부를 지원하기에는 역부족이라는 얘기다. 하나의 해결책이 모든 컴퓨팅 환경을 완벽하게 해결할 수 있는 상황은 지났다는 것. 이젠 모든 다양한 해결책을 잘 융화시켜 복잡한 문제 해결에 어떻게 적용시켜야 하는지에 대해 고민할 시기다.

하나의 솔루션이 모든 것을 해결해 준다?

객 체 지향 소프트웨어 개발의 기본 개념은 모든 문제를 객체와 객체가 수행할 수 있는 행동으로 표현한다는데 있다. 이러한 객체를 보다 구체적으로 표현하기 위한 방법으로 클래스를 정의했으며, 클래스에서는 객체의 상태를 프로퍼티로 표현하고, 객체의 행동은 메쏘드로 표현한다. 객체를 사용하는 클라이언트는 클래스의 각 메쏘드와 프로퍼티가 어떻게 구현되었는지는 전혀 관심이 없으며 클래스가 어떠한 역할을 수행하는지에 대해서만 관심을 가진다(Encapsulation).

클래스를 설계하다 보면 수많은 프로퍼 티와 메쏘드가 존재하고, 이들을 정리할 목적으로 인터페이스라는 것이 고안됐다. 인터페이스는 의미상 유사한 메쏘드, 프로퍼티의 집합으로 실제 구현에는 관여하지 않는다. 인터페이스 역시 클래스를 통해 표현되며, 소프트웨어 재사용성을 높여준다. 한 예로 두 개의 전혀 다른 클래스 A와 B가 있다. 이들은 각각 동일한 인터페이스인 ICommon 인터페이스를 클라이언트에 제공한다. 클라이언트는 자신이 서비스 받고자 하는 통로로 ICommon 인터페이스를 사용할 뿐이지 클래스 A, B에 대해서는 전혀 알 필요가 없다. 이러한 것을 객체 지향 용어로 동질 다형(Poly morphism)이라고 한다. 재사용성을 높이는 또 다른 방법으로 상속(Inheritance)을 얘기할 수 있다. 하나의 클래스는 기존 다른 클래스의 프로퍼티와 메쏘드를 상속받아 변경, 확장 등으로 기존 클래스를 재사용할 수 있다.

C++ 와 자바와 같은 객체 지향 언어는 이와 같은 특성을 지닌 클래스와 인터페이스를 구현하는 데 많은 이점을 제공하지만 대규모 분산 애플리케이션을 개발하는 데는 다소 적절하지 못하다. 프로그래밍 언어는 일반적으로 하나의 프로세스, 하나의 동일 언어로 작성된 애플리케이션을 개발하는 데에 그 기능의 초점이 맞춰져 있으므로 다양한 환경이 복합적으로 결합돼 있는 분산 환경을 지원하는데는 한계가 따른다. 이러한 문제를 해결하기 위해 언어 수준이 아닌 시스템 수준의 새로운 모델 COM이 개발됐다. COM은 객체 그 자체와 객체들 간의 통신 메커니즘을 제공하는 바이너리 표준을 정의한다. 객체와 클라이언트간의 모든 통신은 인터페이스를 통해 이뤄지며, 그 통신이 같은 컴퓨터 내에서든 지 원격 컴퓨터에서든지 프로그래밍 언어에서는 관계없이 객체의 메쏘드 호출로 동일하게 표현한다. 또한 바이너리 수준의 표준이어서 프로그래밍 언어에 중립적이므로 어떠한 언어를 사용해도 개발이 가능하며 다른 언어로 개발된 컴포넌트를 서로 참조할 수 있다.

오늘날 소프트웨어 애플리케이션은 나날이 덩치 가 커지고 복잡해지고 있으며, 네트워크 환경과 융합돼 있고, 서로 이질적인 다양한 시스템과 연동되어 작동한다. 그렇다면 COM이 이런 복잡한 컴퓨팅 환경을 훌륭하게 지원하는 해결책일까? 하나의 아이디어만으로 이 모든 문제를 풀기에는 이미 너무나 복잡해져 있다. 그래서 마이크로소프트는 COM과 마이크로소프트 트랜잭션 서버(MTS)의 조합을 기반으로 한 COM+라는 환경을 새로운 해결책으로 제시하고 있다.

COM+의 두 가지 기능

현재의 COM+는 크게 두 가지 기능을 제 공한다. 하나는 기존의 COM이 정의한 프로그래밍 환경이고, 다른 하나는 분산 애플리케이션 구축을 위해 다양한 실행 환경(run-time environment)을 제공하는 컴포넌트 서비스다. 대규모 중요 한 시스템에서는 데이터베이스를 포함하는 복잡한 작업 수행시 클라이언트 오류를 감지해 적절히 대처할 수 있어야 한다. 트랜잭션에 대한 어떠한 보장도 없이 데이터를 처리하는 도중에 오류가 발생했다면 데이터의 일치성은 전혀 보장받을 수 없을 것이다. 데이터 일치성을 보장받기 위해 개발자가 직접 복잡한 단계마다 트랜잭션 처리를 위해 일일이 코딩 작업을 해야한다. 이렇듯 컴포넌트 소프트웨어 기본 모델의 가장 큰 문제점은 다양한 비즈니스 로직 처리와 같은 애플리케이션의 기본적인 기능 구현보다 안정성, 확장성 등의 부가적인 작업에 훨씬 많은 에너지를 소모한다는 것이다.

마이크로소프트는 이러한 사실을 직시하고 소프트웨어 컴포넌트를 위한 쓰레 딩, 동시성 보장, 보안, 관리, 견고함 등을 지원하기 위해 윈도우 기반의 실행 환경으로 MTS를 개발했다. COM+에서 제공되 는 실행 환경은 MTS 실행 환경을 그대로 이어 받고 있으며, 서버 시스템 개발자가 직면한 다양한 문제를 해결하며, 애플리케이션 본연의 업무에 충실할 수 있도록 만들어 준다.

마이크로소프트는 지난 수년간 분산 환경을 지원하고 자 DCOM, MTS, MSMQ와 같은 기본 프로그래밍 환경을 제공해 왔으며, 현재 이 모든 것을 윈도우 2000에 통합시켜 COM+라는 통합된 분산 개발 환경을 제공한다. 이미 우리는 COM에 대해선 너무 많은 것을 들어 왔으므로 COM에 대한 설명은 가능한 줄이고, COM+ 환경을 구축하는 각각의 컴포넌트 서비스를 중심으로 설명을 진행할 것이다.

사회의 다른 모든 분야와 마찬가지로 시간이 흐를수록 컴퓨팅 환경 역시 점점 복잡해지 고 있다. 개인용 데스크톱 환경만 돌아보더라도 이 사실을 쉽게 알 수 있다. 국내에 IBM PC가 처음 소개되던 80년대 후반과 펜티엄 컴퓨터가 세상을 주름잡고 있는 현재를 비교해보자. 과거에 PC는 퍼스널 컴퓨터라는 이름 그대로 개인용 애플리케이션 수행을 주목적으로 하였으나, 현재는 PC 서버라는 용어를 사용할 정도로 서비스 제공자의 기능을 충분히 제공할 만큼 고성능화 되었다.

마이크로소프트 컴포넌트 서비스

CPU 클 럭 스피드의 향상 못지 않게 소프트웨어도 많은 변화가 있었다. 웹의 등장으로 인터넷이라는 네트워크와 웹 서버라는 용어가 심심지 않게 등장하고 있으며, 단순한 HTML 문서를 보여주던 시스템에서 이제는 복잡한 기업용 업무 처리 시스템까지 그 영역을 넓혔다. 사용자 입장에서는 화려해진 화면과 다양한 기능을 제공하는 웹 환경의 발전에 흐뭇해할지 모르겠지만, 개발자는 나날이 피곤해지고 있다. PC에서 한 명의 사용자를 위해 수행하는 간단한 소프트웨어를 개발하다가 이제는 동시에 수천, 수만명 접속자가 요구하는 사항을 빠르고 안정적으로 처리해야하는 복잡한 서버 소프트웨어를 개발해야 한다. 필자 역시 마찬가지로 현재는 네트워크에서 수행되는 복잡한 서버 군을 개발하고 있다.

그 렇다면 서버를 개발하는 데 있어 가장 큰 문제점은 무엇일까? 필자의 경험에 비춰보면 효율적이고 안정적인 네트워크 서버를 개발하는 작업은 정말 힘든 작업이다. 수십 명의 동시 접속자에서부터 수천 명의 동시 접속자를 원할히 처리하기 위해 쓰레드 풀을 이용한 대칭형 멀티 프로세서 지원은 기본이며, 서버의 자원을 최대한 효율적으로 사용하기 위해 독립적인 리소스 관리자도 개발했고, 디스크 입출력 최적화를 위한 다양한 캐시도 구현했었다.

서버 애플 리케이션을 개발할 때마다 이런 기본적인 항목을 모두 구현해야 한다면 정말 보통 일이 아닐 것이다. 클라이언트가 필요로 하는 서버 애플리케이션의 기본 기능보다 기타의 부가적인 시스템 기능을 위해 훨씬 더 많은 시간이 투입될지도 모른다. 배보다 배꼽이 크다라는 말이 꼭 들어맞는 상황이다. 

다음에 소개하는 몇 가지 서비스를 읽어보면, 어쩌면 서버 애플리케이션 개발 작업이 간단한 데스크톱 애플리케이션을 개발하는 것만큼 쉽다는 생각이 들지도 모르겠다. 배꼽이 훨씬 작은 정상적인 상황이다.

COM과 DCOM

비 주얼 베이직과 같은 RAD 툴이 처음으로 선보였을 때를 생각해보자. ‘어려운 윈도우 프로그래밍이 이렇게 간단하게 만들어질 수도 있구나’라고 감탄사를 연발했었다. 윈도우를 만들기 위해 복잡한 CreateWindow라는 API를 호출할 필요도 없고, 그저 마우스 드래그 앤 드롭으로 윈도우 디자인에만 신경쓰며 단지 버튼 클릭, 메뉴 선택과 같은 이벤트 발생시 수행할 일에 초점을 맞춰 개발할 수 있었다. 게다가 필요한 모든 기능을 일일이 개발자 스스로가 만들 필요도 없고, 대신 자료실에 그러한 기능을 하는 모듈이 있는지 찾는데 집중하는 것이 소프트웨어 생산성 향상 측면에서나 개발자의 스트레스를 줄이는 측면에서 훨씬 득이 됐다.

하지만 늘 그렇듯이 눈 높은 소비자들은 다수의 사용 자를 동시에 지원할 수 있고, 복잡한 데이터베이스를 쉽게 액세스할 수 있으며, 또한 한 대도 아닌 여러 대의 컴퓨터를 동시에 사용할 수 있기를 바랐다. 수요가 있으면 공급이 따르는 법, 복잡한 요구 사항에 적절히 대응하기 위해 소프트웨어 컴포넌트라는 새로운 개념이 도입됐다. 컴포넌트는 특별한 기능을 수행하는 독립적인 소프트웨어 조각이라고 볼 수 있으며, 어떠한 다른 프로그램에서도 쉽게 이를 사용할 수 있고, 쉽게 수정 가능하며, 배포될 수 있어야 한다. 이를 위해서는 표준화된 어떠한 방법론이 필요했으며, 마이크로소프트는 컴포넌트 오브젝트 모델(COM)이라는 소프트웨어 컴포넌트 사용을 위한 표준을 만들었다.

COM은 윈 도우 환경에서 수행되며 바이너리 코드 레벨에서 호환 가능한 소프트웨어 컴포넌트 생성에 대한 기술이다. 따라서 COM은 프로그래밍 언어가 아니며 소스 코드 레벨의 라이브러리 역시 아니며, 컴파일러는 더더욱 아니다. 대신 바이너리 코드의 호환 표준이므로 프로그래밍 언어, 각종 개발 툴에 완전히 독립적인 소프트웨어 조각이다.

초기 의 COM은 하나의 컴퓨터에서 수행되는 애플리케이션의 부품으로 사용했으나, 분산 컴퓨팅 환경의 비약적인 발전과 더불어 COM 역시 DCOM(Distributed COM)이라는 이름을 달고 지난 96년에 시장에 출현했다. DCOM 은 COM과 그 기능이 매우 흡사하나 애플리케이션이 수행되는 컴퓨터가 아닌 다른 컴퓨터(물론 둘 사이에는 네트워크라는 고리가 물려 있어야 한다)에서 독립적으로 수행 가능하다는 놀라운 기능을 제공한다. 또한 윈도우 환경을 넘어서 유닉스, IBM 메인 프레임 에서도 수행 가능해 ERP, 뱅킹, 의료정보 시스템과 같은 대규모 비즈니스 시스템에 널리 사용하고 있다.

마이크로소프트 트랙잭션 서버

마 이크로소프트는 엔터프라이즈급 규모로 확장 가능한 서버 애플리케이션 개발 환경을 지원하기 위해 마이크로소프트 트랜잭션 서버(MTS)를 지난 96년에 내놓았다. MTS는 COM과 DCOM으로 개발된 기업용 애플리케이션 시스템을 위한 실행 환경으로 분산 컴퓨팅 환경 에서 안정적이고, 확장 가능하며 트랜잭션을 지원한다.

트랜잭션 서버라는 명칭 때문에 어렵 게 받아들일 수도 있지만 한 걸음 물러나서 보면 아주 간단한 시스템으로 생각할 수도 있다. MTS 기반의 모든 애플리케이션은 COM 컴포넌트의 집합으로 이뤄져 있으며, 이를 사용하는 클라이언트는 DCOM을 사용해 원격지에서 MTS 애플리케이션을 사용한다. 즉 마이크로소프트의 기반 기술인 COM/DCOM을 보다 효율적이고 안정적으로 사용 가능하게 만들어 주는 통합 환경으로 생각하면 된다.

IIS와 ASP

인터 넷 인포메이션 서버(IIS)가 왜 마이크로소프트 컴포넌트 서비스의 하나로 언급되는지 의아해 하는 독자가 있을지도 모르지만, 인터넷 인포메이션 서버는 엄연히 중요한 컴포넌트 서비스다. 인터넷 인포메이션 서버는 기본적인 웹 서버 기능, HTTP, SSL(Secure Sockets Layer), CGI Common Gateway Interface)를 지원할 뿐 아니라 ASP(Active Server Page)라는 컴포넌트 기반 의 스크립트 언어를 지원한다. ASP에서는 다양한 종류의 COM 컴포넌트를 액세스할 수 있으며, MTS 애플리케이션도 쉽게 사용할 수 있다.

마이크로소프트 메시지 큐 

DCOM 은 RPC(Remote Procedure Call)를 통해 원격지에서 COM을 사용한다. 하지만 클라이언트 서버간에 동기화된 통신 을 사용하므로 다수의 분산 애플리케이션 환경에는 다소 부적절하다. 분산 환경에서는 메시지 큐를 사용한 넌-블럭킹 모드의 비동기 통신이 종종 필요하다. 이러한 기능을 제공하는 것이 MSMQ 서버다. 애플리케이션은 메시지를 다른 애플리 케이션에 보내지만 그에 대한 응답을 기다리지 않는다. 보낸 메시지는 MSMQ 서버의 큐에 저장되며 메시지를 받을 애플리케이션이 메시지를 받은 후 삭제할 때까지 계속 유지한다. 만일 보낸 메시지에 대한 응답이 필요할 경우 메시지를 보낸 애플리케이션은 남는 시간에 MSMQ 서버의 큐를 검사해 응답 유무를 확인할 수 있다. 네트워킹 오류와 같은 여러 예상치 못한 상황이 빈번한 분산 환경 하에서 이와 같은 비동기 메시지 전송은 전체적인 시스템 안정성 및 효율성 향상을 위해 반드시 필요하다. 

MSMQ 역시 컴포넌트 서비스이므 로 COM과 분리시켜 설명하긴 어렵다. COM 인터페이스가 제공하는 다양한 메쏘드 및 프로퍼티 호출은 MSMQ의 메시지로 표현되므로 ASP 스크립트, MTS 애플리케이션과 연동해서 훌륭하게 작동된다.

간단한 예제

이 상에서 소개한 마이크로소프트 컴포넌트 서비스를 한 눈에 알아볼 수 있는 분산 컴퓨팅 시스템 예제를 살펴보자. 다음 그림은 B2C 전자상거래 사이트 시스템 구성도이다. 여기에서 주문을 내는 경우 각각의 IIS, ASP, MTS, MSMQ, DCOM이 어떻게 연동돼 사용되는지 알아보자.

이 시스템의 가장 핵심적인 부분은 주문서를 작성하고, 실제 주문을 처 리하는 비즈니스 로직을 구현한 COM 컴포넌트로 내부적으로는 데이터베이스를 액세스해 재고를 검사하고 주문을 내고 발송하는 모든 실제적인 일을 수행한다.  또한 이들 컴포넌트는 동시에 수많은 주문을 처리할 수 있어야 하므로 MTS 환경에서 수행시킨다. MTS 환경은 동시에 여러 트랜잭션 처리를 가능케 하며, 확장성과 안정성을 제공한다.

주문이 완료되면 주문 처리 컴포넌트는 창고로 주문 에 대한 포장과 발송을 위한 메시지를 보낸다. 주문 처리 컴포넌트는 포장과 발송에 대한 완료 여부를 알 필요가 없으므로 MSMQ를 이용해 비동기 통신을 수행한다. 창고에 있는 애플리케이션은 MSMQ 서버의 큐에 저장된 주문 메시지를 읽어 차례로 포장 및 발송 작업을 처리한다.

이번에는 물건을 구입하는 소 비자의 주문을 처리하는 방법을 살펴보자. 이 시스템에서 소비자는 오퍼레이터와 전화를 통해 물건을 주문할 수 있고, 웹 사이트를 통해 직접 주문을 할 수도 있다. 첫 번째의 경우 실제 주문을 처리하는 사람은 전자상거래 회사에 근무하는 오퍼레이터로 윈도우 98 환경에서 주문 프로그램을 사용해 주문을 낸다. 이 경우 주문 프로그램은 DCOM을 통해 MTS에 있는 주문 컴포넌트를 액세스해 처리하게 된다. 두 번째 경우는  웹브라우저를 사용해 주문하는 경우로 소비자가 주문 웹 페이지를 액세스하면 IIS는 ASP 스크립트 프로그램을 수행하게 된다. 앞에 서 언급한대로 ASP 스크립트는 다양한 COM을 액세스할 수 있으므로 MTS 컴포넌트를 사용해 주문을 처리할 수 있게 된다.

앞 의 예제에서 보는 바와 같이 마이크로소프트 컴포넌트 서비스는 분산 컴퓨팅 환경을 위한 다양한 형태의 서비스 환경을 제공하고 있으 며 이를 더욱 발전시켜 COM+ 라는 서비스 환경을 제공한다. 다음장부터 COM+가 나오기까지의 마이크로소프트 분산 컴퓨팅 기술의 발자취를 DCOM, MTS, MSMQ 순으로 살펴볼 것이다.

DCOM

수 년간 컴퓨터 산업 분야에 많은 변화가 있었지만 그 중에서도 가장 비약적인 발전을 보인 부분은 다름 아닌 인터넷 관련 IT 산업일 것이다. 이러한 IT 산업의 발전은 소프트웨어의 대형화를 야기시켰으며, 그에 대한 해결책으로 소프트웨어의 컴포넌트화가 제시되었다. 컴포넌트화는 전체적인 개발 기간을 단축시켰으며, 이질적인 시스템간의 통합을 보다 쉽게 만들어 주며, 소프 트웨어 유지 보수에 드는 비용을 최소화시켰다.

특히 분산 컴포넌트 기술은 다수의 사용자를 처리해야하는 이러한 대 형 IT 시스템을 구성하는 기본이 되었으며 마이크로소프트는 DCOM이라는 분산 컴포넌트 기술을 발표해 이러한 환경을 지원하고 있 다. DCOM은 분산 환경을 효율적으로 지원하기 위해 다음과 같은 세 가지 주요 특징을 가지고 있다.

DCOM은 컴 포넌트 기반 기술이다. DCOM은 가장 널리 사용되는 컴포넌트 기술인 COM 기반의 기술로 다양한 개발 툴의 지원을 받으며 이 미 수많은 서드 파티를 보유하고 있다. DCOM은 컴포넌트 애플리케이션을 인터넷 환경으로 확장시키는 네트워킹 기술이다. DCOM은 인터넷 기본 기술 TCP/IP, 자바, HTTP와 잘 융합해 작동되며 웹을 통해 쉽게 비즈니스 애플리케이션을 구현할 수 있는 환경을 제공한다. DCOM은 여러 플랫폼에서 작동되는 오픈 기술이다. 윈도우 플랫폼 외에 유닉스, IBM 메인프레임에서 도 잘 작동하므로 복잡한 IT 시스템 통합에 유용하게 사용할 수 있다. 이상과 같은 특징으로 DCOM은 분산 애플리케이션 개발 에 중요한 위치를 차지하고 있으며, 기존의 IT 시스템에 큰 변화를 주지 않고, 적은 비용으로 분산 컴퓨팅의 이점을 살릴 수 있는 기회를 제공한다.

DCOM에 대한 기술적 접근

DCOM 기 술에 대해 알아보기 전에 왜 분산 애플리케이션을 만들어야 하는지 생각해보자. 복잡한 비즈니스 로직이 구현된 소프트웨어가 하나 존재 하고, 이를 하나의 서버에 설치해 가동시킨다고 가정하자. 클라이언트 수가 늘어남에 따라 서버의 부하는 증가하게 되고 점점 응답 시간이 늦어지는 문제가 발생한다. 이를 해결하기 위해 애플리케이션을 튜닝할 수  있겠지만 그 보다는 두 배 빠른 서버로 대체하는 것이 적은 비용을 들여 빠르게 해결할 수 있는 한 방법일 수 있다.

반 면 서버에서 작동되는 소프트웨어가 분산객체로 작성돼 있다면 훨씬 더 적은 비용으로 시스템 효율을 극대화시킬 수 있다. 비즈니스 로 직 중 부하가 많이 발생하는 부분을 분리해 새로운 다른 서버(성능이 비슷한)에 옮겨 운영할 경우, 단적인 비용을 비교해 보면 두 배 빠른 서버를 구입하는 것 보다 적은 비용이 든다(4 CPU 서버 가격이 2 CPU 서버 가격 의 몇 배쯤인가 확인해 보면 쉽게 이해가 된다).

또한 애플리케이션 튜닝 측면에서도 많은 이점을 제공한다. 복잡하고 큰 하나의 비즈니스 애플리케이션을 튜닝하는 것보다 여러 개의 컴포넌트 모듈로 분리돼 있는 애플리케이션을 유지 보수하는 것이 쉽다는 건 당연하다.

DCOM 기본 구조

너 무 많이 들어와서 다소 지겹게 들릴 수도 있지만 DCOM이 COM의 확장이라는 사실은 매우 중요하다. COM은 컴포넌트와 컴포넌트 를 사용하는 클라이언트간의 상호 관계를 정의한다. 다음 그림은 이 상호 관계를 나타낸 것으로 둘 사이에 어떠한 시스템 컴포넌트 없 이 직접 대화하는 구조다. 우리가 흔히 알고 있는 인-프로세스 서버 구조다.

<그림 3>은 다른 프로세스 에 존재하는 컴포넌트를 사용하는 경우로 직접 컴포넌트를 액세스하지 못하고 운영체제가 제공하 는 IPC(Interprocess Communication)를 사용해 액세스해야 한다. 마이크로소프트 윈도우는 프로세스를 서로 완전히(?) 격리시키는 구조이므로 컴포넌트를 액세스할 수 있는 다른 방법이 존재하지 않는다. COM/DCOM 런타임 라이브러리 는 IPC를 사용해 클라이언트와 컴포넌트 사이의 대화를 쉽게 해주는 중간 매체 역할을 담당한다.

<그 림 4>는 클라이언트와 컴포넌트가 완전히 다른 컴퓨터에 존재하는 경우로 DCOM은 IPC를 네트워크 프로토콜로 대체한다. 이는 클라이언트 및 컴포넌트 모두가 네트워크를 사용해 통신한다는 사실을 숨김으로써 클라이언트와 컴포넌트 입장에서는 <그림 2>와 별다른 차이가 없다.

위치 독립
분산 컴퓨팅 환경에서 위치 독립 (Location Indepen dence)은 매우 중요하다. 사용하는 컴포넌트의 위치가 동일 컴퓨터에서 인터넷으로 연결된 지구 반대편의 컴퓨터로 변경될 때마다 소스를 고쳐 새로 컴파일해야 한다면 보통 일이 아닐 수 없다. 그러나 DCOM은 이러한 문제를 간단한 레지스트리 편집만으로 아주 쉽게 해결해 준다.

프로그래밍 언어 중립

COM 및 DCOM 프 로그래밍 언어와는 완전히 독립적이므로 분산 애플리케이션 개발시 다양한 언어를 사용해 진행할 수 있다. 사용자 인터페이스 부분은 비주얼베이직 같은 RAD 툴을 사용하고 다소 성능이 많이 고려돼야 하는 부분 혹은 하드웨어 제어 같 은 저 수준 프로그래밍 같은 경우는 C++를 사용할 수 있다. 또한 전체적인 분산 애플리케이션 구조를 빠른 시간 내에 구성하기 위해 비주얼 베이직을 사용해 우선 설계한 후, 차례로 C++를 사용해 재 구현하는 것도 좋은 개발 방법이 될 수 있 다.

네트워크 연결 관리

DCOM은 네트워크를 통해 컴포넌트를 사용하므로 컴포넌트가 동일 컴퓨터에 존 재하는 경우보다 오류 가 발생할 가능성이 훨씬 높으며, 네트워크 오류 발생시 안전하게 오류를 인지하고 알려주는 기능을 제공한다. DCOM은 일종의 ping 프로토콜을 사용해 클라이언트의 생사 유무여부를 확인한다. 클라이언트 컴퓨터는 일정 시간마다 메시지를 전송한다. 만일 컴포넌트가 세 번 이상 지정된 시간동안 ping 메시지를 받지 못할 경우 DCOM은 연결 오류가 발생했다고 간주하고 컴포넌트의 참조수(Reference Count)를 감소시키고, 참조수가 0이 되면 컴포넌트를 메모리에서 릴리즈시키게 된다.

DCOM 확장성

사용자 수가 늘거나 데이터 양이 늘어날 경우에도 분산 애플리케이션은 적절히 잘 대처해야 한다. DCOM은 성능 및 안정성의 손실 없이 이러한 문제를 효율적으로 해결할 수 있는 특성을 제공한다.

대칭형 멀티프로세싱(SMP)

DCOM 은 윈도우 NT가 지원하는 멀티 프로세싱 환경의 장점을 스스로 알아서 적절히 활용한다. 프리-쓰레딩 모델을 사용하는 애플리케이션의 경우 DCOM은 클라이언트의 요구를 처리하는 쓰레드 풀을 관리하며, CPU의 수에 따라 쓰레드 풀을 최적화 시킨다. 개발자는 이러한 쓰레드 풀을 사용한 최적화 프로그래밍에 관심을 가질 필요 없이 비즈니스 로직 구현에 힘쓰면 된다.

유연한 애플리케이션 재배치

고 성능 다중 프로세서 서버라 할지라도 애플리케이션의 로드가 증가에 따른 부하를 감당하기가 쉽지 않다. 이러한 경우 DCOM의 위치 독립이라는 특성을 십분 활용해 컴포넌트를 다른 서버로 분산시킴으로 로드의 증가에 적절히 대응할 수 있다.

특 히 다른 컴포넌트와 상태 정보를 공유하지 않는 컴포넌트의 경우 해당 컴포넌트 복사 본을 쉽게 여러 서버에 분산시켜 설치해 운영할 수 있다. 이렇게 시스템을 구성할 경우 자연스레 사용자의 로드를 여러 서버에 분산시키는 효과를 가져온다.

예 를 들어 사용자가 100여명 되고, 40개의 컴포넌트가 수행되는 서버가 존재한다. 점점 사용자가 늘어 200명이 되어 전체적인 서 버의 부하가 급증해 서비스하는 데 많은 지장을 초래하게 되었고, 이 문제를 해결하고자 새로운 서버를 하나 구입해 20개의 컴포넌트를 새 서버에 분산시켰다. <그림 5>는 이러한 시나리오를 표현한 것으로 손쉽게 서버의 성능을 향상시킬 수 있다.

이 방법 외에 보다 고차원적인 컴포넌트 분산 방법으로 40개 컴포넌트 중에 가장 병목 현상을 보 이는 것을 찾아 완전히 새로운 독립 서버로 분산시킬 수 있다. DCOM을 사용한 분산 애플리케이션 설계는 이러한 재배치 작업을 쉽 게 가능하게 만든다. 최초 애플리케이션 개발시는 하나의 서버에서 모든 컴포넌트를 가동시키지만, 실제 서비스에 들어가 부하가 증가하게 되면 애플 리케이션의 재설계, 재컴파일 작업 없이 쉽게 분산시킬 수 있다.

보통 이러한 병목 현상은 각 프로세싱 단계, 예 를 들면 물건 주문 작업은 주문서 작성, 전송, 재고 확인, 포장, 발송 등의 단계로 이루어지며 각각의 단계는 나름대로의 처리시간 을 가지며 처리를 완료하지 못하면 다음 단계로 진행할 수 없다. 이러한 각각의 단계를 컴포넌트로 표현해 개별 특정 서버에 분산 또는 개별 프로세스로 작동시켜 <그림 7>과 같은 소프트웨어 파이프라인을 구성할 수 있다. 이러한 구성에서 각 컴포넌트는 자신의 작업을 마치고 완전히 나머지 단계가 끝날 때까지 기다리는 것이 아니라 새로운 사용자 요구에 바로 반응할 수 있으므로 전체적인 시스템 성능을 극대화할 수 있다.

DCOM 성능

DCOM 은 네트워크 기반으로 움직이기 때문에 네트워킹의 제약에 따라 많은 성능의 차이를 보일 수밖에 없다. 컴포넌트가 제공하는 메쏘드를 호출할 때 전달되는 파라미터의 크기가 크다면 당연히 그만큼 응답시간이 느려질 것이며, 컴포넌트가 멀리 떨어져 있 을수록(많은 라우터와 다양한 연결 라인이 존재) 응답 시간은 느려질 것이다. DCOM은 이러한 문제를 극복하기 위해 데이터 전송 프로토콜로 TCP 보다는 UDP를 선호한다. UDP를 사용해 실제 데이터 전송 및 ping 메시지 전송 시 필요한 응답(low-level acknowledge)을 줄여 성능을 향상시킨다.

DCOM 공유연결 관리

앞 에서 언급했듯이 컴포넌트 서버는 클라이언트의 생사 여부를 판별해야 한다. DCOM은 이를 위해 ping 테스트(주기적으로 메시지 를 보내 확인)를 사용한다. A라는 클라이언트가 B 서버에 있는 컴포넌트 100개를 사용할 경우, 100개의 컴포넌트 각각이 A 가 살아있는지 확인하기 위해 ping 테스트를 한다면 엄청난 네트워크 트래픽을 야기시킬 것이다. DCOM은 개별적인 100개 의 ping을 발생시키는 대신 100개의 컴포넌트를 나타내는 ID를 생성한 후, 그 ID로 하나의 ping 테스트만을 실행해 네트 워크 트래픽을 줄인다(delta ping).

네트워크 라운드 트립 최적화

네트워크 라운드 트립 (Round-Trips)을 최적화하기 위해서는 데이터를 여러 번 주고받는 대신 한번에 덩치 큰 데이터로 묶어 주고받는 아이디어 를 사용할 수 있다. DCOM에서 메쏘드 호출은 네트워킹을 통해 이루어지므로 잦은 메쏘드 호출은 당연히 많은 네트워크 라운드-트립 을 발생시킨다. 그렇다고 라운드 트립을 줄이기 위해 전달할 데이터를 묶어서 표현한 후 한 번의 메쏘드 호출로 보낸면 서버 역시 그 러한 메커니즘에 맞춰 개발해야 하는 부담이 있다. 다소 성능 향상은 있을지 모르지만 전체적인 애플리케이션 구조가 변질될 가능성 이 커서 좋은 개발 방법은 될 수 없다.

DCOM은 개발자가 이러한 식으로 라운드-트립을 줄이기 위해 노력하지 않더라도 DCOM 마샬링(mar shaling)을 통해 여러 메쏘드 호출을 가로챈 후 하나로 묶어 하나의 원격 프로시저 호출로 처리한다.

DCOM 보안

네 트워크 기반의 분산 애플리케이션에서 보안 메커니즘이 존재하지 않는다면 네트워크를 통해 연결 가능한 어떠한 클라이언트도 컴포넌트 에 쉽게 접속할 수 있으므로 많은 문제가 일어날 수 있다. 만일 분산 환경이 별다른 보안 메커니즘을 지원하지 않는다면 클라이언트 가 컴포넌트에 접속시 사용자 계정과 암호를 보내 인증을 받는 과정을 개발자가 일일이 프로그래밍해야 하는 부담을 안게 될 것이다.

DCOM은 윈도우 NT가 제공하는 확장성 있는 보안 프레임을 사용한다. 윈도우 NT는 예전의 트러스트 도메인 보안에서 공개키 보안 메커니즘까지 다양한 형태의 인증을 지원한다.

컨피규레이션에 의한 보안

DCOM 은 클라이언트, 컴포넌트 양쪽 모두 프로그램 소스 수준의 특별한 보안관련 코딩 없이 분산 애플리케이션을 안전하게 보안할 수 있 다. DCOM이 컴포넌트 위치를 숨기는 것과 유사하게 컴포넌트 보안 관련 사항도 숨기므로 별다른 작업 없이 쉽게 사용할 수 있 다. NT 파일 시스템이 파일 또는 디렉토리에 대해 ACL(Access Control List)을 세팅해 다양한 사용 권한을 제한 하는 것과 동일하게 DCOM은 개별 컴포넌트별로 ACL을 저장한다. 이러한 방법은 직관적으로 해당 컴포넌트를 사용할 수 있는 사용 자 및 사용자 그룹을 지정하며, DCOM 관리 툴(DCOMCNFG)을 사용해 쉽게 조정 가능하다.

클라이언트가 컴포 넌트를 생성하거나 컴포넌트의 메쏘드를 호출할 때, DCOM은 클라이언트 프로세스와 연관된 사용자 계정을 추출한 후 컴포넌트가 수행 되는 컴퓨터 또는 프로세스로 전달한다. 컴포넌트가 설치된 쪽의 DCOM은 시스템의 인증 메커니즘에 따라 사용자 계정이 해당 컴포넌 트의 ACL에 포함되는 지를 검사한 후 없으면 메쏘드 호출을 취소시킨다. 현재 COM+ 환경에서는 ACL을 이용한 보안 기법의 약 점을 극복한 롤(role) 기반의 보안을 사용한다.

인터넷에서의 보안

인터넷에서의 보안 역시 윈도우 NT가 제공하는 보안 메커니즘을 그대로 활용할 수 있다. 윈도우 NT 보안 구성은 다음과 같은 다양한 종류의 보안 공급자를 지원한다.

Windows NT NTLM(NT Lan Manager) authentication pro tocol: 윈 도우 NT 4.0 이전 버전에서 사용되던 기본적 인증 방 법 Kerberos Version 5 authentication protocol: NTLM을 대체하는 기본 인증 프로토콜로 윈도 우 NT 도메인 상에서 리소스 액세스를 제어한 다. Distributed password authentication(DPA): MSN이나 컴퓨터 서브와 같은 초대형 사이트에 서 사용되는 인증 프로토콜Secure channel security service: 윈도우 NT상에서 구현된 SSL/PCT 프로토 콜 앞의 프로토콜 모두는 인터넷에서 사용할 수 있으며, 각각은 서로 다른 장단점을 가진다. NTLM과 Kerberos 기반의 인 증 방법은 중앙 집중식 관리 환경 및 윈도우 NT 기반의 도메인 환경에서 매우 효율적이고 안정적이다. 윈도우 NT 4.0의 디렉토 리 서비스는 거의 10만 사용자에 대한 인증을 거뜬히 처리할 수 있으며, 윈도우 2000의 확장된 디렉토리 서비스는 백만 사용자 로 확대되었으며, 여러 도메인을 윈도우 2000의 디렉토리 트리에 통합시키면 실제적으로 하나의 도메인으로 거의 무한대의 사용자 인 증을 처리할 수 있다.

DCOM은 본질적으로 다른 여러 인증 프로토콜에 독립적으로 작동되므로 컴포넌트와 클라이언트는 어떠한 변경도 없이 다양한 인증 프로토콜과 더불어 보다 안전한 분산 환경을 구축할 수 있다.

DCOM 로드 밸런싱

로드 밸런싱은 사용자 수의 증가로 인해 시스템의 부하는 점점 가중되고, 이 부하를 여러 서버에 골고루 분산시키는 일련의 방법을 지칭하며, 크게 정적 로드 밸런싱과 동적 로드 밸런싱으로 구분할 수 있다.

정적 로드 밸런싱

특 정 사용자는 지정된 서버에만 접속해야 한다는 제한을 둔 방법으로 네트워크 상태 및 여러 다른 요소의 변경에 잘 적응하지 못한 다. DCOM 기반의 애플리케이션은 간단히 레지스트리 변경만으로 특정 서버의 컴포넌트에만 접속해 작동하도록 명시할 수 있다. 간단 한 구현 예로 연결할 서버 이름을 중앙 서버의 파일 또는 데이터베이스에 저장해 두고, 클라이언트 애플리케이션이 실행중인 서버와 연 결해야 할 정보를 읽어 특정 서버로 연결하게끔 만들 수 있다. 추후 이 정보를 변경함으로써 클라이언트가 접속해야할 서버를 정적으 로 변경해 로드를 분산시킬 수 있다.

이 방법보다 조금 더 진보된 방법으로 참조 컴포넌트 (Referral Component)를 사용할 수 있다. 참조 컴포넌트는 모든 클라이언트에서 연결할 수 있는 중앙 서버에 위치한 다. 개별 클라이언트 프로세스는 이 컴포넌트에 연결해 서비스를 받을 서버를 할당받는다. 이 때 참조 컴포넌트는 DCOM의 보안 메 커니즘을 사용해 클라이언트 계정 및 그룹 정보를 파악해 로드를 여러 서버로 분산시킬 수 있으며, 단순한 연결 서버 이름을 반환하 는 대신 해당 서버 컴포넌트의 인터페이스 포인터를 반환함으로써 실제 클라이언트와 서비스 서버를 직접 연결시켜줄 수도 있다

동적 로드 밸런싱

정적 로드 밸런싱은 사용자 증가에 따른 로드 증가를 효과적으로 처리할 수 있지만 시스템 관리자가 계속 전체 시스템 로드를 감시해야 하고, 시스템 로드 자체가 명확히 구분되는 경우에만 적용될 수 있는 단점이 있다.

위 에서 설명한 참조 컴포넌트의 로드 밸런싱 작업은 사용자 계정을 기반으로한 정적인 밸런싱 작업이었다. 여기에 서버의 현재 부하, 클 라이언트 서버간의 네트워크 구조, 여러 통계정보 등을 활용해 지능적으로 로드를 분산시킬 수 있다. 매번 클라이언트가 참조 컴포넌트 에 접속할 때마다 가장 적절한 서버를 찾아 연결 지어주게 된다. 이러한 작업을 동적 로드 밸런싱이라 부른다.

하지 만 이런 종류의 로드 밸런싱이 모든 상황에 잘 적용되는 것은 아니다. 참조 컴포넌트가 동적으로 클라이언트와 컴포넌트를 연결시킨 이 후 둘 사이는 정적 연결이 이루어진 것이 되며, 해당 컴포넌트의 각 메쏘드는 새로운 서버로 연결 없이 기존에 연결된 서버에서만 실 행된다는 제약이 있다. 컴포넌트가 상태를 유지해야 하는 경우라면 메쏘드 호출이 여러 서버에서 이루어지는 로드 밸런싱은 상태 정보 를 망가뜨리는 심각한 문제를 야기시킨다.

이러한 문제를 깔끔하게 해결한 것이 마이크로소프트 트랜잭션 서버다. MTS는 DCOM 프로그래밍 모델을 확장해 상태 정보를 유지하는 표준화된 인터페이스를 제공해 보다 정교한 수준의 로드 밸런싱을 제공한다.

MTS 모 델에서 클라이언트와 컴포넌트 사이의 상호 의사 소통은 트랜잭션이라는 이름으로 묶여서 이루어진다. 여기에서 트랜잭션은 둘 이상의 컴 포넌트 메쏘드의 호출이며 각각의 호출 사이에는 어떠한 상태 정보도 유지되지 않는다. 따라서 하나의 트랜잭션을 구성하는 여러 컴포넌 트 메쏘드 호출에 대해 동적 밸런싱이 가능하며 이전에 언급한 파이프라이닝도 가능하게 된다.

DCOM 폴트 톨러런스

오 류 상황으로부터 시스템의 안정적인 회복 및 폴트 톨러런스(Fau lt Tolerant)는 비즈니스 애플리케이션에서는 두말할 필 요 없이 가장 중요한 문제다. 이러한 안정성은 서버 하드웨어 이중화, 운영체제, 애플리케이션 자체의 견고한 설계에 바탕을 두어 야 보장되며, 어느 한 부분이라도 문제가 있으면 심각한 상황을 맞게 된다.

DCOM은 안정적인 서비스를 위해 프로토 콜 수준에서 기본적인 폴트 톨러런스를 지원한다. 견고하게 만들어진 ping 메커니즘을 통해 네트워크는 클라이언트의 오류를 감지한 다. 네트워크 오류 발생시 타임아웃 시간 내에 네트워크가 회복되면 DCOM은 연결을 자동으로 재설정한다.

보다 상 위 수준에서 폴트 톨러런스한 시스템을 구성하고자 한다면 참조 컴포넌트를 활용하는 방법을 사용할 수 있다. 클라이언트는 참조 컴포넌 트를 통해 서비스 컴포넌트와 연결하게 된다. 서비스 중 컴포넌트에 오류가 발생한 것을 클라이언트가 감지하면 클라이언트는 참조 컴포 넌트에게 새로운 연결을 요구하게 되며, 이때 참조 컴포넌트는 올바르게 작동중인 다른 서버에 있는 서비스 컴포넌트와 연결을 제공한 다. 이러한 메커니즘 구현을 위한 기본 프레임워크를 DCOM은 제공하며 그 실례가 MTS다. MTS는 여러 컴포넌트의 여러 메쏘 드 호출을 트랜잭션으로 묶어 처리하므로 애플리케이션 수준의 일치성(Consistency)을 제공한다.

마이크로소프트 트랜잭션 서버

MTS가 필요한 이유

MTS 의 기본 목적은 신뢰성 높고, 쉽게 확장 가능한 기업용 분산 애플리케이션 개발을 보다 용이하도록 만들어 주는 프로그래밍 환경을 제 공하는 데 있다. 다중 사용자 기업용 서버 컴포넌트를 작성할 때 발생하는 가장 큰 문제점으로는, 실제 업무 로직과는 무관한 트랜잭 션 관리, 리소스 관리, 쓰레드 관리와 같은 작업을 처리하는 부분까지 고려해 작업을 해야 한다는 것이다.

단적인 예 로 데이터베이스 연결 리소스를 살펴보자. 데이터베이스 연결이 거의 무한하다면 수많은 클라이언트 각자가 하나 또는 그 이상의 연결 을 유지하며 작업하는 모델이 가장 이상적이다. 하지만 데이터베이스 연결은 많은 시스템 자원을 소모하는 유한한 리소스이므로 다수 의 사용자가 연결할 경우 보다 정교한 방법이 요구된다. MTS는 이러한 시스템 리소스 관리 외에 트랜잭션 관리, 쓰레드 관리, 컴 포넌트 관리 기능을 효율적으로 제공한다.

MTS는 컴포넌트 기반의 트랜잭션 처리 시스템이므로 개발자는 서버 컴포넌 트 형태로 구현된 서버 애플리케이션을 생성해 MTS에 배치함으로써 MTS가 제공하는 다양한 서비스를 사용할 수 있다. 개발자는 동 시에 다수의 사용자 지원을 위한 별다른 고려 없이 처리하고자 하는 비즈니스 로직 구현에만 힘쓰면 된다. 비즈니스 컴포넌트를 MTS 에 설치하는 순간 해당 컴포넌트는 자동으로 동시 사용자 지원을 위해 확장되고, 자동적으로 최적화된 리소스 관리 시스템에 동참하 게 된다.

또한 MTS는 단순한 트랜잭션 모니터로서의 기능을 넘어 컴포넌트가 트랜잭션을 처리하게끔 확장 설계되었으므로, 기존의 COM 개발자가 트랜잭션을 처리하는 분산 애플리케이션을 보다 쉽게 만들 수 있는 환경을 제공한다.

프로세스, 쓰레드, 데이터베이스 연결과 같은 시스템 리소스를 관리해 트랜잭션 서버가 다중 사용자를 지원할 수 있도록 확장시킨다.
트랜잭션 서버 컴포넌트의 생성과 실행, 그리고 소멸을 관리한다.
자동적으로 트랜잭션을 시작하고 제어함으로써 신뢰성 있는 트랜잭션 서버 컴포넌트가 되게 한다.
사용 권한이 없는 사용자가 트랜잭션 서버 컴포넌트에 접근할 수 없도록 보안 관리를 제공한다.
MTS 컴포넌트와 시스템을 관리하기 위한 그래픽 인터페이스를 제공한다.
상 업적 측면에서 바라보면 기존의 액티브X 컨트롤로 대변되던 클라이언트 쪽 컴포넌트 시장을 서버 컴포넌트 시장으로 확장하는데 큰 의미 가 있다. 현재 우리는 멋진 사용자 인터페이스 구현 및 화려한 리포팅 출력을 위해 다양한 종류의 액티브X 컨트롤을 사용하고 있지 만 멀지 않은 미래에는 복잡한 비즈니스 로직을 구현한 서버 컴포넌트를 쉽게 접할 수 있으며 필요한 컴포넌트를 구입해 쉽게 기업 용 분산 애플리케이션을 만들 수 있을 것이다.

MTS의 기반기술, COM과 DCOM

COM

MTS 역 시 마이크로소프트의 많은 다른 소프트웨어와 마찬가지로 COM 기반 기술을 바탕으로 만들어졌다. COM은 COM 개체의 생성 및 사 용, 소멸을 지원하는 시스템 소프트웨어와 규약을 포함한다. 객체지향 언어에서 객체와 마찬가지로 COM 개체는 자신의 데이터를 숨기 고, 메쏘드로 객체의 기능을 구현하며, 인터페이스로 묶어 사용자에게 노출시킨다. 클라이언트는 사용하기를 원하는 인터페이스 포인터 를 구한 후 해당 인터페이스가 제공하는 메쏘드를 호출하게 된다.

앞에서 설명했듯이 COM은 어떠한 언어로도 구현할 수 있다. 언어 독립적으로 설계된 데이터 타입 및 바이너리 표준은 여러 언어로 공동의 프로젝트를 수행할 수 있게 한다.

DCOM

DCOM 은 COM 컴포넌트를 다른 컴퓨터에서 수행 가능하게 만드는 환경을 제공한다. 클라이언트의 메쏘드 호출은 네트워크를 통해 다른 시스 템에서 수행되는 컴포넌트로 전달된다. 이러한 메커니즘을 구현하기 위해 DCO M 은 DCE(Distributed Computing Environ ment)에서 사용되는 RPC를 사용한다.

분산 보안 서비스를 제공하기 위해 DCOM은 윈도우에서 지원되는 NTLM(NT Lan Manager) 프로토콜을 사용할 수 있으며, Kerberos와 SSL(Secure Socket Lay er) 프로토콜도 지원한다.

컨테이너

동 일 컴퓨터 내에서 아니면 원격 컴퓨터에서 실행되는 것과 상관없이 COM 컴포넌트는 독립적 실행 파일(EXE) 또는 동적 연결 라이 브러리(DLL)로 만들어진다. 이 중 DLL 형태의 컴포넌트를 인-프로세스 서버라고 부르며, 컨테이너 내에서만 실행된다(DLL이므 로 독립 실행은 불가능하다). COM의 실행 가능한 형태를 보면 <그림 8>과 같으며 지역 인-프로세스, 지역 독립 프 로세스, 원격 인-프로세스, 원격 독립 프로세스가 있다. 네 가지 중 어떠한 형태로 구현돼도 클라이언트가 바라보는 COM 컴포넌트 는 모두 동일하다.

DCOM 클라이언트 작성은 일반적인 COM 클라이언트 작성과 거의 유사하므로 간단하지 만, DCOM 서버 애플리케이션 작성은 쉽지만은 않다. 하나의 클라이언트가 사용하는 간단한 서버를 만드는 것은 쉽지만, 동시에 많 은 클라이언트에게 서비스를 제공해야하는 서버를 만들 경우는 효율성을 충분히 재고해 설계해야 한다. 당장 고려해야 할 사항이 서 버 컴포넌트가 멀티쓰레드 환경에서 수행돼야 한다는 것이며 이를 위해서는 많은 부가적인 프로그래밍을 해야하는 어려움이 생긴다. 또 한 서버 환경에서는 종종 트랜잭션 개념이 발생한다. 주문서를 발송하는 예를 들면 주문서 생성, 주문서에 주문할 물건을 추가, 삭 제, 주문서 발송과 같은 연속적인 작업은 트랜잭션으로 처리해 성공할 경우 일괄 커밋, 실패할 경우 롤백해야 한다. 이와 같은 경우 를 모두 고려해 DCOM 서버를 작성한다고 하면 아마도 웬만한 개발자가 아니면 두 손들고 말든지, 성능은 고려하지 않고 한번에 하 나의 요청만 처리하는 심플 서버로 만들 것이다.

그러나 더 이상 이러한 사항에 대해 고민할 필요가 없을 거 같다. MTS는 트랜잭션 처리, 효율적 쓰레드 관리 등을 제공해 확장 가능한 DCOM 서버 애플리케이션을 쉽게 만들 수 있는 환경을 제공한다.

MTS 애플리케이션의 구조

MTS 컴포넌트

MTS 애 플리케이션은 인-프로세스 COM 컴포넌트 형태(DLL)로 개발된다. COM 기반으로 만들어지기 때문에 비주얼 베이직, C++, 델 파이, 자바 등 어떠한 언어를 사용해 개발할 수 있다. MTS는 인-프로세스 컴포넌트로 제작된 모듈을 실행하는 컨테이너 구조를 가 진다. 연관성을 가지는 다수의 컴포넌트를 패키지로 묶어 MTS 내에서 독립적으로 실행할 수 있으며, 하나의 컴퓨터 내에서 동시 에 다수의 패키지를 실행할 수 있다. 패키지는 각자 MTS 실행 모듈(Executive)의 사본을 가지므로 독립적인 프로세스에 서 실행된다.

하나의 패키지에 묶인 모든 컴포넌트들은 하나의 MTS 실행 모듈에 로딩돼 사용하며, 이는 윈도 우 NT 서버의 동일 프로세스 내에서 작동한다는 것을 의미한다. 이러한 모델은 분산 애플리케이션의 확장성을 제한시키는 문제점을 갖 는다. 현재 버전의 MTS는 이러한 문제를 해결하지 못하지만, 하나의 애플리케이션을 구성하는 컴포넌트들을 다수의 패키지에 나누 어 여러 윈도우 NT 서버에서 가동시킬 수 있으므로 확장성의 문제를 어느 정도 보완할 수 있다.

<그 림 9>에서 보듯이 클라이언트가 MTS 컴포넌트를 액세스할 수 있는 유일한 방법은 COM/DCOM을 통하는 것이 다. MTS 컴포넌트가 클라이언트와 동일한 컴퓨터에 있을 경우 COM이 사용되며, 원격지에 있을 경우는 DCOM이 사용된다. 따라 서 클라이언트가 바라보는 MTS 컴포넌트는 단순한 몇몇의 인터페이스를 제공하는 COM 컴포넌트일 뿐이다. 그러나 <그 림 9>에 나타나 있듯 MTS 실행 모듈은 둘 사이의 모든 대화를 감시할 수 있다. 이러한 감시를 통해 MTS는 멀티스래 딩 핸들링, 트랜잭션 처리, 객체 생성 최적화 등과 같은 부가 서비스를 제공할 수 있다.

늦은 활성화

일 반적인 COM 객체 생성과 마찬가지로 MTS 컴포넌트 생성 역시 CoCreateInstance API를 사용해 이뤄진 다. COM 객체의 경우 API가 호출되면 인-프로세스 서버든, 리모트 서버든지 바로 COM 객체가 생성되지만 MTS의 경우는 바 로 객체가 생성되지 않는다. 실제 객체를 필요로 하는 시점, 즉 해당 컴포넌트에 대한 첫 메쏘드가 호출되는 시점이 되어야 객체 가 만들어진다.

MTS는 또한 인스턴스 풀링이라는 기법을 제공한다. 매번 CoCreateInstance를 호출할 때마다 객체를 생성하는 대신 이미 생성된 객체를 풀에 유지하면서 필요시 생성 작업 없이 바로 클라이언트에 공급한다.

이 두 방법은 객체의 전체 유지 시간을 줄여 한정된 서버 리소스의 효율을 높여준다. 클라이언트 수가 적을 경우 별다른 이득이 없지만 수많은 클라이언트가 서비스를 요구하는 상황에서는 많은 이점을 제공한다.

컨텍스트 객체

패 키지에 포함된 컴포넌트는 하나의 컨텍스트 객체를 각자 가진다. 컨텍스트 객체는 MTS에 의해 자동으로 생성되며 컴포넌트 사이의 트 랜잭션을 조정하는데 사용한다. 클라이언트는 GetObjectContext API를 호출해 컨텍스트 객체 인터페이스 인 IObjectContext를 얻을 수 있다.

데이터 액세스

대부분의 MTS 컴포넌트는 데이터 처리 를 담당하며, 데이터를 관리하는 스토리지로 오라클, SQL 서버와 같은 데이터베이스를 사용한다. MTS 컴포넌트에서 데이터베이스 를 액세스하는 방법으로는 데이터베이스 벤더별로 제공하는 저수준 API를 사용하거나, 데이터베이스에 독립적인 ODBC를 사용 할 수 있다. 그러나 마이크로소프트에서는 소프트웨어의 컴포넌트화에 발맞추어 데이터베이스에 독립적인 COM 기반의 OLE DB 와 ADO(ActiveX Data Objects)를 발표했다.

OLE DB는 모든 종류의 데이터를 액세스하는 일반적 인 방법을 제공하는 COM 객체와 인터페이스 집합을 정의한다. 예를 들면 OLE DB는 관계형 데이터베이스를 액세스하기 위 해 두 가지 객체를 사용한다. 클라이언트는 command 객체에 SQL 문장을 제공한 후 쿼리를 실행시키면 command 객체 는 그 결과를 rowset 객체에 반환한다. 클라이언트는 rowset이 제공하는 다양한 인터페이스를 사용해 실제 데이터를 액세스 할 수 있다.

ODBC와 달리 OLE DB는 접근할 데이터 소스를 관계형 데이터베이스에 국한시키지 않는 다. 즉 command 개체는 SQL 문장 외에 임의의 명령을 처리할 수 있으며, 다양한 포맷의 데이터에 대한 다양한 접근 방법 을 제공할 수 있다.

그러나 OLE DB의 복잡성으로 인해 클라이언트에서 사용하기가 만만치 않다. C++ 사용자 는 OLE DB를 사용해 비교적 쉽게 개발할 수 있지만, 비주얼 베이직과 같은 언어에서는 거의 사용이 불가능(?)하다. 그래서 마 이크로소프트는 OLE DB 상위 계층 개념의 사용하기 쉬운 ADO를 제작했다. ADO는 이중 인터페이스를 제공하므로 비주얼 베이직 에서도 쉽게 사용 가능하며 기존의 DAO(Data Access Objects), RDO(Remote Data Objects)를 모 두 포함하는 강력한 기능을 제공한다.

데이터베이스를 액세스하는 프로그램은 보통 데이터베이스와 연결을 성립시 킨 후 SQL문을 수행하고 모든 작업이 완료되면 연결을 종료한다. MTS 컴포넌트 역시 이러한 일련의 작업에서 예외는 아니다. 그 러나 데이터베이스와의 연결은 생각보다 많은 시간이 걸리는 작업으로 서버 애플리케이션에서는 이 시간을 줄이기 위해 연결 풀링 기법 을 사용한다. 연결 종료시 실제 연결을 끊지 않고 연결을 풀에 넣어 유지한다. 다음에 연결을 요구할 경우 풀에 있는 사용되지 않 는 연결을 제공한다. 일종의 캐시라고 생각하면 된다. MTS 역시 이러한 기능을 제공하고 있다.

트랜잭션 처리

데 이터베이스 작업을 하다 보면 종종 일련의 작업을 차례로 수행해야 하는 경우가 발생한다. 일련의 작업 중 하나라도 실패하면 작업 이 전의 원래 상태로 돌아갈 수 있어야 하고, 각각의 작업이 성공적으로 끝나야 전체 작업이 성공된 것으로 간주된다. 이러한 것이 트랜 잭션으로 데이터베이스에서는 여러 개의 SQL 문장이 하나의 단위로 처리되는 것을 의미한다.

만일 컴포넌트가 하나 의 데이터베이스 서버에서 트랜잭션을 실행해야 한다면 굳이 MTS를 사용하지 않아도 된다. 데이터베이스가 제공하는 트랜잭션 기능 을 사용하면 쉽게 처리할 수 있기 때문이다. 그러나 데이터베이스가 분산되어 있거나 데이터베이스 이외의 다른 시스템과 함께 트랜잭션 을 수행해야 한다면 MTS를 이용하는 것이 절대적으로 유리하다.

MTS라는 이름에서 볼 수 있듯이 MTS는 기본적으 로 트랜잭션을 지원하기 위해 개발됐지만, 단지 트랜잭션 처리만을 위해 사용되기에는 다소 아까운 면이 많다. 해당 컴포넌트가 트랜잭 션을 사용하지 않더라도 MTS를 이용해 애플리케이션을 개발한다면 보다 확장성이 높고, 안정적인 DCOM 서버 애플리케이션을 쉽 게 개발할 수 있을 것이다.

전통적인 클라이언트/서버 트랜잭션 시스템에서는 클라이언트가 트랜잭션의 시작과 끝을 구체 적으로 명시했었다. MTS 컴포넌트에서도 이와 유사하게 StartTran saction, EndTransaction과 같은 메쏘드 를 가지는 인터페이스를 제공해 클라이언트가 직접 트랜잭션을 명시하게끔 만들 수 있지만 좋은 방법은 아니다. 대신 MTS는 클라이언 트가 트랜잭션의 시작과 끝을 알 수 없도록 자동화한 트랜잭션을 지원한다. 클라이언트는 단지 MTS 컴포넌트가 제공하는 특정 메쏘드 를 호출해 원하는 기능을 수행할 뿐이지, 그 메쏘드가 트랜잭션을 시작하는지 종료하는지에 대해선 전혀 알 필요가 없다. 단지 트랜잭 션은 MTS 컴포넌트의 몫이다.

이렇게 자동화되고, 투명한 트랜잭션을 지원하기 위해 MTS는 컨텍스트를 사용한 다. 서로 다른 컴포넌트에 대해 하나의 트랜잭션을 처리할 경우 MTS는 동일한 컨텍스트를 두 컴포넌트에 제공해 각각의 컴포넌트 기 능을 트랜잭션으로 묶어서 실행시킨다.

트랜잭션 속성

데이터베이스에 레코드를 추가하는 Add 컴포넌트 와 레코드를 삭제하는 Delete 컴포넌트가 존재한다고 가정하자. 이들 두 컴포넌트를 사용해 데이터를 전송하는 Transfer 컴 포넌트를 개발할 수 있다. 그러나 문제는 이들 두 컴포넌트가 어떻게 트랜잭션에 참가할 수 있는가 하는 것이다. 만약 트랜잭션에 참 여할 수 없다면 Transfer 컴포넌트에서 Add, Delete 작업시 한 작업이라도 실패할 경우 데이터의 일관성은 망가지게 되 는 치명적인 결과가 발생할 수 있다.

MTS는 Transfer 컴포넌트 로직을 구현할 때 트랜잭션을 명시하는 방 법 대신 이들 컴포넌트가 애플리케이션 패키지로 묶여 MTS에 설치될 때 선언적으로 명시하는 방법을 사용한다. MTS에 설치되는 모 든 MTS 컴포넌트는 트랜잭션 속성을 갖고 있으며, 이 속성은 MTS 카탈로그에 기록된다. MTS 컴포넌트 객체가 생성 될 때 MTS는 이 트랜잭션 속성 값을 참조해 해당 MTS 컴포넌트가 트랜잭션에 어떻게 참여할 지를 결정한다. 트랜잭션 속성 은 MTS 탐색기에서 지정할 수 있으며 가능한 값은 다음 네 가지다.

Requires a transaction: 해당 MTS 컴포넌트가 반드시 트랜잭션에서 실행돼야 한다는 것을 나타낸다. 만약 클라이언트가 트랜잭션 컨텍스트를 갖고있지 않다면, MTS는 자동으로 새로운 컨텍스트를 생성한다.
Requires a new transaction: 해 당 MTS 컴포넌트는 반드시 자신의 고유한 트랜잭션 컨텍스트에서 실행돼야 한다는 것을 나타낸다. MTS 컴포넌트의 인스턴스가 생성 되면 클라이언트가 트랜잭션을 갖고 있는 지와 상관없이 MTS는 자동적으로 새로운 컨텍스트를 생성한다.
Supports transactions: 해 당 컴포넌트가 클라이언트의 컨텍스트에서 실행될 수 있다는 것을 나타낸다. 클라이언트가 트랜잭션 컨텍스트를 갖고 있으면 이를 그대 로 상속받아 사용한다. 트랜잭션 컨텍스트가 없을 경우 새로운 컨텍스트를 만들지 않고 트랜잭션 처리하지 않는 인스턴스를 생성한다.
Does not support transactions: 해당 MTS 컴포넌트가 트랜잭션 컨텍스트 하에서 실행되지 않는다는 것을 나타낸다. 즉 클라이언트의 트랜잭션 컨텍스트와 상관없이 트랜잭션이 없는 인스턴스를 만든다.
트랜잭션 종료

트 랜잭션 컨텍스트가 성립되면 각각의 컴포넌트는 클라이언트가 요구한 일을 수행하며, 모든 작업을 종료할 때 MTS 수행부에게 자신 의 작업이 성공적으로 이루어져 커밋이 가능한지 아니면 오류가 발생해 롤백을 해야 하는지를 알려야 한다.

실제 트랜잭 션을 종료하기 위해 컴포넌트는 컨텍스트 오브젝트가 제공하는 IObjectContext 인터페이스가 제공하는 메쏘드를 호출한다. 트 랜잭션이 커밋돼야 한다면 IObjectContext::SetComplete를 호출하고, 오류가 발생해 롤백해야 한다 면 IObjectContext::Set Abort를 호출한다. MTS 컴포넌트 개발자 입장에서 보면 성공이냐 실패냐의 양자 택일이 라는 매우 간단한 작업이다.

그러나 MTS의 입장에서 보면 SetComplete가 호출되었다고 해서 즉시 커밋을 해 야 한다고 판단할 수 없다. 하나의 트랜잭션에 참여하는 컴포넌트는 하나 이상일 수 있고, 이들 모두가 SetComplete를 호출 해야 비로소 커밋을 진행할 수가 있다. 만일 하나라도 SetAbort가 호출되면 전체를 롤백 해야 한다.

Two-Phase 커밋

SetComplete 또 는 SetAbort 호출을 통해 MTS 애플리케이션은 트랜잭션 종료를 지정하게 된다. 이때 이 트랜잭션이 하나의 데이터베이스에 서 처리된다면 데이터의 변경이 쉽게 커밋(Commit)될 수 있다. 그러나 트랜잭션이 하나의 데이터베이스가 아닌 복수개의 데이터베 이스 또는 그 밖의 다른 리소스 매니저라면 문제가 훨씬 복잡해진다. 여기서 리소스 매니저는 데이터베이스와 같이 트랜잭션 데이터 를 처리할 수 있는 시스템이라고 정의한다. Two-phase 커밋은 모든 리소스 매니저에서 완전히 성공적으로 커밋이 되어야 하나 의 트랜잭션이 성공적으로 완료된다는 것을 보장해 준다.

Two-phase 커밋에서, 트랜잭션 조정자는 우선 트랜잭션 에 참여하는 모든 리소스 매니저에게 커밋할 준비돼 있는지를 묻는다. 모든 리소스 매니저로부터 ‘예’라는 응답을 받으면 트랜잭션 조 정자는 각 리소스 매니저에서 커밋을 요청한다. 만약 하나의 리소스 매니저라도 커밋할 준비돼 있지 않다는 메시지를 보내거나, 커밋 에 실패했다고 알려오면 트랜잭션 조정자는 나머지 리소스 매니저에게 트랜잭션을 롤백하라고 명령한다.

분산 트랜잭션 조정자

MTS 에서 사용하는 Two-phase 커밋은 트랜잭션 조정자 (Distri buted Transaction Coordinator), 즉 DTC에 의해 지원된다. DTC는 MTS 제품의 구 성 요소가 아닌 SQL 서버 6.5의 구성 요소로 배포됐으며 독립적인 윈도우 NT 서비스로 작동한다. 클라이언트 가 SetComplete를 호출해 트랜잭션을 커밋하려 하면 MTS는 이러한 커밋 요청을 DTC에 전달한다. <그 림 10>에서 보는 것과 같이 MTS가 아닌 DTC가 실제로 각 리소스 매니저에 대해 two-phase 커밋을 실행한다.

DTC 와 리소스 매니저 사이의 통신을 위해 어떠한 표준화된 프로토콜이 필요하며 가장 널리 사용되 는 DTP(Distributed Transac tion Processing) 표준을 사용한다. DTP는 XA 인터페이스라 불리 는 트랜잭션 조정자와 리소스 매니저 사이의 표준 인터페이스를 정의한다. DTC는 XA를 지원하며, 추가로 OLE 트랜잭션이라는 객 체지향 개념이 추가된 방법을 지원한다. OLE 트랜잭션은 트랜잭션 조정자와 리소스 매니저 사이의 대화 방법으로 COM을 사용한 다. 따라서 개별 리소스 매니저가 DTC와 함께 트랜잭션을 수행하려면 OLE 트랜잭션을 지원하기 위한 COM 객체 및 인터페이스 를 제공해야 한다.

MTS와 인터넷

액티브X 컨트롤

인터넷을 통해 MTS 애플리케이션에 접근하는 방법은 크게 두 가지가 있다. 하나는 액티브X 컨트롤을 이용한 직접 사용이고 다른 하나는 ASP를 이용한 간접 사용이다.

사 용자는 웹 브라우저를 통해 액티브X 컨트롤을 다운 받을 수 있으며, 액티브X 컨트롤은 웹 브라우저라는 컨테이너 내에서 인-프로세 스 COM 형태로 작동한다. 액티브X 컨트롤은 DCOM 프로토콜을 사용해 MTS와 직접 연결해 MTS 애플리케이션을 사용한다.

액티브 서버 페이지

두 번 째 방법은 웹 브라우저에서 MTS로 직접 연결을 시도하는 대신 기존의 HTTP 프로토콜 기반에서 DCOM 연결 없이 수행된다. 대 신 웹브라우저 사용자가 볼 수 있는 결과물은 웹 페이지로 제한한다. <그림 11>은 이러한 연결 방법을 구체적으로 보여 준다. 웹 브라우저는 HTT P를 통해 IIS와 연결해 웹 페이지를 요구한다. IIS는 요구된 ASP 페이지를 실행한다. ASP 는 보통 VBScript로 쓰여진 스크립트 프로그램으로 이 스크립트에서 MTS 컴포넌트를 호출하게 된다. MTS 애플리케이션이 완 료되면 ASP는 그 결과를 웹 페이지로 꾸며 웹 브라우저에 전달한다.

마이크로소프트 메시지 큐 서버

분 산 애플리케이션 개발시 각 부분간의 통신을 위해 어떠한 방법을 사용할지 종종 고민한다. 웹 브라우저를 사용해 클라이언트 서버 간 HTTP로 통신하는 방법, 오래된 방법이지만 RPC를 통한 방법, 객체 지향적인 방법인 DCOM 등을 통한 방법이 있을 수 있 다. 이에 추가로 마이크로소프트 메시지 큐 서버(MSMQ)를 이용해 분산 애플리케이션 환경에서 메시지를 주고받을 수 있다.

MSMQ가 필요한 경우

언 제 웹이나 RPC 대신 메시지 큐를 사용하는게 용이할까? 메시지 전송자가 처리 전에 수령자로부터 결과를 기다려야 한다면 RPC 를 사용하는 것이 좋다. 즉 동기화된 메시지 전송에는 RPC가 여러 가지 측면에서 유리하지만, 메시지 수령 전에 기타의 여러 작업 을 할 수 있는 비동기식 메시지 전송에는 메시지 큐를 사용하는 것이 좋다.

메시지를 주는 측과 받는 측이 함께 동작 할 필요가 없는 경우라면 메시지 큐를 사용하는 것이 낫다. RPC는 클라이언트, 서버 모두가 함께 작동 되야 하지만, 메시지 큐 는 전송자가 메시지 큐에 메시지를 넣으면 수령자는 언제든지 메시지 큐로부터 메시지를 읽을 수 있다. 또한 큐에 있는 메시지는 하나 의 수령자가 아닌 다수의 수령자가 참조할 수도 있다. RPC는 클라이언트와 서버가 연결된 상태에서 작동하기 때문에 수령자 그룹 에 메시지를 보내기가 쉽지 않다.

예를 들어 A가 메시지를 B에 전송하고, B는 이 메시지를 C와 D에 전송한 후 두 결과를 A에 전송하도록 만들려면 RPC보다 메시지 큐가 훨씬 좋은 해결책을 제시해 준다.

MSMQ 개관

메시지 큐의 가장 큰 장점은 개념적으로 매우 간단하다는 것이다. <그림 12>를 보면 메시지 큐는 크게 세 가지 부분으로 나뉜다.

애플리케이션이 메시지를 주고받기 위해 사용하는 API
애플리케이션에 의해 만들어지고 송신, 수신되는 메시지
큐 관리자에 의해 관리되는 큐로 큐를 통해 메시지가 전송/수신된다.
세 가 지 기본 구성 요소를 바탕으로 MSMQ는 세 가지 형태의 애플리케이션을 정의한다. 첫째는 MSMQ 서버 자체로 큐와 큐 관리자 를 가지고 MSMQ API를 제공하며 큐간에 메시지를 라우팅한다. 나머지 둘은 클라이언트 형태로 독립형 클라이언트와 종속형 클라이 언트가 존재한다.

독립형 클라이언트는 MSMQ API와 자신만의 큐를 가진 큐 관리자를 갖고 있으므로 항상 자유롭 게 메시지를 전송할 수 있다. 컴퓨터가 네트워크에 연결 안돼도 메시지는 전송될 수 있다(사실은 메시지 큐에 차례로 저장된 다). 이 후에 컴퓨터가 네트워크에 접속하게 되면 큐 관리자는 자동적으로 연결을 감지해 메시지를 MSMQ 서버에 전달한다.

종 속형 클라이언트 역시 메시지를 송수신하는 애플리케이션을 지원하지만 독립형에 비해 다소 제약이 있다. 종속형은 자신만의 큐와 큐 관 리자 없이 단지 MSMQ API만 지원하기 때문에 클라이언트로 실행되는 애플리케이션은 반드시 MSMQ 서버와 연결되어 있어야 한 다.

MSMQ API

MSMQ는 서로 다른 두 가지 API를 제공한다. 하나는 C++ 개발자를 위 한 것으로 다양한 함수 호출을 정의하고 있으며, 다른 하나는 COM 객체 형태로 제공해 다양한 환경을 지원한다. COM 객체보다 는 C API가 보다 많은 서비스를 제공한다.

MSMQ 특성

메시지 특성

메시지의 가 장 중요한 특성은 모체(Body)로 메시지에 전송될 데이터를 담고 있으며 데이터는 유형이 없는 바이트 배열 또는 전송되는 데이 터 유형에 대한 식별자를 담을 수 있다. 또한 한 번에 담을 수 있는 최대 크기는 4MB이다.

메시지 전달

또 다 른 특성으로 전달에 대한 특성이 있다. 이 특성 값은 속달(Express)과 복구(Recoverable) 중에 하나로 지정 될 수 있다. 메시지가 속달로 지정되어 있으면 메시지를 처리하는 모든 큐는 이 메시지를 디스크에 저장하지 않고 메모리에만 저장한 다. 메모리에 저장하므로 빠른 메시지 전송이 가능하지만, 메시지가 큐에 저장되어 있는 상태에서 MSMQ 서버가 크래시된다면 이 메 시지는 사라져 버리는 심각한 상황이 발생한다. 반면 복구로 표시되어 있는 메시지는 큐에 의해 항상 디스크에 기록된다. 디스크에 기 록되어 있으므로 오류 상황에서 쉽게 복구될 수 있다. 개발자는 메시지의 특성을 잘 고려해 둘 중에 적절한 방식을 선택해야 한다.

수 령 시간(Time to be received) 특성은 메시지가 전송된 후 큐에서 유지되어야 하는 시간을 규정한다. 만약 애플리케이 션이 이 시간 내에 메시지를 받을 수 없다면 MSMQ는 이 메시지를 삭제한다. 큐 도달 시간 (Time to reach queue) 특성은 메시지가 목적지 큐까지 도착하는데 소요되는 전체 시간을 규정한다. 만약 제 시간 내 에 도착하지 못하거나 목적지에 이르는 경로에 오류가 발생했다면 MSMQ는 해당 메시지를 버린다.

메시지 동의(Acknowledge)

메시지를 보낸 후 해당 메시지가 어떻게 되었는지에 대한 대답은 메시지 동의 특성을 살펴봄으로써 알 수 있다.

Full Reach Queue : 메시지가 목적지 큐에 도착했거나 도착하지 못할 것 같은 경우(메시지 큐 도달 시간이 초과한 경우), MSMQ가 자동으로 동의 메시지를 전송하도록 설정한다.
Full Receive : 메시지가 도착했거나 도착할 것 같지 않은 경우(메시지 수령 시간이 초과한 경우)를 알리기 위해 동의 메시지를 보내도록 설정한다.
Nack Reach Queue : 메 시지가 목적지 큐에 도착할 수 없음을 알리기 위해 동의 메시지를 보내도록 MSMQ를 설정한다. 오직 부결 (negative ack nowledge) 메시지만 전송되기 때문에 전송자의 입장에서 보면 이 메시지를 받지 않는 것이 잘 전송됐 음을 나타낸다.
Nack Receive : 메시지 수령 시간 타이머가 경과되었을 때 부결 메시지를 보내도록 설정한다.
None : MSMQ는 전송자가 동의 특성에 아무 값도 설정하지 않으면 동의 메시지를 보내지 않는다.
메시지 기록

메 시지 큐의 가장 뛰어난 장점 중의 하나로 이미 전송된 메시지를 쉽게 기록할 수 있다. 애플리케이션은 각 메시지의 저널 특성을 설정 해 이 메시지가 전송될 때 전송하는 시스템에 기록을 남기도록 할 수 있다. 만약 특성 값이 저널로 설정되면 메시지 복사 본은 저 널 큐라는 특수한 큐에 저장된다. 이 큐는 어떤 메시지가 전송되었는지를 알고 싶어하는 모든 애플리케이션에 의해 참조될 수 있는 큐 다.

여러 가지 이유로 인해 메시지가 전달될 수 없는 경우 저널 특성이 부여된 메시지는 삭제 편지 (Dead Letter)로 설정되어 MSMQ의 삭제 편지 큐(Dead Letter Queue)에 저장된다. 만약 저널 특성에 어떠 한 값도 지정되지 않으면 전송 후 저널 큐에 저장되지 않으며 수령되지 않을 경우 삭제 편지 큐에도 저장되지 않는다.

메시지 우선 순위

애 플리케이션에서 몇몇 메시지는 다른 메시지보다 우선권을 가져야 하는 경우가 종종 발생한다. 예를 들어, 증권 중개용 애플리케이션에 서 거래를 성립시키는 메시지는 주가를 보여주는 메시지 보다 우선권을 가져야 한다. MSMQ는 이러한 애플리케이션을 지원하기 위 해 메시지마다 우선 순위 특성(Priority Property)을 부여할 수 있다. 높은 우선 순위를 갖는 메시지는 큐에 도착되 는 순서와 상관없이 큐의 가장 앞쪽에 놓여진다.

메시지 응답

MSMQ 메시지의 특성 중 응답 큐 특성 (Response Queue Property)은 메시지 수령자로 하여금 이 메시지에 대한 응답을 어디로 해야하는 지를 통지한 다. 미리 정의된 큐만을 사용해 통신하는 경우에는 이 특성을 사용할 필요가 없지만 다양한 분산 애플리케이션 환경에서 꼭 필요한 기 능이다. 이 특성을 설정한다고 해서 수령자가 반드시 응답을 해야하는 것은 아니다. 응답 여부는 전체 애플리케이션의 로직에 따른 것 이지 이 특성과는 관련이 없다.

그리고 메시지 응답시 어떤 메시지에 대한 응답인지를 구분하기 위해 MSMQ는 메시지 마다 고유의 ID를 부여한다. 메시지 수신자는 이 ID를 읽어 응답시 상관관계 ID 특성 (Correlation ID Property)에 복사해 응답하고 송신자는 보낼 때의 고유 ID를 기록하고 있다가 응답으로 전송 된 상관관계 ID 특성과 비교해 전송된 메시지에 대한 응답을 구분할 수 있다.

큐 특성

큐에 관한 가 장 중요한 특성으로 큐 생성시 반드시 필요한 것으로 경로 명이 있다. 경로 명은 ‘machineX/myq ueue’와 같은 단순 한 문자열로 큐가 존재하는 컴퓨터와 큐 이름을 나타내는 식별자 역할을 한다. 일단 이 특성이 큐에 설정되면 절대 변경할 수 없 다.

쿼터 특성은 큐가 담을 수 있는 최대 크기를 바이트 단위로 설정한다. 만약 큐에 있는 모든 메시지 크기의 합 이 이 한계치를 넘으면 더 이상 큐에 대한 메시지 전송은 이루어질 수 없다. 거부된 메시지는 동의 특성 값에 따라 동의 메시지 가 만들어져 전송자에게 보내질 수 있다.

저널(Journal) 특성은 메시지가 큐로부터 저널 큐로 복사될 건지를 결 정한다. 앞서 설명한 저널링은 메시지 기반으로 애플리케이션에서 전송된 메시지를 전송하면서 기록을 남기는 반면, 큐 기반의 저널링 은 큐로부터 삭제되는 모든 메시지에 대한 기록을 남기며 큐 전체에 대해 이 옵션을 지정 또는 삭제할 수 있다.

베이 스 우선 순위(Base Priority)는 큐 간 메시지를 라우팅할 때 어떤 메시지를 먼저 보낼 지에 대한 기준으로0사용된다. 높 은 우선 순위를 가진 큐에 전송된 메시지는 낮은 우선 ?위를 갖는 큐에 전송된 메시지에 비해 좀더 신속하게 라우팅 될 것이다.

MSMQ와 트랜잭션

하 나의 데이터베이스에 대해 트랜잭션을 수행하는 것은 데이터베이스 자체가 트랜잭션의 성공과 실패를 보장해 준다. 그러나 이러한 트랜잭 션이 두 개 이상의 데이터베이스에서 이루어진다면 모든 데이터베이스에서 올바르게 트랜잭션이 처리되는 것을 보장하기 위해 트랜잭션 조 정자를 사용한다. 윈도우 NT에서는 분산 트랜잭션 조정자(DTC) 서비스를 이용해 이러한 트랜잭션을 처리할 수 있다.

그 러나 DTC를 사용해 직접 트랜잭션 기반 애플리케이션을 만드는 것은 쉬운 일이 아니다. COM 기반의 MTS를 이용하면 좀더 편리 하게 이러한 애플리케이션을 만들 수 있다. MTS 역시 내부적으로는 DTC를 사용하지만 좀더 사용하기 쉬운 프로그래밍 인터페이스 를 제공한다.

MTS에서 상세히 설명했다시피 DTC는 데이터베이스뿐만 아니라 OLE 트랜잭션을 지원하는 어떠한 자 원 관리자와도 트랜잭션을 수행할 수 있다. 만일 MSMQ 역시 OLE 트랜잭션을 지원하는 자원 관리자가 된다면 분산 트랜잭션 의 한 구성원이 될 수 있다. 인터넷을 통해 고객의 주문을 처리하는 웹 애플리케이션에서 주문이 발생하면 주문되는 상품에 대한 데이 터베이스 변경이 이루어지며 그와 더불어 그 주문은 MSMQ 메시지를 통해 다른 컴퓨터(창고에 있는)로 전송되어 저장된다<그 림 14>. 이 두 작업은 하나의 트랜잭션으로 묶여질 수 있으며, MTS를 이용하면 쉽게 구현할 수 있다.

큐 가 트랜잭션에 참가하기 위해서는 큐 생성시 트랜잭션 특성을 설정해야 한다. 트랜잭션 특성이 설정되면 큐는 자원 관리자로써 DTC 의 관리하에 다양한 트랜잭션에 참여하게 된다. 큐가 트랜잭션으로 지정되면 큐에 전송되는 모든 메시지는 메시지가 속한 트랜잭션이 완 료될 때까지 계속 유지된다. 만약 트랜잭션이 커밋되면 메시지가 실제로 전송되고, 롤백되면 메시지가 전송되지 않고 큐에서 삭제된 다. 이런 방법으로 트랜잭션이 처리되면 MSMQ는 메시지가 반드시 ‘단 한번’만 전송되도록 하며 여러 메시지가 정확한 순서대로 전 달되도록 한다. 또한 트랜잭션 큐로 전달되는 모든 메시지는 전달(Delivery) 특성이 자동적으로 복구(Recoverable) 로 설정되어 중간에 서버가 에러가 발생해도 메시지가 분실되지 않도록 한다.

COM+

기본 개념

COM+ 라는 용어를 처음 접하는 개발자라면 또 ‘뭔가 새로운 것이 나왔구나 ‘라고 지레 겁을 먹을지도 모르겠지만 그렇게 큰 걱정을 할 필 요는 없다. 플러스 기호가 붙은 걸로 봐서 예전의 C 언어와 C++ 언어와의 관계 정도가 아닐까 하는 생각이 언뜻 들지 모르겠지 만, 전혀 둘 사이는 무관하다. C++ 언어는 C와 완전히 다르다고 볼 수 있다. 이유는 C 언어는 절차언어인 반면 C++는 객체 지향언어, 개발 방법이 완전히 다르기 때문에 모양새는 유사하지만 완전히 다른 언어로 취급한다. 하지만 COM+는 COM과 전혀 무 관한 새로운 것이 아니다. 단지 좀더 발전된, 혁명이 아닌 진보 정도로 여기면 된다(아마 이러한 연유로 마이크로소프트는 플러스 기 호를 하나만 사용했을지도).

COM은 프로그래밍 모델인 반면 COM+는 프로그래밍 모델을 보다 향상시키는 서비스 의 집합이며, 분산 애플리케이션 개발에 필요한 여러 서비스를 제공한다. COM+를 이해하기 위한 전제로 우선 윈도 우 DNA(Distributed interNet Application Architecture)에 대한 이해가 선행되어야 한 다. DNA는 일종의 개발 프레임웍으로 마이크로소프트 윈도우가 제공하는 다양한 기술 및 서비스를 이용해 분산 애플리케이션을 개발하 는 일련의 방법론을 의미하며, 다음과 같은 3티어 애플리케이션 개발에 초점을 맞추고 있다.

사용자 인터페이스 계층 - Forms+
미들 계층 - COM+
데이터베이스 계층 - Storage+
사용자 인터페이스 계층

마 이크로소프트는 클라이언트용 사용자 인터페이스 구현을 위한 방법으로 Forms+를 개발하고 있으며, 이는 클라이언트 타입이 무엇이든 (rich or thin) 상관없이 개발할 수 있는 일관된 솔루션을 제공한다. 아마 차기 개발툴쯤에 이와 관련된 기술이 선보이리라 고 생각된다.

미들 계층

COM+의 모든 것이 존재하는 계층으로 현재까지 수년간 마이크로소프트가 투자 한 분야다. 윈도우 NT 4.0 이전까지 개발툴은 RAD에 그 초점이 맞추어져 있었지만, 소프트웨어 기술이 발전하면서 미들 계층 에 대한 끊임없는 요구가 발생했고, 이에 대한 최초의 응답이 MTS였다. MTS의 기본 목적은 트랜잭션 처리였으며, 트랜잭션 처리 를 위한 많은 어려운 점을 해결해 개발자로 하여금 보다 비즈니스 로직 구현에 집중할 수 있는 환경을 제공하였다. 이후 마이크로소프 트는 메시지 기반의 애플리케이션 개발 및 비연결 사용자를 위한 MSMQ를 발표하였다. 이러한 미들 계층 솔루션이 성숙되면서 윈도우 와 이들을 통합시키게 되었고 이를 COM+로 명명하였다.

데이터베이스 계층

아직 Storage+에 대 한 별다른 언급은 없지만 향후 윈도우 DNA를 구성하는 핵심적인 계층이 될 것이다. 현재 데이터베이스 계층 은 ADO(ActiveX Data Object)와 OLE DB로 대표되며 아마 Storage+도 이를 기반으로 확장되지 않을까 예 상된다.

컴포넌트 서비스

일반적으로 개발자가 컴포넌트를 개발하는데 있어 거의 30% 가량의 시간을 컴 포넌트가 수행할 기본적인 업무인 비즈니스 로직 처리가 아닌 다른 부분에 쏟아 붓고 있다. 이러한 불필요한 프로그래밍 작업을 줄이고 자 마이크로소프트는 COM+ 컴포넌트 서비스를 지원 컴포넌트 개발자에게 필요한 다양한 서비스를 제공해 개발자가 비즈니스 로직 구현 에 보다 집중할 수 있게끔 만든다. <그림 15>에서 보듯이 COM에서 출발한 COM+는 분산 애플리케이션 환경에서 필 요한 다양한 서비스를 제공하고 있다.

JIT(Just-In-Time) 실행

COM+의 가장 중요한 특 징 중 하나는 미들-티어 컴포넌트로 그 성능을 확장해 수많은 동시 접속 사용자를 지원하는 환경을 제공하는데 있다. COM+ 환경에 서는 클라이언트가 COM+ 객체를 생성하면 객체의 인터페이스를 직접 참조하는 것이 아니라 COM+가 구현한 컨텍스트 객체를 참조하 는 모양이 된다. 따라서 실제 객체는 클라이언트가 생성했다고 해서 바로 메모리에 생성되지 않고 메쏘드가 호출될 때 비로소 생성한 다. 클라이언트는 객체에 대한 참조를 계속 유지하지만 실제 COM+ 환경에서는 필요한 때에만 컴포넌트가 만들어지므로 효율적인 서 버 리소스 관리가 가능해진다. 이러한 것을 JIT 실행이라고 하며 기존의 MTS 환경에서 소개되었다. 보다 자세한 내용 은 ‘MTS 프로그래밍의 다섯 가지 규칙’을 참조 바란다.

객체 풀링(Object Pooling)

분 산 애플리케이션의 전체적인 성능을 향상시키기 위해 COM+는 객체 풀링을 제공한다. 클라이언트 애플리케이션이 객체 풀링을 제공하 는 객체를 릴리즈시킬 경우 COM+는 해당 객체를 제거하는 것이 아니라 동일 클라이언트 또는 다른 클라이언트를 위해 재사용한 다. 클라이언트가 동일한 종류의 객체를 요구할 경우 COM+는 객체 풀에 요구되는 객체가 존재하면 새로 객체를 생성하지 않고 풀 에 있는 객체를 반환한다. 만일 풀에 객체가 존재하지 않는다면 COM+는 새로 객체를 생성해서 제공할 것이다. 당연히 객체 풀링 을 지원하는 컴포넌트는 새로 생성된 객체에 자신의 이전 상태를 복원시키는 기능을 제공해야 한다.

개발자는 자신이 개 발하는 컴포넌트가 객체 풀링을 지원할지 말지를 결정해야 한다. 지원 여부의 기준은 객체 생성시 드는 비용과 풀에 객체를 유지하는 데 들어가는 비용을 잘 저울질해야 한다. 객체를 생성해서 초기화하는데 많은 컴퓨팅 타임이 소모되는 대신 객체가 deactivate 되었을 대 유지해야 하는 정보량이 적다면 당연히 객체 풀링을 지원하는 것이 좋다. 반면 객체 초기화 작업은 간단하지만 객체의 상태 를 유지하는 정보가 많을 경우는 오히려 풀링을 지원하는 것이 좋지 않다.

MTS에서 객체 풀링이라는 말이 이미 언급되었지만 실제 구현되어 지원되지는 않았었다. 그러나 마이크로소프트는 이전의 약속을 지켜 COM+ 환경은 이를 지원한다.

로드 밸런싱

분 산 COM+ 애플리케이션은 보통 수천이 넘는 사용자에게 빠르고 안정적인 서비스를 제공하는 것을 주목적으로 한다. 앞서 언급 한 JIT 실행 및 객체 풀링은 하나의 서버 내의 제한된 자원을 보다 효율적으로 사용하는데 초점이 맞추어져 있으므로 COM+를 진 정한 분산 환경으로 확장시키는 방법으로는 다소 무리가 있다. COM+는 컴포넌트를 네트워크의 여러 서버에 분산시켜 수행 가능하므 로 업무 로드를 효과적으로 분산시켜 다수의 사용자에게 좋은 서비스를 제공할 수 있다. 이렇게 업무를 여러 컴퓨터에 분산시키는 것 을 로드 밸런싱이라 부르며, COM+ 환경에서는 컴포넌트 수준에서 이를 지원한다. 클라이언트는 자신이 필요한 컴포넌트에 직접 연결 을 요청하는 대신 로드 밸런싱 라우터에 연결한다. 로드 밸런싱 라우터는 분산 애플리케이션에 참여하고 있는 서버 정보를 기반으로 여 러 서버에 업무를 분산시킨다. 여러 서버 중 선택된 서버에서는 클라이언트가 필요로 하는 객체를 생성하고 객체에 대한 참조를 클라이 언트에 돌려준다. 추후 해당 컴포넌트에 대한 클라이언트 요청은 로드 밸런싱 라우터를 거치지 않고 지정된 서버로 바로 전달돼 처리된 다.

많은 로드 밸런싱 알고리즘이 존재하지만 현재의 COM+ 환경은 simple response- time analysis 알고리즘을 사용한다(추후 COM+는 다양한 로드 밸런싱 알고리즘을 지원할 것이다). 또한 로드 밸런싱 은 시스템 오류 상황에 대한 처리에도 유용하다. 한 클라이언트와 연결된 서버가 여러 가지 이유로 인해 다운됐을 때, COM+는 자 동으로 서버 오류를 감지해 클라이언트의 요청을 다른 서버로 라우팅한다. 이러한 복구 방식은 전체적인 시스템 안정성을 높이는데 기여 한다.

인-메모리 데이터베이스(IMDB)

인-메모리 데이터베이스는 부산 애플리케이션의 성능을 향상시키 는 중요한 COM+ 서비스 중의 하나로 메모리 상에 데이터베이스 형태의 캐시를 구현해 빠른 데이터 액세스를 가능하게 한 다. IMDB는 OLE DB 프로바이더 형태로 구현되며 동일 컴퓨터 내에 존재하는 데이터에 대해 빠른 액세스를 가능하게 만든 다. 클라이언트는 이전과 마찬가지로 테이블, 인덱스 등을 사용하는데 ADO와 같은 고수준 컴포넌트를 그대로 사용하며, COM+ 가 이들 데이터에 대한 캐시를 제공하는 구조를 가진다.

Queued Components(QC)

QC 는 마이크로소프트 메시지 큐 서버(MSMQ) 기반의 COM+ 서비스로, 컴포넌트 서버가 오프라인 상태 또는 오류 상태 등으로 작동 하지 않을 경우에도 COM+ 컴포넌트에 대한 메쏘드 호출을 쉽게 가능하게 해준다. MSMQ 시스템은 컴포넌트 메쏘드 호출을 기록하 고 큐잉하며 컴포넌트가 작동 가능한 상태가 되면 큐에 저장된 메쏘드 호출을 자동으로 진행시킨다. <그림 16> 은 MSMQ가 클라이언트와 컴포넌트 사이에 데이터가 전달(메쏘드 호출)되는 방식을 보여준다.

http://blog.naver.com/saga111/120008481340

'UP! > Web Service' 카테고리의 다른 글

UDP(User Datagram Protocol)  (0) 2008.08.21
SCTP  (0) 2008.08.21
분산객체 시스템(COM,COm+,DCOM,MTS)  (0) 2008.08.21
분산객체기술종류  (0) 2008.08.21
웹 서비스 개념 및 교육 내용  (0) 2008.08.21
Posted by 으랏차
,
트랜잭션

기존의 MTS 환경에서와 마찬가지 로 COM+ 환경에서도 컴포넌트 수준에서 분산 트랜잭션에 쉽게 참여할 수 있다. MTS에서 분산 트랜잭션 처리를 마이크로소프트 분 산 트랜잭션 조정자(DTC)를 통해 처리했듯이 COM+ 환경 역시 동일한 방법으로 분산 트랜잭션을 처리한다. 마이크로소프트는 트랜 잭션을 처리하기 위해 객체 지향 개념의 two-phase 커밋을 지원하는 OLE 트랜잭션을 설계하였으며 MS DTC로 하여금 수행 하게 만들었다. 최초의 MS DTC는 마이크로소프트 SQL 서버의 한 제품으로 공급됐으나 현재는 다양한 트랜잭션 처리를 위한 기 본 시스템으로 윈도우 2000에 통합시켜 공급하고 있다.

보통 트랜잭션은 중요한 작업(트랜잭션을 사용해 안정적으 로 처리될 필요가 있는)시 시작되며, 애플리케이션은 트랜잭션을 MS DTC와 같은 트랜잭션 관리자에게 전달함으로써 실제 트랜잭션 을 시작한다. MS DTC는 트랜잭션에 참여하고 있는 다양한 리소스 관리자에게 각각의 트랜잭션을 수행하게 하며 성공여부에 따라 전 체적인 커밋을 할지 롤백을 할지를 결정한다. 여기서 언급하는 리소스 관리자는 SQL 서버와 같이 OLE 트랜잭션 스펙을 지원하 는 서비스 전체를 의미한다. 전형적으로 트랜잭션은 데이터베이스 액세스에 주로 사용되었지만 절대 트랜잭션 처리가 데이터베이스에 제한 되어 있지는 않다. OLE 트랜잭션을 지원하는 어떠한 서비스도 MS DTC 트랜잭션에 참여할 수 있다. 단적인 예로 MSMQ 역 시 OLE 트랜잭션을 지원하므로 분산 트랜잭션에 참여 가능하다.

COM+는 기본적으로 두 개의 리소스 분배기 (Dispenser)인 OD BC 드라이버 매니저와 공유 프로퍼티 매니저를 제공한다. ODBC 드라이버 매니저는 COM+ 컴포넌트 를 위해 데이터베이스 연결에 대한 풀링을 제공한다. 데이터베이스 연결 풀링에 관한 자세한 내용은 ‘MTS 프로그래밍의 다섯 가 지 규칙, 서버의 자원관리’ 부분을 참조하기 바란다. COM+ SDK를 사용하면 기본적인 리소스 분배기 외에 추가로 필요한 분배기 를 제작할 수 있다.

클라이언트 애플리케이션 입장에서 바라보면 리소스 관리자는 전체 트랜잭션에 참여하는 하나의 구성 요소 이지만, 리소스 관리자 역시 그 자체가 트랜잭션 관리자로서의 역할을 수행해야 한다. 클라이언트 애플리케이션에서 트랜잭션에 대 한 커밋 또는 롤백을 지시해야 트랜잭션은 종료된다. 만약 롤백이 요구됐다면 MS DTC는 트랜잭션에 참여하고 있는 모든 리소스 관 리자에게 트랜잭션에 참여하면서 진행했던 모든 작업을 롤백하라고 명령할 것이다. 각각의 리소스 관리자는 정확한 롤백 작업을 수행 할 책임이 있다. 만약 클라이언트가 커밋 또는 롤백하기 전에 오류로 죽는다면 MS DTC는 자동으로 전체 트랜잭션을 롤백한다.

클 라이언트가 트랜잭션이 커밋되도록 요청한다면 MS DTC는 트랜잭션 작업 중에 발생한 모든 변화를 커밋하기 위해 two- phase 커밋 프로토콜을 실행한다. 첫 단계로 MS DTC는 트랜잭션에 참여하고 있는 모든 리소스 관리자에게 커밋 작업에 동의하 는 지를 결정하기 위해 질문을 던진다. 질문에 답하지 않거나 커밋에 동참할 수 없다라고 응답하는 리소스 관리자가 하나라도 있으 면, MS DTC는 모든 리소스 관리자에게 트랜잭션을 취소하라고 명령하며 각 리소스 매니저는 롤백 작업을 진행할 것이다.

롤기반 보안

COM+ 보 안 모델은 윈도우 2000 보안 모델을 기본으로 하지만, 보다 쉬운 사용을 위해 두 가지 형태, 선언적(declarative) 보 안과 프로그래밍 가능한 보안을 지원한다. COM+ 보안 메커니즘의 핵심은 롤(role)의 개념을 정확히 이해하는데 있다. 롤은 대 다수 CO M+ 객체에 의해 사용되어지며 매우 유연하고, 선언적인 보안 모델의 중심에 서 있으며, 논리적 사용자 그룹(윈도 우 2000의 사용자 그룹과 유사한 개념)을 구분하는 이름이다. COM+ 객체가 시스템에 설치되어 사용될 때, 관리자는 롤을 생성 한 후 특별한 사용자 또는 사용자 그룹을 해당 롤에 포함시킨다. 그 다음 관리자는 설치된 컴포넌트에 대해 어떠한 롤을 사용할 지 를 결정한다. 기본적으로 컴포넌트 수준에서 롤을 결정할 수 있으며, 또한 컴포넌트가 제공하는 인터페이스 별로 롤을 지정할 수도 있 다. 이러한 선언적 방법은 컴포넌트 소스 코드를 전혀 수정하지 않고 컴포넌트를 설치하고 운영하는 관리자 수준에서 아주 쉽게 다양 한 보안을 제공할 수 있다.

때때로 선언적 보안만으로 처리하기 힘든 경우가 발생한다. 예를 들어 나이가 20살 이상 인 회원에 대해서만 해당 메쏘드를 실행시키길 원한다면 위의 선언적 보안으로 처리하기는 불가능하다. 이때는 COM+ 객체를 개발하 는 단계(소스 코드 작성 단계)에서 프로그램 로직으로 구현해야 한다. COM+ 보안 모델은 프로그램 상에서도 쉽게 롤을 사용 할 수 있는 여러 API를 제공한다.

결론
‘휴’ 라는 한숨이 절로 나온다. 나날이 변화하는 환경 에 과연 적응할 수 있을까? 오래전 골방에서 C언어를 사용해 DOS 환경에서 수행되는 애플리케이션을 만들던 시절, 아니 좀더 시간 이 지나 피땀 흘려 C++를 익힌후 볼랜드의 OWL(Object Windows Library)을 사용해 윈도우 3.1용 애플리케이 션을 만들던 시절이 그리워진다. 그 시절의 마소를 펼쳐보았다. 멀티쓰레딩, 트랜잭션, 분산 처리라는 말은 아무리 눈을 씻고 찾아봐 도 볼 수 없었다. 물론 그때의 마소 토픽은 그 당시 컴퓨팅 환경에서 최고의 이슈였겠지만 지금 뒤돌아보면 너무도 간단하고 명료 한 문제를 가지고 고민했었구나라는 생각이 든다. 과연 수년 후 현재의 분산 환경을 뒤돌아 볼 때 이러한 생각이 들까? 필자는 향후 에도 현재의 고민을 계속해야만 할 것 같은 불길(?)한 예감이 든다. 분산 환경은 단지 컴퓨터 공학에 국한된 문제가 아니라, 인간 이 살아가는 방식에 관한 시스템적 접근에 대한 문제이기 때문이다.

DCOM, MTS, MSMQ 등의 출현으로 과거 에 비해 분산 환경을 꾸미기가 좀더 편리해졌다는 것 외에 달라진 건 없다. 아마 미래에는 보다 쉽고 강력한 도구가 만들어져 현재보 다 좀 더 편하게 된다는 것 외에 쉬워진건 하나도 없을 것이다. 우리의 삶의 방식 역시 지금보다 훨씬 더 복잡해질 것이고, 이들 을 시스템으로 표현하기 위해서는 지금보다 더 많은 고민을 해야할지도 모른다.

필자 역시 다음 프로젝트는 COM+ 기반의 검색 엔진 솔루션을 개발할 계획이다. 벌써부터 데이터 검색이라는 작업을 어떻게 효율적으로 여러 컴퓨터에 분산시키며, 다른 트랜잭션과 연동시킬 수 있을까라는 생각으로 머리가 복잡하다.

필자 연락처 : khkim97@shinbiro.com
정리 : 강경수 elegy@sbmedia.co.kr

--------------------------------------------------------------------------------
MTS 프로그래밍의 다섯 가지 규칙

MTS 에서 비롯된 COM 프로그래밍 모델의 변화는 크게 5가지로 나눠 생각할 수 있다. MTS 컴포넌트를 사용하는 클라이언트에는 큰 변 화가 없는 대신 서버에 제한된 변화이며, MTS의 성능을 최대화시키기 위한 방법으로 MTS 애플리케이션 개발자는 반드시 이 규칙 을 따라야 한다.

서버는 SetComplete를 최대한 많이 호출해야 한다. 이것은 서버가 더 이상 유지해야 할 상 태를 갖지 않는 것을 의미한다. 이렇게 함으로써 많은 수의 클라이언트에 대해 효율적인 서비스를 제공할 수 있다. 클라이언트는 되도 록 COM 개체의 인터페이스를 빨리 얻고 지속적으로 유지해 줘야 한다. 비록 당장 COM 개체를 사용하지 않더라도 먼저 인터페이스 를 얻어야 한다. 일반적으로 객체에 대한 참조를 얻는 것은 많은 리소스를 요구하지만 MTS를 이용하면 상태를 갖지 않는 객체에 대 한 참조를 유지하는 데는 전혀 자원이 필요치 않다. 서버가 사용하는 데이터베이스 연결과 같은 자원은 최대한 늦게 할당받는다. 그리 고 사용 후 신속히 반납해야 한다. MTS는 이러한 자원을 얻는 과정을 좀더 효율적으로 처리하게 해준다. 서버는 롤과 선언적 보안 을 사용해야 한다. 기존의 개인 정보와 ACL을 사용한 보안 정책은 확장성이 좋지 않다. 서버는 적절한 시기면 언제나 트랜잭션 을 사용해야 한다. SetComplete를 최대한 자주 호출하라

클라이언트가 바라보는 MTS 컴포넌트는 단지 일반적 인 COM 컴포넌트와 차이가 없지만 컴포넌트 서버는 많은 차이를 보인다. <그림 1>에서 보는 것처럼 MTS 컴포넌트 는 클라이언트와 직접 연결되어 있지 않고 MTS 실행부를 통과한다. 클라이언트가 MTS 컴포넌트를 생성하기 위 해 CoCreateInstance와 같은 API를 호출하면 MTS 실행부는 이를 가로채 특별한 부가 작업을 수행한다. 이들 부 가 작업 중 가장 중요한 것은 컨텍스트 객체를 생성한다는 것이다. 이 컨텍스트 객체를 통해 MTS 컴포넌트와 MTS 실행부는 통신 을 하게 된다. 컨텍스트 객체가 제공하는 IObjectContext 인터페이스가 제공하는 메쏘드 중 에 SetComplete, SetAbort가 있으며 호출되면 MTS 실행부는 중요한 몇 가지 작업을 수행한다. 트랜잭션 수행 시 이 메쏘드가 호출되면 트랜잭션을 커밋하거나 롤백한다. 트랜잭션을 사용하지 않을 경우도 이 메쏘드를 호출할 수 있으며, 그 경 우 MTS 실행부에게 더 이상 MTS 객체는 유지할 상태가 없다는 것을 알려준다.

객체가 더 이상 유지할 상태가 없 다는 것은 더 이상 객체가 존재할 필요가 없다는 의미다. 객체가 다시 필요하게 되면 새로운 인스턴스를 생성한다. 객체가 필요 없 을 시 제거하면 그만큼 서버 메모리 사용은 줄어든다. 이렇게 객체를 삭제했다가 필요시 다시 생성하는 일련의 작업은 클라이언트가 전 혀 알아채지 못하게 MTS 실행부가 수행한다. 이러한 동작이 가능하도록 MTS 실행부는 <그림 2>와 같이 COM 객체 를 랩퍼(wrapper) 객체로 감싸고 있다, SetComplete 호출시 MTS는 <그림 3>과 같이 실제 MTS 객 체는 릴리즈하고 다만 랩퍼만 유지한다. 클라이언트 입장에서 보면 실제 MTS 객체를 참조하는 것이 아니라 랩퍼를 참조하고 있는 상 태이므로 어떠한 변화도 감지하지 못한다. 클라이언트가 다시 이 객체의 메쏘드를 호출하면 MTS는 객체를 다시 생성하기 위해 클래 스 팩토리를 사용하게 된다. 객체가 생성되면 클라이언트의 호출을 전달해 준다. 이러한 일련의 동작을 JIT(Just-In- Time) 실행이라고 하며 <그림 2>의 상태로 복원시켜 준다. 객체는 어떠한 상태도 유지하고 있을 필요가 없으므로 새 롭게 생성된 객체는 그 전의 객체와 구분할 수 없다. 따라서 가능한 자주 SetComplete 함수를 호출해 MTS에서 더 이 상 필요 없는 객체를 제공하게 해야한다.

인터페이스 포인터를 빨리 얻고 유지하라

일반적 인 COM, DCOM 프로그램에서 클라이언트가 지금 당장 필요 없는 객체를 생성하고 이에 대한 인터페이스 포인터를 유지하고 있 는 것은 그리 바람직한 상황은 아니다. 왜냐면 사용되지 않는 객체를 위해 필요 없는 메모리를 더 쓰고 있기 때문이다. 그러 나 MTS 환경에서는 상태가 없는 객체는 즉시 메모리에서 삭제되므로 굳이 클라이언트가 객체에 대한 참조를 릴리즈할 필요가 없다.

MTS 는 클라이언트에서 보이지 않기 때문에 일반적인 COM이라고 생각할 수도 있지만, 간혹 클라이언트가 MTS 객체의 메쏘드를 호출 할 때 주의해야할 사항이 있다. 예를 들어 프로퍼티에 특정 값을 지정하고 SetComplete가 포함돼있는 메쏘드를 호출한 후 프 로퍼티 값을 읽는다고 가정하자. SetComplete를 호출하므로 객체는 메모리에서 제거되어 프로퍼티에 지정한 값 역시 사라질 것 이다. 이러한 문제를 해결할 수 있는 유일한 방법은 클라이언트가 컴포넌트에 대해 자세히 아는 것이다. 어떤 메쏘드 가 SetComplete를 호출하는지 SetAbort를 호출하는지에 대한 사전 지식이 있어야 한다.

서버의 자원 관리

일 반적으로 데이터베이스에 대한 ODBC 연결 등의 서버 자원을 얻어야하는 경우 많은 시간이 소모된다. 그러므로 보통 COM 개발자 는 이와 같은 자원을 가능하면 초기에 얻고 객체가 종료될 때 반환한다. 그러나 이러한 방식은 속도는 빨라질지 몰라도 컴포넌트를 사 용하는 클라이언트 숫자가 늘어난다면, ODBC 연결은 유한한 시스템 자원이므로 얻지 못하는 클라이언트가 발생할 것이다. 그렇다 고 필요시 연결하고 사용 즉시 반납한다면 그만큼 수행 속도는 많이 느려질 것이다.

MTS 자원 분배기는 이러한 문제 를 효율적으로 해결해준다. MTS에서 현재 가장 중요한 자원 분배기는 ODBC 연결 관리기로 사용 가능한 ODBC 연결 풀 (pool)을 관리해준다. MTS 객체가 데이터베이스 연결을 요청하면 자원 분배기는 풀에 있는 연결을 제공해 주며, 객체가 연결 을 해제하면 다시 자원 분배기는 그 연결을 풀에 돌려준다.

실제 데이터베이스 연결에 관한 자원은 생성되거나 삭제되 지 않으므로 처리 속도는 훨씬 빨라지게 된다. 따라서 MTS 컴포넌트를 제작할 때는 이러한 특성을 고려해서 메쏘드 호출시 연결 을 수행하고 데이터를 처리한 뒤 바로 연결을 반납하게 만든다. 이렇게 함으로써 한정된 자원인 ODBC 연결을 여러 클라이언트가 공 유하므로 많은 클라이언트 처리가 가능해진다.

서버 롤과 선언적 보안 사용

클라이언트가 COM 객체에 서 메쏘드를 호출할 때 그 객체는 현재 자신을 호출하는 클라이언트가 이 메쏘드를 실행할 권한이 있는지 확인해야 한다. 가장 일반적 인 방법으로는 클라이언트 개인 정보를 확인하는 서버 쓰레드가 존재해서 클라이언트가 자원을 사용할 때 처리해주는 동작을 하는 것이 다. 윈도우 NT 서버의 경우 자원의 ACL이 자동으로 체크되기 때문에 프로그래머가 이에 대한 처리를 해줄 필요가 없다.

그 러나 이러한 접근 방법은 원하는 결과를 정확히 얻기가 어렵고 확장성이 좋지 않다. 그래서 MTS는 선언적 보안이라는 새로운 방법 을 제공하고 있다. 선언적 보안은 롤이라는 개념에 기반을 두고 있으며, 롤은 단지 윈도우 NT 서버의 사용자, 그룹의 모임이며 유 일한 이름을 가진다. MTS 관리자는 MTS 관리 툴을 이용해 각 사용자와 그룹이 어떤 롤에 속하는지 지정한다. 롤이 지정되면 관 리자는 각 롤이 어떠한 MTS 컴포넌트를 사용할 수 있는지 지정할 수 있으며, 컴포넌트의 각 인터페이스에 대해 세부 권한을 지정 할 수 있다.

이와 같이 일단 롤을 지정해주면 추가적인 프로그램 코드의 사용 없이 쉽게 보안 메커니즘을 구현 할 수 있다. 물론 보다 복잡한 보안을 처리하기 위해 프로그램적 보안 방법 역시 가능하다. IObjectContext가 제공하 는 IsCallerInRole 메쏘드를 사용해 호출자가 어떤 롤에 속하는지 알 수 있으므로 보다 세밀한 제어가 가능하다.

서버 트랜잭션 사용

MTS 는 트랜잭션 처리 기능보다는 분산 컴포넌트의 효율적 수행 환경에 보다 초점이 맞춰져 있다고 많은 사람들이 생각하고 있다. 그래 서 혹자는 ‘이름을 잘못 지었다’고 이야기하곤 한다. 그러나 트랜잭션 처리 역시 MTS의 중요한 기능이므로 완전한 이해를 통해 적 재적소에 사용해야 한다.

하나의 데이터베이스에 대한 트랜잭션은 데이터베이스 자체로 충분히 처리가 가능하지만 둘 이상 의 데이터베이스에 걸친 트랜잭션 처리 및 다른 애플리케이션이 포함된 트랜잭션 처리 작업은 쉽지 않다. MTS는 이러한 이질적 시스 템에 대한 분산 트랜잭션을 지원하므로 아주 쉽게 처리할 수 있다. 또한 컴포넌트 모델과 트랜잭션 모델을 통합시켰으므로 클라이언트 는 트랜잭션에 대한 어떠한 고려를 하지 않아도 된다.

컴포넌트를 제작할 때 트랜잭션에 대해 충분히 고려한다면 설 계 단계에서부터 완전히 새롭게 구상해야 한다. 가장 활용도를 높게 하기 위해서는 각 컴포넌트를 분리된 업무 단위로 캡슐화할 필요 가 있다. 이렇게 하면 각 컴포넌트 사이의 트랜잭션 연결을 쉽게 처리할 수 있다.

http://blog.naver.com/saga111/120008481356

'UP! > Web Service' 카테고리의 다른 글

SCTP  (0) 2008.08.21
분산객체 시스템(COM,COm+,DCOM,MTS) 에 대한 개념  (0) 2008.08.21
분산객체기술종류  (0) 2008.08.21
웹 서비스 개념 및 교육 내용  (0) 2008.08.21
Web Service  (0) 2008.08.21
Posted by 으랏차
,
분산객체기술 (미들웨어, 분산객체기술, CORBA , COM/DCOM, ORBIX)

1. 미들웨어
 분산컴퓨팅이 발전하면서 Client/Server의 광범위한 발전과 더불어 파생되는 문제점을 해결하기 위한 즉, Client와 Server간의 관리를 담당하는 Software

  (1) 통신 미들웨어 : TCP/IP, RPC, MQ, DCE
  (2) 데이타베이스 미들웨어 : ODBC등
  (3) OLTP 미들웨어 : TUXEDO, TOPEND등
 * DCE (Distributed Computing Environment) : OSF(Open Software Foundation) 에서 제정한 분산환경을 위한 표준안으로 기존 네트웍 운영체제에서 우수한 기능만을 모아 분산환경에서 C/S 프로그램을 가능하 게 한 통신 미들웨어. (현재는 빠르고 관리하기 쉬운 코드와 실행 시간에 함수를 호출할 수 있는 기능이 추가됨으로써 이후 설명 할 분산객체 표준인 CORBA의 기능이 반영)
2. 분산객체기술
2.1 배경
컴퓨터 사용자들의 요구는 개인적으로 생산성 있는 응용 프 로그램뿐만 아니라 파일이나 데이터베이스처럼 다양한 데이터 저장공간으로부터 정보를 얻고자 하며 게다가 다른 사용자와 자료를 공유하 고 서로 통신 하기를 원하고 있다. 이렇듯 다양한 요구 사항을 만족시키는 프로그램을 작성하려면 서로 다른 운영체제와 네트웍 환경 등 이종의 환경에서도 작동하 는 C/S 소프트웨어가 필요로 하며 이런 목적으로 개발된 소프트웨어는 분산환경에서 서로 다른 시스템과도 쉽게 통합이 가능해야 한다 는데서 제기된 기술적 요구가 탄생배경.(현재 프로그램 개발 환경이 객체기술을 적극 수용하고 있어 객체 프로그램을 상호 통신해주 는 새로운 방법론이 요구되고 있음)
 
2.2 의미
이렇게 다양한 사용자들의 요구를 만족시키기 위해 그리 고 이종의 분산환경에서 여러 종류의 응용 프로그램을 통합하기 위해서는 일정한 결합 방식이 필요한데 이런 기술을 분산객체 기술이 라 할 수 있다. 이런 배경을 가지고 태동한 것이 분산객체기술 즉, 일종의 객체지향 미들웨어 이다.
2.3 동향
이러한 분산객체기술을 표준화 하기 위하 여 OMG(Object Management Group)라는 그룹이 만들어졌고 객체지향 기술을 기반으로 하여 이종의 분산된 환경에 서 응용 프로그램을 통합하고 상호연동 할 수 있는 표준기술 OMA(Object Management Architecture)가 탄생 되었다. 이 OMA는 한마디로 객체환경에서 필요한 모든 서비스(객체의 생성, 소멸, 저장, 트랙잭션 기능등)를 총칭하는데 이중 가 장 핵심이되는 기술인 이종의 분산환경에서 통신을 담당하는 서비스의 대표적인 제품이 현재 가장 널리 사용되고 있으며 표준으로 인정되 고있는 CORBA 이고 근래 윈도우의 이점을 등에 업고 대중성에서 가능성을 보이고 있는 마이크로소프트사의 전략기술인 DCOM이 이 에 상응하는 제품이다.
3. CORBA(Common Object Request Broker Architecture)
CORBA는 객체지향 기술을 기반으로 하여 서로 다른 운 영체제와 네트웍 환경, 이종의 데이타 모델, 데이타 형, 구현 언어 등 특정 환경에 종속되지 않고 시스템을 구축할 수 있게 해주 는 일종의 객체지향 미들웨어의 표준으로 현재 가장 광범위하게 사용되고 있다.
4. COM/DCOM(Microsoft's (Distributed) Component Object Model)
어플리케이션에 기능이 추가될수록 어플리케이션은 복잡해지 고 커지게 되는데 이를 해결하기 위해선 이를 단위 어플리케이션으로 분할하는 것이 유지/보수 및 재 사용시 용이할 것이다. 이런 분 할된 소규모 단위 어플리케이션을 컴포넌트라 하는데 현재 윈도우체제가 이런 컴포넌트간 통신을 지원하는데 있어 관리상의 문제 및 이기 종 언어로 구현된 컴포넌트간 통신등에 문제를 해결하기 위해 만들어낸 표준이 COM이다. 한마디로 COM은 클라이어트 프로그램과 객체 서버 프로그램간의 상호
통신방식을 정의한 모델이라 할 수 있는데 이런 방식 을 이용한 기술로 OLE1, OLE2를 거쳐 현재 각광받는 Active/X기술이 있다. (예:윈도우 환경에서는 이 모델을 통 해 (워드와 엑셀의 통합처럼)오브젝트 간 통합이 가능하게 된다.) 그러나 이 COM은 Local Machine에서만 작동이 되기 때문에 분산기능을 가지지 않고 있고 이에 분산기능을 추가한 것 이 DCOM 이다. 즉, 이 DCOM은 Lan, Wan또는 인터넷에서의 이기종 컴퓨터간 통신을 지원하는  COM의 확장형 이 라 할 수 있다.
 
* 현재는 CORBA와 DCOM의 통합표준을 마련하기 위한 준비가 진행 중
5. ORBIX
CORBA를 구현하기 위한 일종의 개발툴로써 현재 여러가지 제품중 가장 광범위 하게 사용되는 CORBA를 완벽하게 지원하는 분산 응용 프로그램개발 도구라 할 수 있다.
 
* ORBIX 외에도 VisiBroker, ObjectBroker, PowerBroker Corba Plus, ORB Plus등 여러 제품이 있다.

http://blog.naver.com/hjkim5834/120019069401
Posted by 으랏차
,
1. 웹 서비스 소개

/*웹 서비스를 소개하고 웹 서비스 기초를 알아보며 컴퓨터 패러다임 근간을 통해 웹 서비스의 등장배경을 살펴본다. 웹 서비스 구현을 위한 기본 기술요소와 웹 서비스 시스템의 다양한 컴포넌트들에 대한 윤곽을 이해한다.*/

웹 서비스는 표준 인터넷 기술을 이용하여 동적으로 상호작용 하는 소프트웨어 컴포넌트 들이다. 웹 서비스는 개발하는데 많은 노력을 요구하는 IT 시스템들 간의 연결 교량을 만드는 것을 가능하게 한다.(Gartner Group)

인터넷 프로토콜들과 포맷들을 통하여 다른 소프트웨어가 사용할 수 있도록 설계된 소프트웨어.(Forrester Research)

웹 서 비스에 필요한 기술들(HTTP, XML, SOAP, WSDL, UDDI)에 대하여 합의를 한다면, 웹 서비스를 일관성 (consistent)있고 메시지 지향의 전송 메커니즘을 사용한 서비스의 호출을 위한 투명한(transparent) API 등 을 제공하며 데이터의 표현과 변환을 위해서 XML을 사용함으로써 동적인 위치 파악과 연결이 가능한 소프트웨어 컴포넌트 이다.
언어나 플랫폼 그리고 운영체제에 관계없이 웹을 통해 애플리케이션들이 상호작용 가능한 시스템.

1.1. 웹 서비스 기초
언어, 개발독, 플랫폼에 독립적이며 산업계에서 용인된 공개 표준들에 기반하고 있다.
느슨히 결합된(loosely-coupled) 서비스 기반의 애플리케이션들로서, 확립된 프로토콜들을 이용하는 통신을 위한 API를 제공함으로써 연결성을 높이고 복잡성을 줄인다.
관여하는 시스템에 상관없이 기계 대 기계의 자동화된 직접적인 커뮤니케이션을 가능하게 한다.
서비스 검색과 공표(publishing)를 위한 공통의 메커니즘을 이용해서 공표된 웹 서비스들을 찾는 것을 가능하게 한다./*UDDI, JAX-R*/
웹 서비스 정의를 위한 단일 표준 명세서가 존재하지 않기 때문에 특정 애플리케이션의 웹 서비스 파단을 위해 사용되는 표준항목은 다음과 같다./*웹 서비스에 필요한 기술들*/

- Extensible Markup Language 또는 XML은 독립적인 방법으로 데이터를 표현하기 위한 표준으로 XML은 데이터 정의뿐만 아니라 다른 프로토콜들 내부의 모든 서술에도 사용된다./*SOAP*/
- HyperText Transfer Protocol 또는 HTTP는 인터넷상의 또는 인트라넷 내부에서의 운송을 위한 것이다. HTTP는 데이터 전송과 요청/응답 형태의 통신을 위한 메커니즘을 제공한다.
- Simple Object Access Protocol 또 는 SOAP은 요청/응답의 정의를 위한 메커니즘을 제공하며, 원격 프로시저 호출 (Remote Procedure Call, RPC) 형식의 대화를 가능하게 한다./*쉽게 SOAP은 클라이언트 애플리케이션이 실제 로 웹 서비스를 호출하게 해주며 클라이언트와 제공하는 애플리케이션이 구현된 언어에는 무관하다. SOAP 프로토콜의 순수한 자바 버 전은 JAX-RPC, 아파치에서 한것이 Axis. 자바환경에서는 둘중 하나 쓴다. 물론 벤더 제품군은 빼고…*/
- Universal Description, Discovery and Integration 또 는 UDDI는 공급자와 서비스의 공통 등록기(Registry)를 통하여 서비스의 위치를 찾는 방법을 제공한다. /*UDDI에 정통한 대부분의 사람들은 UDDI가 DNS와 같은 규모의 광역 등록기가 되지는 않을 것으로 보고 있다*/
- Web Services Description Language 또 는 WSDL은 특정 서비스를 호출하는데 필요한 자세한 정보를 제공한다./*CORBA 의 IDL(Interface Definistion Language) 또는 Deploy Description 이라고 보면 된다*/
1.2. 컴퓨터 패러다임
최근의 IT시장에서의 상황 은 또 하나의 큰 패러다임 전환기를 맞고 있다. 과거에 Main Frame에서 Client/Server로의 큰 변화가 있었고, 지금은 Java와 EJB, 어플리케이션 서버라는 용 어가 인터넷을 등에 업고 새로운 변화의 시작단계를 지났으며. 이러한 패러다임은 기능상의 추가나 변경이 있을 수는 있지만, 최소 한 이러한 기본 마인드와 골격은 향후 한동안 변하지 않을 것으로 예상된다.
근래에 와서 컴퓨터 패러다임은 사용자 입장이 아 닌 개발자 입장 위주로 변천 하고 있다. 즉 서비스를 제공하기위한 기반 시스템 구축 및 개발에 포커싱 되어 시장이 형성 되고 있다. 정보기술 및 컴퓨팅 관련 분야의 권위자 입장에서의 해석이 이러하며 관련 분야의 시장 구도 또한 다르지 않다.

1.2.1. Main Frame 시스템
서비스와 데이터를 중앙집중 방식으로 단일 관리하는 Main Frame 시스템

- Program + Data = Size 및 관리 문제 발생
- 고성능 Workstation 및 경량 Server의 등장
- C/S Network 구조기반으로 Protocol과 Request/Response가 긴밀한 Interface Module로 형성
- Process Panic(Concurrent Request Processing)으로 Thread 기법이 필요
- NASAPI, ISAPI가 지원되나 사용하기 어렵고 Platform Dependent 문제로 Independent가 고려됨
1.2.2. 분산환경 기술 및 분산기술 표준
EDI(Eletronic Data Interchange) 나 CORBA (Common Object Request Broker Architecture)와 EJB 같은 분산환경 기술 및 분산기술의 표준 에 대한 시도가 있었으나 이러한 분산 객체 기술들은 상호운용성(interoperability)을 돕는 대안으로 한계를 보이게 되 며 웹 서비스와 비교했을 때 몇 가지 결점을 나타낸다./*부분적인 성공만 성과로 평가됨*/

- EDI는 너무 많은 비용이 소요되며 구현하는 데 엄청난 노력이 필요/*기술의 난해성*/
- 클라이언트-서버의 형태로 내부의 애플리케이션에 접근하는 것을 배제하며, 결국 서로 작용하는
  시스템이 늘어날수록 서로다른 시스템을 사용하고 있을 가능성이 커지므로 여러 개의 터미널이
  필요하게 되어 데이터의 투명성이 보장되지 않음

문서 표현의 한계(Low Level Protocol)
- CORBA와 EJB는 상당히 강건한 통신 메커니즘을 제공하지만 API가 복잡하거나(CORBA)
  특허권이 있는 상태(EJB)
- 기존 기술의 표준화 실패

산 업계에서는 EDI를 가지고 표준을 마련하려고 했던 적이 있으나 불행하게도 EDI는 그 수용력에서 명백한 한계를 가지고 있었다. EDI 트랜잭션은 보통 고정된 메시지 포맷을 명시한 구현 지침에 따라 작동한다. 그러나 급격히 변화하는 비즈니스 환경에서 EDI 의 비즈니스 규칙은 그런 식의 예측성을 포함할 수 없으므로 EDI 트랜잭션은 하나의 산업에서 다른 산업으로 심지어 같은 산업 내 의 다른 부문 간의 연결에도 어려움이 있다.
결국 EDI는 표준화 되었지만 융통성이 없다.

이에 반해 웹 서비스는 컴퓨터 환경에 상관없이 인터넷(또는 회사 내부에서라면 인트라넷) 접근이 가능한 환경에서 원하는 누구에게나 서비스 제공이 가능 하다.

1.2.3. 기업 애플리케이션 통합
기 업 애플리케이션 통합 또는 EAI(Enterprise Application Integration)은 분산환경 기술 및 분산기술 표 준 문제의 일부를 해결하기 위한 시도 이다. EAI는 기업 내에서 사용하던 기술들을 기업간에도 사용할 수 있게 해주며 표준 사용을 통한 간소화 와 비용 절감이라는 유례없는 방 법을 제공한다.
EAI는 허브(hub) 또는 버스(bus) 개념을 도입하여 각 시스템은 여러 개의 인터페이스가 아니라, 시스 템 별로 표준화 된 단 한 개의 인터페이스만 필요 하다. 비즈니스 관점에서 EAI는 여러 개의 시스템이 하나의 단일 복합 시스템으로 작동 가능하게 하므로 효율성을 제고하기 위한 것이다. 표준 인터페이스를 만들어서 시스템들의 상호운용에서 생기는 복잡성을 감소시킨다.
하 지만 EAI는 전매 특허권이 있으며 인터넷에 기반하고 있지 않으므로 회사의 경계에서는 효력이 없어진다. EAI 솔루션이 전매 특허 권이 있다는 것은 기업의 수준에서 본다면 하나의 간단한 인터페이스가 회사 간에 존재하지 않는다는 것을 의미한다. 다른 EAI 제품 솔루션간 여러 개의 인터페이스를 작성해야 하며 모든 회사들이 EAI를 사용하지 않기 때문에 또다른 인터페이스 들 또한 개발되어야 한다.

웹 서비스는 이러한 문제를 해결한다.
UDDI 등록기는 회사가 자신의 서비스를 모두에 게 선전하게 해준다. WSDL은 이렇게 선전한 서비스들을 제공하는 인터페이스를 기술 해준다. SOAP은 협업 파트너들 사이의 인터 페이스에 따르는 메시지의 전송을 가능하게 한다. 공개 표준에 기반한 기술이기 때문에 특허권이 있는 인터페이스에 대한 필요를 제거해 준다. 전매 특허권이 있는 솔루션을 사용하고 웹 서비스로 옮겨가기 위한 인터페이스나 중간 프로그램을 작성하는 것보다는 웹 서비스를 이용해 서 애플리케이션 교량을 건설하는 것이 언제라도 추가되는 파트너에 대한 빠른 서비스 전환이 가능하므로 시스템의 유연성을 보장 할 수 있다./*주요 EAI 판매자들은 이미 웹 서비스를 지원하고 있거나 근시일 내에 지원할 것임은 이러한 점에서 주목할만 하다* /

1.2.4. 서비스 지향 아키텍처
사용자 인터페이스에서 독립적인 서비스로서의 소프트웨어 설계 개념인 서비 스 지향 아키텍쳐(Service-Oriented Architecture, SOA) 개념이 소프트웨어 공학의 전망에 포함이 된 것 은 십년 이상 되었다. 기본적으로 SOA는 애플리케이션의 설계가 서비스의 집합이라는 것을 의미 하며 애플리케이션을 표현 코드 또는 서비스를 이용하는 다 른 코드로 생각 한다. 이러한 설계 유형을 이용해서 다른 클라이언트들을 만들 수 있고 그것들을 필요한 대로 HTML 페이지, 애플 리케이션, 무선 애플리케이션 등으로 분산 한다./*단지 MVC가 아니다. 별도 클라이언트라고 봐야 한다. 이 클라이언트에 서비스 를 제공할 수 있는 SOA로 작성한다*/

DCE(Distributed Computing Environment) 와 CORBA(Common Object Request Broker Architecture)같은 분산 컴퓨팅의 초기 시도들은 애플리 케이션의 비즈니스 논리(business logic)가 반드시 표현 논리(presentation logic)과 결합되어 있을 필요 가 없다는 것을 깨닫게 하였다. 비즈니스 논리는 완전히 분리될 수 있으며, 정의 된 API(Application Programming Interface)와 함계 제공될 수 있다.

논리를 서비스로 분리하면 사용자 인터페이스는 더 이상 비즈니스 논리와 같은 물리적 게층에서 운영할 필요가 없어지며, 둘 다 독립적으로 확장될 수 있다./*플랫폼 독립성의 기술적 논점에 대한 얘기 이다*/

서 비스를 강력하게 지원해 주는 몇몇 플랫폼들이 있는데, 자바와 닷넷이 대표적이다. 둘 다 트랜잭션 관리, 영속성 관리, 상태 관 리 등을 제공하며, 서비스 설계의 복잡성(예를 들면, 안전 쓰레드(thread-safe)의 다중 스레드 코드 작성)을 제거해 준 다.

서비스가 진정으로 중립적이고 플랫폼에 독립적이기 위해서는 클라이언트와 서비스 사이의 데이터 교환을 위한 중립적인 표현이 필요하다는 것이 인식 되었다.

/*즉 확장성 마크업 언어(XML)가 컴포넌트로서 필요하다는 것이 입증 된 것.

자 바만 사용되는 환경에서는 이 정도로 충분할 것이지만 대부분의 조직의 환경이 균질적이지(homogeneous)는 않다. 모든 프로그 램이 서버와 통신하는 데 JRMP 기반의 RMI를 이용할 수는 없으며, J2EE 서버가 서비스들을 위해 내놓은 인터페이스는 우리 가 필요로 하는 발견과(discovery)과 같은 일부 특정을 배제하고 있다.*/

인터페이스의 표현이 비즈니스 논리 와 분리되고 비즈니스 논리가 다시 저장 논리와 분리되어 있을 때 각 부분은 분리된 하드웨어 플랫폼에서 운영할 수 있으며 별개의 업 무를 수행할 수 있다./*역시 같은 플랫폼 독립성의 기술적 논점에 대한 얘기 이다*/

비즈니스 논리를 이용하는 새로운 시스템을 추가하는 데 코드나 애플리케이션 구조를 변경할 필요가 없으며 웹 서비스는 이 SOA의 개념에 완벽하게 들어맞는다.

웹 서비스는 서비스 아키텍처의 다음 단계의 논리적 추상화(abstraction)이다./*추상화 이며 또한 구체화 되어 있고, 실제 표준화된 적용방향 제시라고 볼 수 있다.*/

웹 서비스는 어떤 기계, 언어, 플랫폼에서 운영되는 클라이언트에게나 서비스의 발견, 기술, 호출을 쉽고 투명하게 해준다./*JAX-R을 이용한 UDDI, WSDL, 투명하긴하나 정말 쉬운가…*/

결 국 분산환경에서의 컴퓨터 패러다임 은 Network Program(C/S:Socket, RMI) -> Distribute Envilopment(CORBA, EDI, .net /EJB) -> EAI -> Web Service 와 같은 흐름 이다.

/*
SOA는 가장 마지막에 설명 되었지만 근 10년 이상전부 터 고려된 개념임을 감안할 때 맨앞에 두어야 언급하는게 순서이다. 정확하게 소프트웨어 패러다임 발전형태의 흐름이므로 C/S부 터 Web Service까지 전체 Base Line이라고 봐야 할 듯 하다. RMI는 두고 두고 써먹을수 있는 보루가 되는 기술이고 분산 아키텍처의 기본 근간이 되므로 재미삼아 샘플을 구현해 보고 다음 3가 지 정도만 정확히 이해한다면 마스터 수준이다.
1. Call Back(동기/비동기)
2. 동적 클래스 로딩 : Dynamic Class Loading(Security Manager, Policy File)
3. 원격 객체 활성화 : Remote Object Activation
Java Network Programming 이런거 말고 한빛 미디어 Perfect EJB의 1~3장 까지 부분을 보는게 좋다.
*/

1.3. 웹 서비스 시스템 APIs
1.3.1. SOAP
XML 언어를 이용한 분산 환경에서의 정보 교환을 위한 프로토콜로 XML Messaging의 표준 이다.
SOAP 역 시 XML에 기반하고 있으며 각 SOAP 메시지는 XML 문서 이다. 클라이언트 애플리케이션이 실제로 웹 서비스를 호출하게 해주며 클라이언트와 제공하는 애플리케이션이 구현된 언어와는 무관하다. 2000년 5월 8일 W3C에 노트 되어 공식화(1.1 Spec Note) 되었으며 2003년 5월 7 일 1.2 Spec  Proposed Recommendation 되었다.

SOAP의 특징은 다음과 같다.
- 경량 프로토콜로 CORBA, RMI, DCOM과 같은 다른 분산 컴퓨팅 프로토콜의 내용보다 적기 때문에 프로토콜 자체가 복잡하지 않고 lightweight.
- Text- based XML 포멧 사용하므로 하드웨어 플랫폼, 운영체제, 프로그래밍 언어 전 영역에 걸쳐서 독립적인 프로토콜./*이전 분 산 컴퓨팅 프로토콜은 이진(binary) 포멧 메세지를 사용하기 때문에 특정 플랫폼, S/W에 종속적 이었다*/
- 기본적으로 HTTP 프로토콜로 전송 되므로 인터넷 연결 시스템과 추가 적인 구성없이 통신 가능. /*SOAP 메시지를 HTTP 전송 프로토콜에 바인딩하여 전송, FTP, EMAIL 등등 기타도 가능*/
- 방화벽에 제한되지 않으나 반대로 비허가 사용자도 SOAP 응용프로그램에 접근할 수 있게 되므로 보안을 고려해야 함.
- 자바는 XML RPC를 위한 자바 API(JAX-RPC)를 제공하여 원격 프로시저 호출(RPC)을 실행할 수 있게 한다./*JAX-RPC는 SOAP 프로토콜의 순수한 자바 버전을 구현한다.*/
- 서비스가 요구하는 정보를 포함하고 있는/*말이어렵지 호출 정보, 프로토콜 정보 등등과 파라메터 등이다*/ 문서를/*SOAP 메시지*/ 애플리케이션에서 서비스로/*웹 서비스*/ 건네주고 응답을 받는다

Information Models(Service Model)유형에 따라 XML-based, SOAP-based 웹 서비스로 구분된다.
- 정보 전달용 XML 메시지로 구성인 Document-Style Information Model
- 원격 프로시저 호출(Remote Procedure Call)을 하는 XML 메시지로 구성인 Parameter(RPC)-Style Information Model

SOAP-based 방식은 XML Vocabulary로 볼 수 있고, XML-based 방식은 XML Directly이며 REST(Representational State Transfer)라 부르기도 한다.

REST 방식은 SOAP-based 방식에 비해 단순 XML 문서의 전달 이므로 단순하며 보다 빠르게 개발이 가능하다.

1.3.2. WSDL
Web Service Definition Language 은 IBM, Microsoft 등의 회사들이 웹 서비스 시스템 기능을 명세화시키는 방법을 표준화하기 위해 만들어 졌으며 2001 년 3월 14일 W3C에서 WSDL 1.1 Note로 공식화 되었다.

웹 서비스 명세서로 표준 분산 컴퓨팅 기술인 CORBA의 IDL(Interface Definistion Language)에 해당 된다.

SOAP의 Service Model에 따라 Document-Style Service, RPC-Style Service로 구분된 정보를 포함한다.

실제 호출하는 원격 프로시저명, 인자, 반환형 및 SOAP 메시지를 전송하는 전송프로토콜의 종류를 기술하며 웹 서비스 시스템의 URL(endpoint) 정보도 포함한다.

- 웹 서비스의 기능을 구체적으로 명세화 하여 웹 서비스의 정보 및 사용법 알수 있다./*사람, 시스템*/
- 정확한 서비스 해석을 위한 웹 서비스를 명세화하는 공통적인 규약(스펙)의 역할
- 웹 서비스 소비자는 다양한 플랫폼에서 실행되는 응용프로그램임을 고려하여 플랫폼과 특정  S/W에 종속적이지 않는 포맷으로 작성 하기 위해 XML 사용
- WSDL 문서를 해석한 후 클라이언트 응용프로그램은 웹 서비스 시스템의 사용법을 알게되고 이후 SOAP 메시지를 생성하여, 전송
/*
마치 EJB 개발시 자동으로 만들어주는 Deploy Discriptor와도 같다
DD 는 EJB IDE가 만들어 주고(? Deploy tool이…) Container에서 사용하기 위한 용도 이지만 명세로써의 역할 을 충분히 수행할 수 있고 EJB Client(다른 EJB) 작성 시 참조 할 수 있다.물론 API Doc도 있지만..
WSDL도 자동 생성하지만 해당 서비스를 용도에 맞게 식별하고 논리적으로 이해하기 위해서는 인위적인 식별이 가능할 정도로 이해할 수 있어야 한다.
웹서비스의 정형화된 시작은 UDDI 레지스트리에 Publish 하고 Find 함으로 시작 된다.
*/

IBM 웹 서비스 툴킷의 일부인 Java2WSDL 툴은 자바 클래스로 부터 WSDL을 생성하게 해주며 WSDL2Java 툴은 개발자가 WSDL 문서로부터 자바 클래스 스텁(stub)을 생성 해 준다.

Java 표준 API에 포함된 wscompile도 WSDL로 부터 자바 클래스 스텁(stub)및 서버 타이(tie)를 자동 생성 해준다.

1.3.3. UDDI
Universal Description, Discovery, and Integration 레지스트리(Registry)는 각종 정보들을 생성, 저장, 검색할 수 있는 XML 기반의 자료 저장 장치(소프트웨어+하드웨어) 이다.

웹 서비스를 공표하는 수단으로 공적 UDDI 레지스트리는 IBM, MS, Systinet, xMethods와 같은 소프트웨어 회사들이 제공하고 있다.

웹 서비스는 현재 뉴스 배급회사와 같은 거대한 시스템을 비롯하여 날씨, 주식정보, 배송추적과 같은 세부적인 시스템까지 운영되고 있다./*JNDI 또는 LDAP과 같다고 이해하자*/

UDDI를 사용하기위한 주요항목과 흐름은 다음과 같다
- UDDI 레지스트리의 클라이언트가 UDDI 레지스트리에 접근해서 정보를 저장하고 찾기 위해서 SOAP 메세지를 이용
- SOAP 메시지의 전송용 프로토콜로 HTTP 프로토콜을 사용하여 플랫폼과 구현 언어에 독립적으로 사용 가능
- UDDI 레지스트리 클라이언트는 UDDI 레지스트리 프로바이더(드라이버)를 통해서 SOAP 메시지를 생성하고 전송한다.
- UDDI 레지스트리가 XML 기반의 자료 저장 장치이기 때문에 UDDI 레지스트리 간의 데이터 교환이 자유로움/*XML 문서 포맷으로 데이터 교환*/
- 클라이언트 프로그램이 UDDI 레지스트리에 비즈니스 정보를 게시하거나 찾기 위해서는 클라이언트 요청을 XML 문서로 작성후 다시 요청 SOAP으로 포장하여 전송/*SOAP!!! 원격 프로시저 호출이 가능!!!*/

UDDI API Spec에 UDDI 클라이언트가 UDDI 레지스트리에 작업을 수행하기 휘한 클라이언트에서 사용할 수 있는 XML 엘리먼트를 정의 한다.

이러한 엘리먼트들은 클라이언트 요청 SOAP 메시지에 포함되어 원격 프로시저 호출로 사용된다.

Publish API 엘리먼트 비즈니스 정보를 생성, 수정, 삭제 용도로 사용되며 Inquiry API 엘리먼트는 웹 서비스 클라이언트의 비즈니스 정보 검색으로 사용된다.

UDDI 레지스트리에서 SOAP 해석후 API 엘리먼트 추출후 처리하고, 처리 결과는 다시 SOAP 메시지로 클라이언트에 전송 한다.

UDDI API 엘리먼트 생성후 SOAP 메시지로 포장하고 HTTP 프로토콜로 전송까지 전담하는 Tool로 IBM의 UDDI4J 과 표준 Java API인 JAXR 프로바이더가 있다.
1.3.4. JAXR
Java API for XML Registries는 ebXML이나 UDDI와 같은 XML 레지스트리에 일관되게 접근하여 UDDI 레지스트리에 정보를 저장하거나 검색 할 수 있는 표준 Java API 이다.

JDBC 와 유사한 개념으로 이해할 수 있으나,  JDBC 는 각각의 드라이버를 설치 하고 구현하는것에 비해 UDDI 프로바이더 프로토콜은 SOAP 메세지 기반의 표준 접속 프로토콜이라는 차이점이 있다.

JAXR 프로바이더는 JAXR 인터페이스를 구현해서 벤더들이 만든 UDDI 레지스트리 접속용 프로그램으로 javax.xml.registry 패키지에 있는 인터페이스 메소드를 구현 한다.

JAXR의 인터페이스를 준수하여 프로바이더(UDDI 레지스트리 접속용 프로그램) 개발되므로 JAXR 사용시  UDDI 인터페이스의 표준화 및 일관된 인터페이스 유지가 가능하다.

1.3.5. JAXB
Java API for XML Biniding(JAXB)은 XML과 Java Code 사이를 매핑하는 표준 방법을 제공 한다.

Java Class를 XML 문서로 바꿔주는 Marshalling 기능과 XML 문서를 Java class로 바꿔주는 Unmarshalling 기능이 가능하다.

XML Schema문서 정보로 에서 XJC Compiler를 사용해서 class로 생성할 수 있다.

1.3.6. SAAJ
SOAP with Attachments API for Java은 JAX-RPC, JAXR 이 실행되기 위해 반드시 필요한 API.

javax.xml.soap API를 사용하여 XML Message(SOAP)으로 작성하는 방법과 별도로 JAXM으로 Client Stub 객체 및 Server Tie를 직접 구현할 수 있다.

Stub, Tie 직접구현 이외에도 자바 언어로 웹 서비스 구현시 JAX-RPC를 사용하는 대신에 직접적으로 SAAJ를 이용해서 프로그래밍하면 다음과 같은 처리가 가능하다.

- SOAP 클라이언트 직접구현
- SOAP 메시지 작성
- 데이터 첨부(바이너리)
- SOAP 메시지를 생성
- 웹 서비스 시스템과 웹 서비스 클라이언트 간의 point-to-point 연결을 이용해서 SOAP 메시지를 전송

살펴본바와 같이 Direct Connect 방식이며 코딩량이 증가하나 자유롭게 구성이 가능한 장점이 있다.

서비스 해석를 해석하기 위한 인터페이스가 정의 되어 있지 않다면 요청 서비스해석 또는 요청 결과 수신 처리시 로직 및 코드가 많아진다.

과거에는 SAAJ와 JAXM이 분리되어 구분 되었으나 현재는 SAAJ가 JAXM을 포함하고 있다./*그러나 패키지는 여전히 javax.xml.soap과 javax.xml.messaging로 분리되어 있다.*/

1.3.7. JAXM
Java API for XML Messaging  비동기적인 웹 서비스 구현을 위한 API 이다.

1.3.8. JAXP
Java API for XML Processing - javax.xml.parsers

DOM 또는 SAX의 표준 처리를 위해 Sun에서 제안한 표준으로 개발 환경에 종속적이지 않은 표준처리가 가능하게 해준다./*코드레벨 변경 발생하지 않음*/

DOM(Document Object Model) 및 SAX(Simple API for XML) 파서를 생성하여 XML 문서를 해석하고 처리한다.

디폴트 파서로 Apache Group 의 Xerces 2 파서를 사용한다

XSLT(XML Stylesheet Language Transformations) 관련 API도 포함하고 있기 때문에 Apache Group의 Xalan 엔진을 사용해서 XSL문서를 이용해서 XML 문서를 변환

웹 서비스 응용프로그램 개발할 때 직접적으로 개발자가 JAXP로 프로그래밍을 하지 않지만 내부적으로 다른 API들이 XML 문서를 해 석할 때 때 JAXP를 이용한다./*웹서비스 시스템 및 웹서비스 틀라이언트 프로그램 쪽에 반드시 있어야 할 API*/

1.3.9. JAX-RPC
웹 서비스 시스템 및 웹 서비스 클라이언트를 개발하기 위한 Java API로 JAX-RPC API 또는 JAX-RPC Runtime 라고 한다.

XML RPC를 위한 자바 API(JAX-RPC)를 제공하여 원격 프로시저 호출(RPC)을 실행할 수 있게 한다.

JAX-RPC는 SOAP 프로토콜의 순수한 자바 버전을 구현 이며 XML-based protocol인 SOAP을 사용 한다.

JAX- RPC는 클라이언트 측의 플랫폼과 프로그래밍 언어에 구애받지 않는 웹 서비스 구현이 가능하고, 자바 언어 이외의 프로그래밍 언어 로 작성된 웹 서비스 시스템의 원격 프로시저를 호출 할 수 있으므로 상호 운용(interoperability)을 보장한다.

요청과 응답에 기반한 SOAP 메시징 방식으로 비동기적인(asynchoronous) SOAP 메세징 방식은 지원하지 않는다./*말그대로 RPC 이다*/

원격 클라이언트에 의해 호출될 수 있는 원격 프로시저의 기능을 포함한 서블릿(Servlet)으로 작성된 웹 응용프로그램(WAR) 이다.

J2EE 1.4 스펙에서 JAX-RPC를 지원하고 일반적으로 무상태 세션빈(Stateless Session Bean)을 이용해서 웹 서비스를 구현할 수 있다.

wsdeploy 기능으로 서버측 Tie 클래스및 WSDL을 생성하며 WAR 모듈에 자동 추가 한다./*타이 클래스 생성을 위해서는 RMI interface 배치 기술자인 jaxrpc-ri.xml을 작성 해야한다*/

wscompile 기 능으로 WSDL을 참조(해석)하여 웹 서비스 시스템의 인터페이스 및 구현 클래스를 생성 한다./*stub 클래스 생성 (config.xml 문서 필요). 당연한 얘기지만 stub의 java 코드생성 포 함 wscompile -gen:client  -keep -d . config.xml */

다음과 같은 3가지의 클라이언트 호출 모델 적용 가능

- 정적 스텁 호출 모델은 WSDL 문서를 이용해서 수동으로 생성된 스텁 클래스를 이용해서 원격 프로시저 호출
- 동적 프록시 호출 모델은 수동으로 스텁 클래스를 생성하지 않고 실행 도중에 스텁 객체가 생성/*인터페이스는 생성되어 있음!!!*/
- 동 적 호출 인터페이스(Dynamic Invocation Interface:DII)은 원격 인터페이스를 알지 못해도 Call 객체 이 용하여 동적으로 원격 메소드를 호출 할 수 있다./*당연히 원격 프로시저명과 인자에 대한 정보는 알아야 하며 이는 RMI DCL 과 동일한 메커니즘 이다*/

내부적으로 JAXP, SAAJ를 이용하여 SOAP 메세지를 생성, 전송, 해석하는 역할 수행 한다.

1.3.10. JWSDP
Java Web Services Developer Pack 은 Sun사에서 배포 하는 XML 응용프로그램과 웹 서비스 시스템 및 웹서비스 클라이언트 개발 지원 하는 API를 포함하는 통 합 개발 툴킷 이다./*1.1 버전에서는 메시지 기반의 비동기적인 웹 서비스 시스템을 개발할 수 있는 JAXM이 포함되어 있으 나 JWSDP 1.2 부터는 JAXM이 포함되지 않는다.*/

JWSDP는 다음 API들을 포함한다.
- Java API for XML Biniding(JAXB)
- Java API for XML Messaging(JAXM)
- SOAP with Attachments API for Java(SAAJ)
- Java API for XML Processing(JAXP)
- Java API for XML Registries(JAXR)
- Java API for XML-based RPC(JAX-RPC)
- JavaServer Pages Standard Tag Library(JSTL)
- Tomcat
- ANT
- Registry Server(Java WSDP Registry Server는 Java로 만든 테스트용 UDDI 레지스트리. 테스트 버전이므로 UDDI 스펙을 전부 만족하지 못함)
JWSDP는 SOAP 엔진 부분에서 다시한번 다룬다.

2. XML
XML은 확장성 마크업 언어(Extensible Markup Language)를 뜻하며, 플랫폼에 얽매이지 않는 간단한 텍스트 문서 이다.

XML은 인간과 컴퓨터가 모두 같은 정도로 용이하게 XMl 문서로 표현된 데이터를 읽거나 사용하는 것을 가능하게 하는 자체 기술적인 언어이다.

SGML(Standard Generalized Markup Language)에 기초를 두며 SGML의 강력했으나 복잡한 언어였던 문제점을 단순화 하여 문서를 작성하는데 강력한 방법을 제공한다.

태 그 내에 추가 정보를 끼워 넣고, 유효성을 검사할 수 있는 메커니즘을 제공한다./* 주민등록증이나 신용카드, 또는 요즘 주로 사용 되는 온라인 증명발급에서의 진위확인 및 유효성 확인 정도로 이해해 보면 효용가치가 얼마나 높은지 알 수 있다 */

Well- Formed XML Document는 XML 1.0 권고안에 언급되어 있는 문법을 지켜서 작서된 문서 이 며, Valid Document는 Wel-Formed 이면서 XML로 개발된 특정 마크업 언어에 맞게 작성된 문서 이다.

Apache Well- formed Validate Pack(Xerces Parser), IEXMLTLS(Explorer용 XML 검증기 플러그인)등 을 통해 처리할 수 있다./*SPY, Validation.bat(이게 어디API 구분인지 확인할 것), 기타 IDE로도 수행…*/

XML은 텍스트에 기반하고 있으므로 HTTP상으로 전송될 수 있으며 방화벽과 프록시 서버도 쉽게 통과 할 수 있다.

자체 정의가 가능하므로 프로그래밍 언어에 독립적으로 데이터를 교환(상호 운용성) 할 수 있다. XML 1.0 권고에 의해 공식 문법을 간단한 EBNF(Extended Backus-Naur Form) 표기법을 사용 한다.

/*XML 스터디 자료로는 SUN 교육 XML with Java KR-SL-024  강의자료가 가장 좋다.*/

2.1. XML 문서 처리
XML 문서를 만들어내고 사용하기 위한 문서 객체 모델(Document Object Model, DOM)과 SAX(Simple API for XML) Parser가 있다.

JAXP(Java API for XML Processing)는 XML 파서 밴더들에 종속적이지 않은 XML 응용프로그램을 위한 API 이다.

DOM과 SAX는 모두 인터페이스와 예외라는 API를 정의 한다. DOM과 SAX를 사용하기 위해서는 각각의 인터페이스를 구현 클래스들이 필요하다./*이미 구현해서 제공되는 Xerces 파서와 같이 성능좋은 파서들이 있다*/

2.1.1. DOM
DOM은 XML 문서를 트리 객체로 다루는 API로 W3C의 추천을 받은 것이다. DOM은 XML 문서를 통째로 메모리상에 올린 다음 엘리먼트나 속성들을 추가, 삭제, 수정할 때 XML 문서 구조를 다룰 수 있다.

초기 DOM 스펙은 HTML의 다양한 엘리먼트들을 트리 객체의 일부로 다룰수 있도록  하며 HTML 문서에 간편성을 제공하기 위한 것이었다./*IEDEVToolbar 의 DOM 기능 보여줄 것*/

DOM 레 벨1이 1998년 중반에 W3C의 추천을 받았으며 2000년 후반에 XML 네임스페이스를 위한 중요한 보완이 이루어진 DOM 레 벨 2가 추천된다. DOM 레벨 3가 현재 작업중 이다./*Xerces는 레벨2 모듈을 모두 지원하며 시험적으로 레벨 3를 지원한 다*/

2.1.2. SAX
xml-dev 메일링 리스트 회원들이 1998년 중반에 SAX 1.0 API를 정의한 이후 현재 2.0까지 발전해 왔으며 2.0에서 네임스페이스를 포함하여 발전되었다.

JDK에서는 rt.jar에 lib를 제공하고 v1.4 이후 부터는 Crimson(SAX Parser)으로 제공한다.

Xerces Parser는 Crimson Parser를 Sun 에서 Apache에 의뢰 하여 Open Source로 개발된 Parser 이다.

초기에는 Crimson 성능이 좋았으나 Xerces의 버전업이 빠르고 성능이 좋아졌다.

Crimson 1.4와 1.5 버전에서 한글문제를 처리하고 버전이 다르나 1.5 에서는 Xerces 패치본으로 Crimson을 제공(1.5이후 버전은 Crimson과 Xerces는 동일하다)

SAX는 XML문서를 파싱하는데 있어서 이벤트가 발생하면 접근하는 것을 제공한다.

DOM방식과 달리 문서 전체를 메모리에 올리지 않으나 XML 문서를 순서대로 파싱하며, 파싱중 이벤트를 전달 하므로 응용프로그램은 파서에서 SAX API를 이용해 제공되는 콜벡 인터페이스의 구현을 등록할 수 있다.

SAX 2.0 파 서 클래스는 org.xml.sax.XMLReader 인터페이스의 구현이 필요하나 역시 일반적으로 파서 제작사들이 제작한 이 인터페 이스를 구현한 클래스들을 확장해서 사용한다./*Xerces org.xml.sax.helpers.DefaultHandler, 파 서 제작사의 의존성을 줄이기 위해 일반적으로 SAX 지원 패키 지 org.xml.parser.helper.XMLReaderFactory를 사용해서 팩토리 기반으로 파서를 생성한다*/

커다란 문서의 처리에 적합하며 DOM에 비해 처리속도가 빠르다.

2.1.3. SAX vs DOM
DOM은 사용하기 쉬운 인터페이스를 제공하며 데이터 조작이 가능하나 속도가 비교적 느리고 전체 문서가 메모리에 적재되어야 하는 단점이 있다. 반면에 큰 문서를 다루는데 더 좋은 방법은 SAX를 이용하는 것이다.

SAX와 DOM간의 Parsing 절차는 다음과 같다.
SAX 방식
1. JAXP를 활용하여 JAXP가
  1.1 SAXParserFactory를 생성
  1.2 SAXParserFactory로 SAXParser를 얻음
2. SAX 사용
  2.1 EventHandler를 작성
  2.2 Parsing

3 XML Document Processing/*SAX Parser의 Event During Parse에 의해서 Handler가 XML Document Processing*/

DOM 방식
1. JAXP를 활용하여 JAXP가
  1.1 DocumentBuilderFactory
  1.2 DocumentBuilder/*Parser라 하지 않고 Builder라 칭한다*/
  1.3 Builder가 XML Document Processing

2.1.4. JAXP
JAXP(The Java AI for XML Processing)는 SAX나 DOM 응용프로그램을 쓰는데 있어서 제작 회사에 독립적으로 사용가능하게 표준 인터페이스를 정의한 것으로 파서 변경과 작업에 있어서 독립성을 보장한다.

DOM 과 SAX 파서를 각각 감추는 포장 역할을 수행하며 XML 변환도 지원한다./*SAXParserFactory 클래스 는 SAXParser 인스턴스를 만드는데 필요한 메소드를 제공하며 SAXParser 클래스는 SAX XMLReader 인터페이스 를 감싸는 역할을 한다*/

2.2. NameSpace
하나의 XML 문서가 하나 이상의 소스에서 온 마크업을 포함할 때 발생하는 이름이 충돌하는 문제를 해결한다.

웹 서비스를 기술하는 웹 서비스 기술 언어(WSDL) 문서와 웹 서비스의 요청과 수락을 나타내는 SOAP 봉투에 광범위하게 사용된다.

네임스페이스는 이름에 유일한 URI로 부여된 접두사를 붙임으로 엘리먼트와 속성의 이름의 모허성 문제를 해결한다.

2.3. Contents Type
2.3.1. DTD
Document Type Definitions./*가장 좋은 샘플인 web.xml에 사용된 DTD 한번 분석해보고 외운다 생각하고 1시간 공들여 보면 도움도 많이되고 DTD 득도한다.*/

2.3.2. XML Schema
문서 원형 정의(Document Type Definitions, DTD)의 단점들을 보완한 것으로 XML 문서 내용을 표현하는 규범을 정한 구조 정의 언어(스키마 언어) 이다.

2001년 5월 XML Schema 1.1 W3C 권고안 채택 되었다.

스키마 문서에 정의된 구조대로 작성된 XML 문서를 스키마 인스턴스(Schema Instance)라 한다

DTD 는 문자 데이터(#PCDATA)형만 지정 가능했던 것에 비해 스키마에 built-in(미리 정의된) 심플 타입을 사용 할 수도 있고 사용자가 정의한 심플 타입을 사용할수 있다.

EBNF 표기법 숙지하고 있으면 DTD에서 확장 이해하는데 크게 무리가 없다.

/*
minOccurs, maxOccurs 생략되면 디폴트 각각 1,  unbounded 는 무한대
엘리먼트는 자식 엘리먼트 및 속성을 가지는 엘리먼트 데이터 타입으로 사용
엘리먼트는 자식 엘리먼트들이 선언된 순서 지시
엘리먼트는 데이터 타입을 기술하면서 속성을 정의할때 과 같이 상용되며 extension의 base 데이터 타입을 기술한다.
사용자 정의 심플 타입
요정도로만 생소한 엘리먼트 살펴보자.
*/

2.4. XML Protocol
원격 프로시저의 요청과 응답을 나타내는 XML을 사용하기 위한 XML RPC 와 SOAP 프로토콜 사용할 수 있다.

2.4.1. XML-RPC
XML-RPC는 원격의 프로시저 호출을 나타내는 스펙이다. XML-RPC는 국제표준은 아니나 HTTP 터널을 통해서 원격 프로시저 호출을 구현하는 표준에 버금가는 수준으로 볼 수 있다.

HTTP를 타고 가기 때문에 방화벽을 통과할 수 있다./*JRMP나 IIOP 같은 바이너리 프로토콜은 방화벽을 뚫을 수가 없다*/

XML-RPC를 구현한 http://xml.apache.org/xmlrpc는 XML-RPC를 사용하는 클라이언트와 서버 코드를 위한 프레임워크를 제공한다.

2.4.2. SOAP
SOAP은 텍스트 기반 프로토콜로 XML을 이용하여 환경에 의존적이지 않다.

3. 웹 서비스 구현

3.1. SOAP 엔진
웹 서비스 구현을 위한 서버 쪽과 클라이언트 쪽의 SOAP 애플리케이션의 개발을 도와주는 자바 클래스들의 집합이다.

실제로 SOAP 엔진은 다음과 같은 기능을 수행한다.
- 메소드 호출을 SOAP 패킷으로 직렬화
- SOAP패킷을 자바 호출로 역직렬화
- XML 문서를 SOAP 패킷으로 포장
- XML 문서를 SOAP 패킷에서 추출
- SOAP 요청을 보내고 응답을 다룸
- SOAP 요청을 받아들이고 응답을 보냄
Java 웹 서비스 개발시 주로 사용되는 SOAP 엔진은 다음과 같다.
- Apache SOAP 2.2

아파치 SOAP 엔진으로 WSDL과 같은 최근의 기술을 지원하지 않는다.
- Apache SOAP 3.0

Apache SOAP 3.0 엔진은 AXIS(Apache eXtensible Interaction System)로 알려져 있기도 하다.
이 엔진은 완전히 새로 작성되었기 때문에 실제로는 아파치 SOAP 엔진의 다음 버전이 이니다.
- Web Services Developer Pack

웹 서비스와 관련된 여러 가지 기술들의 묶음으로 예를들면, JAX-RPC를 사용할 수 있고 문서 스타일의 soap에 대해서는 JAXP를 사용할 수도 있다
- IBM Web Services Toolkit(WSTK)

IBM에서 제공되는 웹 서비스와 관련된 여러 가지 기술들의 묶음이라는 면에서 WSDP와 비슷하다. 이 툴킷은 AXIS를 SOAP엔진으로 사용한다.
- IBM WebSphere SDK for Web Services(WSDK)

IBM의 더 ‘공식적인’ 웹 서비스 꾸러미 이다. 역시 AXIS와 함께 사용하며 Xerces/*Xerces Parser*/, 사설 UDDI 등록기, 테스트 데이터베이스, WebSphere 웹 서버 등의 많은 컴포넌트들과 묶여있다.

.1.1. AXIS
Axis는 XML RPC를 구현한 API로 W3C의 SOAP 제안을 아파치(apache)에서 구현한 것이다.

다음은 Axis의 주요 항목 이다.

- Axis는 벤더 중립적(vendor-neutral)으로 제공된다
- Axis는 여러 벤더들이 채택해 왔다. IBM의 WSTK, Macromdeia의 JRun등의 일부로 Axis 구현을 사용한다.
- Axis는 JAX-RPC의 구현을 제공한다.
- Axis 는 맞춤화에 있어서 유연성을 제공하는 확장 가능한 구현을 제공한다./*예를 들어 웹 서비스 제공시 서비스가 아닌 클래스로 웹 서비 스 제공. 클래스를 웹 서비스로 변형하기 위해서는 아무것도 특별한 것이 필요하지 않다는 점*/

참고로 Axis에는 tcpmon(TCP 모니터)이라는 유용한 유틸리티가 있다. 웹 서비스 클라이언트와 웹 서비스 간의 TCP 터널(tunnel)을 확인할 수 있다.

3.1.2. JWSDP
Java Web Services Developer Pack
http://java.sun.com/webservices/downloads/webservicespack.html 
/*JBuilder에서 대충 찍찍 끌어 샘플 웹서비스 작성해서 보여줄 것*/

4. 웹 서비스 데이터 전송
웹 서비스 클라이언트와 서버 사이에 XML ans서 형식의 데이터가 교환되었다는 사실은 별로 중요하지 않다. 사실 RPC 모델 기준으로 JRMP와 같은 다른 프로토콜을 사용하여 구현할 수도 있다.

4.1. RPC-SOAP vs Document-SOAP
RPC 스타일의 SOAP 개발에서 클라이언트가 원격 메소드를 호출해서 웹 서비스가 서버에 하나 생성되게 한다. 클라이언트는 하나의 SOAP 요청을 전달하고 SOAP 응답을 받아 처리한다.

문서 스타일 SOAP 개발에서는 클라이언트가 XML 문서를 서버에게(웹 서비스가 인스턴스화된) 전달된다. 마찬가지로 하나의 SOAP 요청을 전달하고 SOAP 응답을 받아 처리한다.

그 러나 내부적인 관점에서 보면, 직열화와 역직열화(Serialization and De-serialization)의 차이가 있 다. 문서 스타일의 SOAP 개발에서 클라이언트는 자바 호출을 직열화할 필요가 없고, 인자로 XML 문서를 주면 된다. 거꾸로 서 버는 XML 문서를 자바 호출이나 데이터 타입으로 역직렬화할 필요가 없다.

RPC 스타일의 SOAP 개발에서는 클라이 언트는 인자를 가지는 메소드를 호출하고 서버는 응답으로 하나의 값을 반환하는 방식이므로 클라이언트와 서버가 잘 정의된 프로그래 밍 모델로 만들어져야 한다./*당연한 얘기지만 C/S간 구체적인 인터페이스 프토토콜이 정의되고 구현해야 한다.*/

문서 스타일의 SOAP 개발에서는 XML 문서가 교환되고 각각의 엘리먼트의 의미는 서버와 클라이언트가 해석 한다./*처리 모듈을 작성해야 하나 요청과 응답을 위한 복합적인 문서 꾸러미로 묶을수 있다.*/

- 문서 스타일의 모델은 SOAP 엔진에 대한 의존도가 낮다.
- 직렬화/역직렬화 단계가 없기 때문에 개발이 단순해지고 RPC 방식을 사용할 때 보다 처리 시간이 단축된다.
- XML 문서는 RPC 보다 표현력이 다양하다.
- 두 개 이상의 데이터를 상호간에 교환할 때 적절하다.
- 응용프로그램에서 다른 응용프로그램에 데이터를 전달할 때 사용한다 문서 스타일 사용.
- XSLT가 자동으로 문서를 변환하므로 XML 문서를 XSLT로 다루는 응용프로그램의 경우 사
RPC 모델에서 클라이언트는 원격 호출 프로시저에 패러다 임을 한정하지만, 문서 스타일의 모델에서 클라이언트는 XML 문서를 통해서 표현될 수 있는 것에 한정하므로 보다 표현력이 다양 해 진다. 그러나 이러한 자유는 요청과 응답의 의미를 정의하는 것을 필요로 한다.

문서 스타일 방식에서 직렬화는 개발자에게 그 책임이 남게되고 XML 문서의 크기가 간단한 요청-응답 유형보다 훨씬 큰 문서일 경우를 고려할 때 빠르다고 볼수 없다.

5. 웹 서비스 호출

5.1. 웹 서비스 호출 모델
웹 서비스는 의사 소통의 프로토콜로 SOAP을 지원하는데 배타적으로 만들어지지 않았다.

이 것은 실제 작성대상인 클라이언트 코드가 웹 서비스의 인터페이스 정의에 기반을 두고 있다는 것을 의미하지, 실행 시에 기반해 있다 는 것을 의미하지 않는다. 반대로 해석하면 만약 클라이언트가 실행되는 같은 주소에 서비스가 존재 한다면 데이터를 모아서 정렬할 이 유가 없다.

그러나 다른 경우에서 SOAP은 서비스를 접근하는 유일한 방법일 수도 있다. 예로 단넷 플랫폼에서는 의 사 소통 프로토콜로 HTTP 위의 SOAP만을 지원한다. 그러므로 닷넨을 이용한 인트라넷 또는 인터넷에서 구현된 서비스의 장접 을 원한다면 SOAP이 유일한 선택이 된다.

웹 서비스 의사 소통을 위한 프로토콜은 SOAP을 활용하는 정적인 호출 모델, 동적인 호출 모델 이 으며(웹 서비스 호출 모델) SOAP을 사용여부를 포함한 JAX-RPC 방식과 비 SOAP 웹 서비스 방식이 있다.

5.1.1. 정적인 호출 모델
WSDL을 참조하여 클라이언트 프록시/스텁(클라이언트 쪽의 객체)을 직접 미리 생성 하는 방식으로 지금까지 살펴봐왔는 내용들이다.

5.1.2. 동적인 호출 모델
서비스 호출 시점에 WSDL을 참조하여 클라이언트 프록시/스텁을 생성 하는 방식 클라이언트 프로그래머는 서비스를 사용하는 데 SOAP에 대한 자세한 정보를 알 필요가 없다는 것을 의미한다.

5.2. JAX-RPC
/*앞서 JAX-RPC에 대해 자세하게 살표 보았지만 이장에서는 웹 서비스 호출 관점에서 좀더 살펴 본다*/

JAX-RPC의 주 목적을 한 문장으로 표현한다면 WSDL port-type 정보를 자바나 다른 것들로 바꾸는 규칙을 정의한 API라고 할 수 있다.

JAX-RPC는 웹 서비스를 호출하는데 사용되는 프로토콜을 독립적으로 사용하는 방법을 정의 한다.

앞 서 살펴본대로 SOAP을 통해 웹 서비스와 상호작용시 RPC 스타일(방식)과 문서 스타일(방식) 방법이 존재 한다. 호출 스타일 (방식) 맨 위에는 데이터를 SOAP 메시지로 인코딩/*의미 그대로 인코딩이 아닌, XML 묶음을 SOAP, 몸체에 추가 하는 것 을 인코딩이라 한다.*/ 하는 두 개의 주요한 방법이 있다. 하나는 문자 그대로 XML(literal XML)을 사용하는 것이다.

대부분의 경우에, 이 두 개의 조합으로 사용된다. 웹 서비스는 기본 SOAP 인코딩을 가지는 RPC 스타일 호출을 지원하거나 문자 그대로의 XML 인코딩을 가지는 문서 스타일의 호출을 지원한다.

JAX-RPC 스펙은 API의 구현시 두 개의 조합을 지원하라고 요구한다.

JAX- RPC 스펙에서는 두 스타일 사이간 인터페이스가 변하지 않는다고 정의 한다. WSDL  문서에서 정의한 스타일이 RPC스타일 또 는 문서스타일 이건간에 웹 서비스를 위한 RPC스타일로 만들어진 인터페이스, 웹 서비스를 위한 문서스타일로 만들어진 인터페이스 라 고 말할수 없다는 것이다./*물론 스타일의 차이는 실행시에는 엄격하게 다뤄진다*/

5.3. 비 SOAP 웹 서비스
서비스 호출하는 비 SOAP의 예로 RMI/IIOP나 JMS와 같이 다양한 프로토콜에 의해 이루어질수 있다. 지원되는 프로토콜은 WSDL의  엘리먼트에 서술한다.

6. 웹 서비스 공표
6.1. UDDI
6.2. WSIL
6.3. JAXR
7. 비동기적인 웹 서비스
7.1. JAXM(Java API for XML-based Messaging)
7.2. JMS(Java Message Service)

http://blog.naver.com/i1j1jsy/70013031234

'UP! > Web Service' 카테고리의 다른 글

분산객체 시스템(COM,COm+,DCOM,MTS)  (0) 2008.08.21
분산객체기술종류  (0) 2008.08.21
Web Service  (0) 2008.08.21
그리드 서비스를 위한 Repository 시스템 개발  (0) 2008.08.21
분산객체와 웹 서비스의 차이점  (0) 2008.08.21
Posted by 으랏차
,

Web Service

UP!/Web Service 2008. 8. 21. 14:10
I. 인터넷 표준기술을 이용하여 상호접속을 지원하는 서비스의 개요
. 서비스의 정의
- 인터넷 표준 프로토콜을 이용, 원격지에 있는 객체를 XML기반으로 접근/이용/재사용할 있는 환경의 분산 컴포넌트 모델
. 서비스의 특징
기업IT환경 통합용이
기업의 내외부 이질적 어플리케이션 통합
인터넷 표준기술 기반
HTTP, XML, SOAP, WSDL, UDDI 사용
개발 및운영 비용절감
분산 시스템간 통합을 자동화적으로 이행
플랫폼 독립적
플랫폼 선택 자유(유연한 소프트웨어 구조)
디바이스및위치 독립성
PC,PDA,핸드폰 다양한 유무선 단말기로 시간과 장소에 상관없이 서비스에 접근
 
II. 서비스를 구성하는 핵심 기술요소
기술요소
XML
-인터넷 데이터 교환의 표준방식
(구조화된 문서 전송할 있도록 설계)
WSDL
-Web Service Description Language
- 서비스기술(서비스명,/출력변수) 사용되는 표준 언어
UDDI
-Universal Description Discovery and Integration
-인터넷상에서 서비스를 등록 검색 기능 제공
SOAP
-Simple Object Access Protocol
-정보제공자와 소비자 사이에서 정보제공하는객체간 통신규약
 
 
III. 기업간의 서비스 이용절차 [그림1] 서비스 이용절차
     서비스를 제공하는 기업(기업A,B,C) 해당 서비스를  WSDL 사용하여 UDDI비즈니스
레지스트리에 등록한다. – publish
     서비스를 이용하려는 기업(기업C) 등록되어있는 서비스들 중에서 이용 가능한 서비스를 UDDI 통해
검색한다. – find
  검색된 정보를 바탕으로 SOAP 이용하여 (기업A) 접속한다.
  (기업A) 동일한 방법으로UDDI 통해 (기업C) 정보를 검색, 제공된 서비스의 기술사양이 맞을 경우,
SOAP 통해 이용자측(기업C) 제공자측(기업A) 상호 접속을 한다. – bind
 
IV. 서비스의 주요 플랫폼인 NET J2EE 비교
. 닷넷(.NET) 플랫폼:MS기반(표준을 정하고 타벤더에게 개방)
. J2EE(Java 2 Enterprise Edition):Java 기술 기반
. .NET J2EE 비교
구분
.NET
J2EE
Presentation
Tier
Client
ActiveX, MFC,C#
Applet, Java Bean
Server
IIS(웹서버데몬),
ASP.NET(웹처리언어)
HTTP(웹서버데몬),
Servlet(웹처리언어),
JSP(간이웹언어)
Biz Tier
COM+, SOAP,
BCL(기본구현Class)
EJB, RMI(통신)
CORBA(IIOP)(통신)
DB Tier
ADO.NET(DB연결),
MS-DTC(트랜잭션처리)
JDBC(DB연결),
JTA/TJS(트랜잭션처리)
-다중 개발 언어 지원
-높은 퍼포몬스
-OS 이식성 좋음
-Unix 지원
-OS제약(windows)
-Java 지원
-프리젠테이션처리난해
 
V. Web Service EAI(Enterprise Application Integration) 비교
. 기업의 어플리케이션 측면에서 통합을 유도하는 EAI 정의
- DW,CRM,ERP 기업내에서 운영하는 어플리케이션을 네트워크 프로 토콜이나 OS,DB 관계없이
비즈니스 프로세스차원에서 통합하는
. EAI시스템의 핵심사항
- 기존 어플리케이션간 데이터 교환: 표준화된 단일 허브 제공
새로운 어플리케이션 개발: 개방화된 기술제공
유연한 데이터 교환을 보장하는 컴포넌트 세트 구성
connector adaptor 통해 액세스
. Web Service EAI 비교
EAI
Web Service
-다양한 어플리케이션의 연동을 비즈니스 차원에서 통합
-플랫폼 개발언어에 관계 없이 어플리케이션을 연동 하는 기술에 기반한 서비스
대상
-주로 내부/외부 어플리케이션
(기존외부 어플리케이션 focus)
-주로 B2B 시스템
구현방법
-독자적 기술 사용
(EAI솔루션 도입)
-표준 기술 사용
(SOAP,UDDI,WSDL)
연결방식
-Point-to-Point
-Flexibility
연결형태
-Static
-API또는 환경설정을 통해 연결대상을 미리 정의
-Dynamic
-연결대상이 미리 정의되어 있지 않고 필요시 연결 가능
 
VI. 서비스의 비즈니스 통합 역할
. 전사적 IT통합 인프라로서의 SOA(Service Oriented Architecture)
- 애플리케이션 전체 또는 일부를 서비스 개념으로 인식, 서술언어를 사용하여 상호작용 방법을 정의하고
별도의 변환작업없이 사용 가능
-  기업의 시스템 통합의 인프라로 SOA 지배적일 것으로 예상
-  SOAP 기반의 서비스는 느슨한 통합(loosely couple) 연결로 가장 보편적인 SOA 구현
. 서비스의 비즈니스 통합 모형 [그림2] 서비스의 비즈니스 통합 모형
- 시스템을 서비스의 조합으로 인식(SOA 개념)
-  서로 다른 시스템에 있는 서비스를 사용하는 방식이 시스템내의 방식과 동일하게 구현
.   서비스의 비즈니스 통합 역할
SOA기반의 설계 방식
디바이스 플랫폼 독립성을 제공해 주는 XML 기술을 기반
 SOAP 통한 서비스 호출구조
기업내부 기업간 비즈니스 통합을 빠르고 효율적으로 수행
 
VII. 서비스의 전망
. MS SUN 진영의 대립으로 인하여 상호운용성의 문제가 해결되지 않고 있으며 이는 서비스의 기본 개념인 오픈 네트워크에 대한 이질적 시스템 통합 기능을 저해하고 있다.
. J2EE 1.4플랫폼은 업계의 자발적인 참여와 협의를 통해 일궈낸 표준을 기존에 이미 구축되어 있는 J2EE플랫폼 기반의 엔터프라이즈 시스템에 커다란 변경없이 빠르고 유연하게 적용할 있도록 하기 위해 툴과 보안, 관리개선기능 확장성 있는 개방형 아키텍처를 제시
. 기본적인 표준 외의 산업화를 위한 표준화 미비, 보안의 취약성, 안정성에 대한 검증, 선행 투자의 위험 등을 제기하고 있으므로 국제 표준 규약 선도및 연구개발 투자 등을 통해 국내기술을 확대/보급하여야 것이다.
. 서비스 확산시 기업간 상호운영 비용감소, 기업운영의 유연성 증대로 가상기업 또는 네트워크 기업으로 전환 기대.
. 서비스는 국내에서 레퍼런스 사이트 구축개발이 이루어지고 있으며, UDDI 레파지토리에 대한 기술이 개발되고 있다.

Posted by 으랏차
,
I. 제 목 그리드 서비스를 위한 Repository 시스템의 개발
 
II. 연구개발의 목적 및 중요성
본 연구개발의 목적은 표준 데이터 모델인 XML을 통 해 그리드 서비스의 발견 및 기술을 가능하게 하고 이의 결과로 통합된 형태의 그리드 서비스를 사용자에게 제공하기 위해 필수적인 시 스템인 UDDI(Universal Description Discovery and Integration)를 따르 는 Repository 시스템을 개발함으로서 기 존의 그리드와 웹 서비스의 접목을 통한 그리드 서비스의 활용증대에 기여 함에 있 다.
 
이와 같이 UDDI는 앞으로의 그리드 연구와 밀접한 연관 을 지닐 것으로 예상되고, 그리드가 개방성과 확장성을 획득해 감에 따라 그 중요성이 점차 커질 것으로 생각된다. 세계를 하나로 묶 고자하는 그리드 사상에 관한 국제적인 노력에 적극적으로 대응하면서 대용량의 서비스 데이터에 대한 신속한 검색 및 데이터의 관리 를 통해 전 세계를 엮는 초고속 그리드 망의 꿈을 실현시키기 위해서는 그리드 기술뿐만이 아니라 그리드 서비스들을 엮어서 통합된 서 비스를 제공할 수 있는 UDDI관련 기술에 대한 지속적인 투자와 연구개발이 필수적이라 할 수 있다.
 
III. 연구개발의 내용 및 범위
본 연구의 최종 연구목표는 그리드 서비스를 위한 Repository 시스템 개발이며, 이를 위해 제공해야할 기능을 세분화하여 4년에 걸쳐 단계적인 연구 및 개발을 수행하고자 한다.
 
제 1차년도에는 UDDI와 그리드에 대한 관련 조 사 및 연구를 수행하고, 데이타베이스와 시스템 아키텍처를 설계하여 Repository 시스템 개발의 기반을 구축한다. 그리고 데이 터의 기본 저장/검색 기능을 개발하여 Repository 시스템의 토대가 되는 기능을 제공할 수 있도록 한다.
 
제 2차년도에는 1차년도에서 개발한 기본적인 저장/검 색 기능을 바탕으로 다양한 질의조건 및 분류체계를 지원하는 확장된 검색과 추가적인 정보의 저장을 지원하는 확장된 저장 기능을 개발 한다. 그리고 데이터 변경 통보 기능을 추가한다.
 
3차년도에는 전년도 수행내용을 보완하고 데이터 분류 정 보 관리 기능, 데이터 보안기능 그리고 Repository 시스템 정책 기능을 추가하여 Repository 시스템의 운영 및 관리 를 수행할 수 있도록 한다. 제 4차년도에는 데이터 중복 기능과 이를 이용한 소유권 이전 기능을 개발하고 개발 된 Repository 시스템이 범용 DBMS를 지원하도록 확장한다. 그리고 최종적으로 개발된 시스템에 대한 테스트를 통해 안정 화 작업을 수행한다.
 
IV. 연구개발결과
본 연구개발은 2003년 4월 중순부터 시작하여 12 월 중순까지 8개월간 수행되었다. 먼저 UDDI 및 그리드 관련 연구 조사를 완료하여 Repository 시스템 개발의 토대를 마 련하였다. 그리고 관련 연구에 대한 조사 내용 및 분석 자료를 토대로 Repository 시스템이 필요로 하는 데이타베이스 스키마 와 SQL 질의문에 대한 확장성과 범용성을 고려한 설계 및 설계된 스키마와 SQL 질의문을 활용할 수 있는 서비스 기반 의 Repository 시스템 아키텍처를 설계하였다.
당해연도 중반부터는 시스템이 제공해야 하는 저장 및 검색 에 대한 기본적인 기능에 대한 개발을 시작하여 XML 기반의 그리드 서비스 정보에 대한 기본 저장 기능을 제공하고 저장된 그리 드 서비스 정보에 대해 빠른 검색 기능을 데모할 수 있는 프로토타입을 개발하였다. 그리고 기본 저장 및 검색 기능에 대한 프로토타 입 개발이 완료된 후, 개발한 시스템을 통해 기본 저장 및 검색 기능에 대한 설계를 개별적으로 검증하고 기능들 간 의 연동테스트 를 통해 기능에 대한 상호검증을 수행하였다.
마지막으로 설계된 시스템에 대한 문서화 작업을 수행하여, 개발된 시스템에서 사용하는 데이타베이스 스키마와 SQL 질의문 등에 대한 문서화작업을 수행하였다.
 
V. 연구개발의 활용에 대한 건의
기존의 그리드는 과학 기술 분야와 같은 한정된 분야에 서 사용되었다. 그러나, 최근 분산환경이 웹서비스 기반으로 변화함에 따라 그리드를 웹서비스 환경에서 사용하고자 하는 시도들이 많아 지고 있다. 이러한 시도중에 하나로 GGF(Global Grid Forum)는 웹서비스에 기반한 그리드 시스템의 아키텍처 인 OGSA(Open Grid Service Architecture)를 개발하고 있다.
본 연구를 통해 개발된 시스템은 이와 같이 웹서비스를 기 반으로 개발된 그리드 응용 서비스들의 위치들을 찾아 이를 활용하기 위해 사용될 것이다. 또한, Intelligent Agent기술 과 연계하여 그리드 응용 서비스들의 통합에 기여하는 기반 기술로서 활용 가능할 것으로 예상된다.
 
VI. 기 대 효 과
본 연구개발의 목표인 UDDI 를 따르는 Repository 시스템의 개발을 통해 서비스 기반의 그리드 응용에서 활용 가능한 서비스 정보에 대한 효과적인 검 색 기능을 제공하는 시스템을 확보할 수 있으며 그리드 서비스 정보에 대한 다양한 질의와 효과적인 검색을 가능하게 하여 그리드에 대 한 사용자의 편의성 증대 및 수요급증에 기여할 수 있을 것으로 예상한다. 그리고 타 Repository 시스템과의 데이터 공 유 및 Intelligent Agent 기술과의 연계를 통해 국제적인 그리드 서비스망의 구축에 기여할 수 있을 것으로 예상한다.

한국과학기술정보연구원(KISTI) , ., 2003  황규영

'UP! > Web Service' 카테고리의 다른 글

웹 서비스 개념 및 교육 내용  (0) 2008.08.21
Web Service  (0) 2008.08.21
분산객체와 웹 서비스의 차이점  (0) 2008.08.21
분산객체시스템 종류  (0) 2008.08.21
웹 서비스와 관련된 10가지 질문  (0) 2008.08.21
Posted by 으랏차
,