2009. 8. 27. 15:28

[출처 : 펜타소프트(http://www.penta.co.kr/)]

1. Web Services 개념

Web Services란 XML을 기반으로 하는 공개 표준들을 이용해서 인터넷 기반의 분산 컴퓨팅 환경에서 원격 메소드를 호출하여 사용할 수 있는 재사용 가능한 소프트웨어 컴포넌트를 일컫는다. Web Services를 이용하면 웹을 통한 원격 프로시저 호출(RPC : Remote Procedure Call)이 가능해 진다. Web Services를 간단히 표현하면 웹으로 공개된 메소드라고 할 수 있다. 메소드가 웹으로 공개되어 있다고 했을 때, 그러한 웹 메소드가 서비스 제공자와 사용자 사이에서 효율적으로 사용되어지기 위해서는 다음과 같은 몇 가지 요구사항이 만족해야 한다. 우선 사용자들이 특정 웹 메소드를 사용하고자 할 때, 우선적으로 어떤 메소드가 어떤 서비스 제공자에 의해서 어디에서 서비스 되고 있는지 검색할 수 있어야 한다. 특정 서비스를 검색한 다음에는 해당 메소드가 어떤 역할을 수행하며, 어떤 형태의 입력 값과 어떠한 형태의 결과 값을 반환하게 되는가 등의 상세한 메소드에 대한 설명 즉, 서비스에 대한 정보를 필요로 하게 된다. 마지막으로 서비스를 검색하고 해당 서비스에 대한 정보를 알게 되었다면, 서비스 요청자가 어떠한 형태의 서비스 요청 메시지를 서비스 제공자에게 보내야 하고, 어떤 결과 메시지를 받아야 할지에 대한 일련의 프로토콜이 정해져야 한다. 이러한 요구 사항에 대해서 Web Services는 3가지 XML 기반의 표준을 가지고 있는데, 바로 SOAP(Simple Object Access Protocol), WSDL(Web Services Description Language), UDDI(Universal Description, Discovery and Integration)이다. SOAP은 Web Services 제공자와 Web Services 요청자 사이에서 주고받는 메시지의 형식을 정의한 메시지 교환 프로토콜이고, WSDL은 해당 Web Services에 대한 상세한 설명을 포함하고 있는 서비스 명세이다. 그리고 UDDI는 Web Services를 등록하고, 검색할 수 있는 일종의 Web Services 레지스트리에 대한 명세이다. 이러한 SOAP, WSDL, UDDI 등 Web Services와 관련된 표준들은 XML을 기반으로 한 공개 표준들로, SOAP과 WSDL은 월드 와이드 웹에 관련된 표준을 관장하는 W3C에서 관리되고 있으며, UDDI는 ebXML로 잘 알려진 OASIS에서 관리되고 있는 표준 명세이다.


[ Web Services 구조]

Web Services의 구조는 앞서 설명한 바와 같이 SOAP, WSDL, UDDL라고 하는 3가지 XML 기반의 공개 표준을 바탕으로 하고 있다. 위 그림은 이러한 Web Services의 3가지 관련 표준들이 어떻게 상호 관계하여 Web Services를 가능하게 하는 기반을 제공하는지를 표현하고 있다.

SOAP(Simple Object Access Protocol)

SOAP은 Simple Object Access Protocol의 약자로 분산 환경에서 HTTP 등의 통신 프로토콜을 이용하여 XML 기반의 RPC 호출 메커니즘을 제공하기 위한 2세대 XML 프로토콜로, 최초 마이크로소프트 사에서 자사의 DCOM 기술을 보완할 목적으로 설계되었다. SOAP은 서비스 제공자와 사용자 사이의 교환 내용을 최소화한 경량(Light Weight)프로토콜이며, 마이크로소프트 사에서 자사의 DCOM기술을 보완할 목적으로 최초 개발되었다. 하지만 마이크로소프트 사는 자사 기술 의존적인 부분을 제거하고 1.1 버전을 2000년 3월에 월드 와이드 웹 컨소시엄(이하 W3C)에 제출하며 공개하였다. 그 후 SOAP은 XML 프로토콜의 표준으로 자리 잡았고, 최근 1.2 버전이 W3C Recommendation 으로 승인되었다.

WSDL(Web Services Description Language)

SOAP이 등장하면서 웹상에 존재하는 메소드를 호출할 수 있는 방법이 제공되기 시작했지만, 해당 서비스가 어디에 존재하고, 어떤 SOAP 메시지를 만들어 보내야 할지, 그리고 어떤 결과 값을 반환하는지 등 서비스에 대한 자세한 명세를 제공할 필요성이 있었다. 이러한 Web Services에 대한 설명을 기술할 수 있도록 고안된 것이 WSDL(Web Services Description Language)이다. 한마디로 WSDL은 Web Services에 대한 인터페이스 명세서라고 볼 수 있다. WSDL에 포함되어 있는 내용은 해당 서비스가 하는 일은 무엇인가에 대한 내용, 그리고 서비스에 대한 접근 방법과 구체적인 서비스의 위치 등이다. 서비스 요청자는 서비스 제공자가 공개한 해당 Web Services의 WSDL을 보고 적절한 SOAP 메시지를 작성할 수 있다. WSDL은 마이크로소프트 사의 SDL(Service Description Language)와 SCL(SOAP Contract Language)과 IBM의 NASSL(Network Accessible Services Specification Language)을 결합하여 개발된 것으로 SOAP과 마찬가지로 W3C에 제출되어진 공개 표준이다. 현재 1.2 버전이 W3C Working Draft 단계에 있다.

UDDI(Universal Description, Discovery and Integration)

앞서 설명한 SOAP과 WSDL만을 사용하여도 충분히 Web Services가 구현되어 질 수 있다. 하지만 Web Services가 대중화되기 위해서는 서비스를 요청할 소비자가 특정 서비스를 원할 때, 누가 어떤 서비스를 제공하고 있는지에 대한 정보를 쉽게 얻을 수 있는 방법이 더 필요할 것이다. 특히 Web Services를 제공하는 업체의 관점에서 볼 때, Web Services를 등록하고 검색할 수 있는 레지스트리의 존재는 그 무엇보다 중요한 요소가 될 것이다. Web Services의 확산을 목적으로 IBM, Ariba, 마이크로소프트를 중심으로 주요 산업계 리더들이 UDDI 프로젝트를 설립하고 Web Services를 위한 레지스트리의 표준인 UDDI 1.0 버전을 발표하였다. 그 후 많은 업체들이 추가되어 현재 300여개의 업체들이 UDDI 커뮤니티에 참여하고 있다. 하지만 이들은 2002년 6월 UDDI 버전 3.0을 발표하면서, 표준화에 대한 작업 일체를 ebXML로 잘 알려진 OASIS에 일임하였고, 그리하여 이제 UDDI의 표준화는 OASIS에서 담당하고 있다. UDDI는 크게 공용 UDDI와 사설 UDDI로 나누어진다. 공용 UDDI는 흔히 UBR(Universal Business Registry)라고 불리며, 누구나 접근해서 검색할 수 있다. 공용 UDDI는 UDDI 오퍼레이터 노드라고 불리우는 업체들에 의해서 운영되어 지고 있는데, 현재 UDDI 2.0 표준을 준수하는 공용 UDDI의 오퍼레이터 노드는 IBM, 마이크로소프트, SAP, NTT-Com이다. 이들은 각자 UDDI를 운영하고 있지만, 등록 데이터를 12시간 간격으로 서로 복제하여 공유하기 때문에, 논리적으로는 하나의 거대한 UBR로서 존재하게 된다. 반면, 사설 UDDI는 한 기업이나 단체에서 자체적으로 사용할 목적의 UDDI를 일컫는다. UDDI는 Web Services에 대한 등록 정보를 UDDI 정보모델이라 일컬어지는 XML 데이터로 저장한다. 저장하는 데이터는 제공하는 서비스에 대한 정보, 그리고 정보를 제공하는 업체에 대한 정보, 해당 서비스와의 연결에 이용되는 정보, 그리고 서비스의 기술적인 정보들이 포함되며, 해당 서비스와 업체에 대한 표준 분류 코드를 지원하여 효율적으로 검색할 수 있게 하고 있다.

 

2. 웹 서비스 컴포넌트 생성하기

- 시작하기전에 준비되어야 할 사항들

l        Easerver 5 (52025) 및 PowerBuilder 10 (8050)
l        EAServer를 사용할 수 있도록 동작시킨다.
l        파워빌더에서 EAServer Profile을 정의하고, 연결 테스트를 마친다.
l        EAServer Profile은 Host = localhost, http port = 8000으로 환경을 설정한다.

1. 파워빌더 10을 실행시키고, 새로운 Workspace를 추가한다.
2. EAServer Component 타입으로 Target을 만든다.


3. 선택 후, Next를 눌러 다음 화면에서 Application Name을 지정해준다.

4. PowerBuilder Object Name을 n_pbhello로 지정해준다.

5. EAServer Component Name도 역시 n_pbhello로 지정한다.

6. EAServer Profile은 서버에 연결되어있는 것을 사용해라.

7. Package Name은 mywebservices로 지정한다.

8. 이후 정보는 기본 정보를 두고, Next를 선택한다.
    Poject 이름을 정하는 부분도 기본값으로 두고 Next를 누른다.

9. 정보를 확인 후, Next를 누른다.

10. Finish를 눌러 EAServer 컴포넌트를 생성하기 위한 준비작업을 완료한다.

11. 설정이 완료되면 System Tree에 생성된 오브젝트를 확인 할 수 있다.

12. n_pbhello에 함수를 추가하고 아래 정보와 같이 설정 한다.

l        함수 이름 : of_hello
l        리턴 타입 :  String
l        Argument :  타입 : String, 이름 : asname
l        코드 : return "Hello " +asName + " from PB Web Service";



13.  설정이 완료되면 배포를 해준다.

14.  배포가 완료 되면, EAServer 컴포넌트를 위한 Stubs를 생성한다. 생성하기 위해 EAServer Manager를 실행시킨다.


3. 웹 서비스 컴포넌트 생성하기

l        파워빌더에서 웹 서비스 컴포넌트를 생성하기 위해서, 다음의 단계를 실행한다.

1. 파워빌더 10을 실행시키고, 새로운 Workspace를 추가한다.
2. EAServer Component 타입으로 Target을 만든다.


3. 선택 후, Next를 눌러 다음 화면에서 Application Name을 지정해준다.

4. PowerBuilder Object Name을 n_pbhello로 지정해준다.

5. EAServer Component Name도 역시 n_pbhello로 지정한다.

6. EAServer Profile은 서버에 연결되어있는 것을 사용해라.

7. Package Name은 mywebservices로 지정한다.

8. 이후 정보는 기본 정보를 두고, Next를 선택한다. 
       Poject 이름을 정하는 부분도 기본값으로 두고 Next를 누른다.

9. 정보를 확인 후, Next를 누른다.

10.  Finish를 눌러 EAServer 컴포넌트를 생성하기 위한 준비작업을 완료한다.

11.  설정이 완료되면 System Tree에 생성된 오브젝트를 확인 할수 있다.

12.  n_pbhello에 함수를 추가하고 아래 정보와 같이 설정 한다.
l 함수 이름 : of_hello
l 리턴 타입 :  String
l 아귀먼트 :  타입 : String, 이름 : asname
l 코드 : return "Hello " +asName + " from PB Web Service";

13.  설정이 완료되면 배포를 해준다. 배포할 때, 해당 프로젝트의 Properties 에 들어가서, WebService 탭에 Expose the componet as a Web Service 를 체크하면 웹서비스로도 배포되어진다.

14.  배포가 완료 되면, EAServer 컴포넌트를 위한 Stubs를 생성한다. 생성하기 위해 EAServer Manager를 실행시킨다.

15.  EAServer Manager가 실행이 되면, 연결을 한다.

16.  연결을 누른 후, 화면에서 기본 정보를 확인 하고 Connect를 선택한다.

17.  연결이 성공적으로 이루어지게 되면, localhost:9000 폴더 아래로 여러 폴더가 생성되게 된다. 여기서 Packages폴더를 열면 아랫부분에 추가한 mywebservices가 나타나게 된다. 다시 폴더를 열어보면 앞에서 추가한 n_pbhello란 오브젝트가 보이게 된다. 이 오브젝트에서 마우스 오른쪽 클릭을 하여 Generate Stub/Skeleton.. 을 선택한다.

18.  Stub 설정창의 정보는 아래 그림처럼 설정 한다.

19.  Skeleton 설정창의 정보는 아래 그림 처럼 설정 한다.


4. WSDL파일을 이용한 파워빌더 프록시 만들기

파워빌더 클라이언트를 이용하여 웹서비스를 호출하기 위해 파워빌더에 있는 프록시 오브젝트를 생성해볼 것이다.

1. 파워빌더 10을 실행하고, 새로운 Workspace를 생성한후, 어플리케이션 오브젝트까지 만들어 준다.

l Workspace Name : PbClien
l Application Name : a_pbclien

2. 생성된 어플리케이션 오브젝트에 pbsoapclient100.pbd 파일을 추가한다. 추가하기 위해선 먼저 a_pbclient 타겟을 선택한후, 마우스 오른쪽 클릭을 하여 Properties..를 선택한다. 그 다음 Browse..를 선택하여 pbsoapclient100.pbd를 찾아 선택해 준다.  


3. pbsoapclient100.pbd이 추가된 PbClient의 모습은 다음과 같다.

4. New a Project a Web Service Proxy Wizard 를 선택한다.

5. WSDL File Name 부분에 4절에서 알아본 WSDL을 붙여넣는다.

6. WSDL 파일에 서비스를 찾아 선택한다. 기본적으로 앞에서 생성한 mywebservices_n_pbhello가 선택되어 진다.

7. 서비스를 위한 포트를 선택한다. 역시 기본적으로 선택되어 진다.

8. 다음의 설정은 기본으로 두고 Next를 누르고 마지막으로 Finish를 선택하면 다음과 같은 Deploy 화면이 나오게 된다. 왼쪽 화면에서 설정한 기본 정보들을 확인해 볼수 있다.

9. Deploy를 선택하게 되면 아래 Output Window에 성공한 결과를 확인 할수 있다.

10.  과정을 마치고 나면 다음과 같이 System Tree부분에 추가가 된 것을 확인 해 볼수 있다.

11. 파워빌더 클라이언트에서 웹서비스를 호출하기 위해 해당 타겟에서 Window 오브젝트를 하나 생성하고 버튼 오브젝트를 하나를 올려 놓는다.

12.  생성한 버튼의 클릭 이벤트에 아래 스크립트를 작성한다.

 

[작성 스크립트]
SoapConnection lsc_SoapConn
string ls_soapResponse
long   ll_result
mywebservices_n_pbhello proxy_obj

// initialize
lsc_SoapConn = create SoapConnection
// Create proxy object
ll_result = lsc_SoapConn.CreateInstance(proxy_obj, "mywebservices_n_pbhello")
if ll_result = 0 then
   try 
       // Invoke service and display result
       ls_soapResponse = proxy_obj.of_hello("펜타시스템") 
       MessageBox("SOAP Response", ls_soapResponse)      
   catch ( SoapException e ) 
       // error handling
       MessageBox ("Error", "Cannot invoke Web service." + " Exception info: " + e.text)
   end try
else
    MessageBox ("Error: " + string(ll_result), "Unable to create proxy")
end if

// clean up
destroy lsc_SoapConn

13.  성공적인 실행결과는 다음과 같다.


Posted by 옹니미