 |  |
|
난이도 : 중급 Vijay Bommireddipalli, Data Servers Solutions, IBM
2007 년 9 월 18 일 웹 서비스는 서비스 지향 아키텍처(SOA)를 실현하는 중요한 구현 블록입니다. 애플리케이션이 점점 더 SOA로 향해가면서, 애플리케이션 기능을 웹 서비스로서 노출해야 할 필요가 많아졌습니다. 이 글에서는 간단한 자바 클래스를 사용하여 웹 서비스를 생성하여 pureXML™ 기능을 사용하여 DB2® 9 에서 XML 데이터를 삽입 및 검색하는 방법을 설명합니다. 웹 서비스가 생성되어 WebSphere® Application Server에서 전개되면, 웹 서비스 클라이언트로서 Rational Application Developer (RAD)의 빌트인 웹 서비스 익스플로러나 XForms를 사용하여 이들을 테스트 할 수 있습니다. 같은 서비스들이 SOAP over HTTP 웹 서비스 호출을 할 수 있는 웹 서비스 클라이언트에 의해 사용될 수 있습니다.
배경
요즘, 웹 서비스들은 SOA의 중요한 컴포넌트이고, 매우 분리되고 유연한 솔루션이다. 웹 서비스는 Top-Down 또는 Bottom-Up 방식을 사용하여 구현될 수 있다. Top-Down 방식의 경우, 서비스 스팩(예, WSDL 파일)으로 시작한 다음 기반 코드를 구현하여 그 스팩과 매치시킨다. Bottom-Up 방식의 경우, 자바 빈으로 시작하여 그 기능을 웹 서비스로서 노출시킨다.
IBM은 DB2 9에 pureXML 기능을 도입했다. 이것은 XML 데이터가 데이터베이스에 기본적으로 저장될 수 있도록 한다. 이것은 XML을 DB2의 퍼스트 클래스 datatype으로 만들고, XML 컬럼은 데이터베이스 내 기본적인 계측적 형태로 잘 구성된 XML을 저장할 수 있다. 데이터가 XML로서 데이터베이스에 저장되면, 이 데이터는 매우 효율적으로 쿼리될 수 있다. XML은 쿼리 계산 때문에 런타임 시 파싱되지 않기 때문이다. XQuery, SQL, DB2가 제공하는 애플리케이션 개발 인터페이스를 사용하여 XML 데이터로 액세스 및 조작 할 수 있다.
XForms는 XML 기반의 전자 폼 기술로서 데이터를 XML 데이터 인스턴스로서 제출할 수 있다. 이는 W3C 권장이고 플랫폼이며, 장치 독립적이다. XForms는 데이터 모델과 표현을 분리하는데, 이는 사용자 데이터가 XML로서 제출될 수 있도록 한다. 이 데이터의 수신자는 XML 인스턴스로서 제출된 데이터를 저장 및 조작할 수 있다. XForms를 사용하여 데이터가 제출되는 여러 방법들이 있다. 이 예제에서는 웹 서비스를 사용하기로 한다.
엔드 유저 폼에 XForms를 사용하고, 전송 메커니즘으로서 웹 서비스를 사용하고, 저장에 DB2 9을 사용하여, 진정한 엔드투엔드 XML 솔루션을 만들 수 있다. 변화에 탄력적이며, 개발 시간을 현격히 줄인다.
DB2 9, XForms, 웹 서비스와 관련된 상세한 정보는 참고자료 섹션을 참조하라.
사전 조건
다음 사항들은 이 글에서 설명하는 내용들을 이해하는데 필수적이다.
- DB2 9과 pureXML 기능을 이해해야 한다. 참고자료 섹션에서 DB2 9의 pureXML 기능을 파악해야 한다.
- RAD 실행 및 WebSphere Application Server 테스트 환경을 사용하여 애플리케이션을 전개 및 제거하는 기능을 알아야 한다.
- 웹 서비스 개발을 이해하고 있어야 한다.
시스템 요구 사항
서버 측 개발
-
DB2 9과 pureXML
무료로 사용할 수 있는 DB2 Express-C를 사용할 수 있다. DB2 Express-C는 두 개의 듀얼 코어 CPU 서버에서 실행될 수 있으며, 최대 4GB 메모리까지 가능하며, 시스템 스토리지 설정이 가능하고, 데이터베이스 크기에 대한 제한 사항이나 기타 제약 사항이 없다. Express-C 다운로드에 대한 링크는 참고자료 섹션을 참조하라.
-
RAD Version: 7.0.0 (또는 이후 버전)
주: 본 예제는 RAD에 포함된 WebSphere Application Server Version 6.1.0.2 빌트인 테스트를 사용하여, 결과를 테스트하는 단계를 상세히 보여준다. WAR 파일을 반출하고 이를 WebSphere Application Server(6.1.0.2 및 이후 버전)에 전개할 수 있다. 본 예제는 이전 버전의 WebSphere Application Server에서는 실행되지 않는다.
클라이언트 측
절차
요약
본 예제는 Bottom-Up 방식을 사용하여 XML 데이터용 웹 서비스의 생성 과정을 설명한다. 자바 빈의 구현(FormServices.java)이 시작 포인트로서 제공된다. 본 자바 빈에는 데이터 액세스 및 조작 메소드가 포함되어 있고, DB2 9 샘플 데이터베이스의 XML 컬럼에 있는 데이터를 조작한다. 사이드 바 "FormServices.java explained"에 자바 빈 콘텐트에 대한 상세한 설명이 되어 있다. RAD를 사용하여 자바 빈에 있는 이러한 메소드를 웹 서비스로서 노출하게 될 것이다. 마지막으로, 이러한 웹 서비스들을 Xforms를 사용하여 테스트 할 것이다.
단계
-
샘플 데이터베이스와 xmlcustomer 테이블을 생성하기
- codepage UTF8의 샘플 데이터베이스를 만든다. (없을 경우)
db2 create db sample using codeset UTF8 territory US
|
DB2 9은 UTF8 데이터베이스 코드 페이지를 사용하여 XML datatype 컬럼을 만든다.
- DB2 명령어 프롬프트에서, 다음 명령어를 사용하여 xmlcustomer 테이블을 만든다.
connect to sample
CREATE TABLE XMLCUSTOMER( CID INT NOT NULL PRIMARY KEY, INFO XML )
|
XML 컬럼 INFO는 잘 구성된 XML을 저장할 수 있다.
DB2 명령어 프롬프트에 다음을 입력하여 테스트 insert를 시도한다.
insert into xmlcustomer values ( 9999, '<test/>');
|
-
RAD 시작 및 "Dynamic Web Project" 생성하기
- 웹 퍼스펙티브에서 시작한다. (또는, Window > Open Perspective > Web 순으로 선택한다.)
- 프로젝트 이름으로 "XForm"을 입력한다. (대소문자 구별)
- 디폴트를 사용하고 Finish를 클릭한다.
그림 1. 웹 프로젝트 만들기
-
제공된 자바 소스 코드 파일을 가져와서 필요한 부분을 수정하기
- 위에서 생성된 XForm 프로젝트를 Java Resources 폴더가 보일 때까지 확장한다.
- 오른쪽 클릭하여 New > package를 선택한다. 패키지 이름으로 "com.ibm.test"를 지정하고 Finish를 클릭한다.
그림 2. 패키지 생성하기
- 방금 생성된 패키지를 오른쪽 클릭하고 Import > File System 순으로 선택하여 FormServices.java (자바 소스 파일)를 가져온다.
 |
FormServices.java에 대하여:
자바 소스 코드 FormServices.java는 두 개의 클래스로 구성된다.
-
DB 클래스:
이 클래스는 데이터베이스 연결을 핸들한다. 자신의 환경에 맞게 수정해야 한다.
- 메소드:
connect: 애플리케이션 코드가 DB2 데이터베이스로 연결되도록 한다. 이 메소드는 type 4 Java Database Connectivity (JDBC) 드라이버를 사용한다.
disconnect: 데이터베이스에서 애플리케이션 연결을 해제하고 JDBC 리소스를 해제한다.
-
FormServices 클래스:
본 클래스는 데이터베이스에 있는 데이터를 조작하는 메소드를 갖고 있고 폼에 디스플레이 될 데이터를 가져온다. 이 메소드는 웹 서비스로서 노출된다. XML 데이터 조작을 가능케 하는 세 개의 기본 메소드가 있다. 이 세 개의 메소드들이 반복하여 XML 데이터가 스트링으로 취급되도록 한다.
- 메소드:
insertFormData: 인풋 XML 데이터를 취하고 이것을 DB2 데이터베이스의 XML 컬럼에 저장한다. XML 인풋은 XML 데이터여야 한다. (< 같은 이스케이프 스트링은 안된다.)
retrieveFormData: 고유 키에 기반하여 XML 컬럼에 저장된 폼 데이터를 가져온다.
retrieveFormIDs: 폼 ID를 검색하고 이것을 XForm에 맞는 XML로 리턴한다. 이 메소드를 사용하여 폼 내에 드롭다운 메뉴를 생성할 수 있다.
세 개의 메소드 *AsString()은 기본적으로 위와 같은 메소드이지만, XML 데이터를 와이어를 통해 전송하는 대신, XML은 스트링으로 변환된다. 따라서, <hello/>는 "<hello/>"가 된다. 이러한 편리한 메소드들이 제공되어 빌트인 웹 서비스 익스플로러를 테스팅에 사용할 수 있다.
genSOAPElement: 스트링에서 SOAPElement로 페이로드를 변형하는데 사용되는 헬퍼 메소드이다.
genStringfromSOAP: SOAPElement에서 스트링으로 페이로드를 변형하는데 사용되는 헬퍼 메소드이다.
|
|
그림 3. FormServices.java 샘플 코드 가져오기
-
//Change 패턴을 찾고 필요할 경우 환경에 맞게 수정한다. 코드에 있는 주석들을 참조하면 도움이 된다.
- 이 예제를 제시된 대로 따라갈 경우, Database 클래스에서 사용자 아이디와 패스워드를 변경해야 하는데 이것 역시 //Change 패턴에 의해서 표시된다.
- 이 코드가 깨끗하게 컴파일 되고 모든 반입이 수행되었는지를 확인한다. db2jcc.jar를 XForm 프로젝트의 Java Build Path에 추가해야 한다.
- 외부 db2jcc.jar를 추가하려면, 프로젝트를 오른쪽 클릭하고 Properties > Java Build Path > Add External Jars >를 선택한 다음 DB2 설치(\sqllib\java)에서 db2jcc.jar를 선택한다.
-
컴파일 된 자바 코드를 웹 서비스로서 노출하기
-
FormServices.java를 오른쪽 클릭하고, Web Services > Create Web Service 순으로 클릭한다. 웹 서비스 메뉴가 보이지 않으면, 실행 방법에 대해 읽어보라.
- 웹 서비스 메뉴가 보이지 않는다면, 워크벤치에서 웹 서비스 기능을 실행해야 한다. Windows > Preferences > Workbench > Capabilities 순으로 클릭하고 Web Service Developer를 체크하여 이것이 실행되는지를 확인한다.
그림 4. 자바 소스에서 웹 서비스 생성하기
- 설정이 아래 보이는 것처럼 되었는지 확인한다. 경고가 실행되면 OK를 클릭한다.
주: 서비스가 생성되면, 다양한 자바 datatype을 JAX-RPC 스팩에 정의된 것과 같은 XSD 유형으로 매핑한다. IBM WebSphere SOAP 엔진은 자바 빈의 javax.xml.soap.SOAPElement datatype을 WSDL의 XML 스키마 xsd:anyType으로 매핑한다. 하지만, JAX-RPC 스팩은 현재 xsd:anyType에 대한 표준 자바 매핑을 정의하지 않는다. JAX-RPC 구현은 xsd:anyType을 지원하는데 필요하지 않다. 본 예제는 다른 SOAP 엔진에서는 실행되지 않으며 다른 SOAP 엔진에서 테스트 되지 않았다.
그림 5. 웹 서비스 설정 리뷰
- 실행해야 하는 서비스를 선택할 수 있는 메뉴가 보일 때까지 Next를 클릭한다. 모든 서비스들이 웹 서비스로서 노출되는 것으로 체크되었는지를 확인한 다음 Finish를 클릭한다.
주: 경고가 실행되면 OK를 클릭한다. (위 주 참조)
그림 6. 웹 서비스로서 노출할 메소드 선택하기
- 프롬프트가 뜨면 Start Server를 클릭한다. 생성된 서비스들은 빌트인 WebSphere Application Server 테스트 서버에 퍼블리시 될 것이다.
-
빌트인 테스트 WebSphere Application Server에서 XForms 실행하기
- XForms 애플리케이션을 테스트하기 전에, 설치된 필수 JAR 파일들이 JDBC type 4 드라이버를 사용하여 DB2에 연결하기에 맞는 버전인지를 확인한다.
- 설치된 WebSphere Application Server 디렉토리로 가서 다음 파일들이 있는지를 확인한다. db2jcc.jar, db2jcc_license_cu.jar (예를 들어, 본 예제의 경우, 필자는 이러한 JAR 파일들을 "C:\Program Files\IBM\SDP70\runtimes\base_v61\lib'" 밑에 설치했어야 했다.)
- JAR 파일들이 없다면, JAR 파일들을 복사하고 WebSphere Application Server 시스템 서버를 재시작 한다.
- 이전 단계에서 생성된 웹 서비스와 XForms를 실행하기 전에 같은 WebSphere Application Server에 SOAPForwarding 서블릿을 설치해야 한다. 이 파일 (SOAPResolution.war)은 다운로드 섹션에서 제공된다.
이 단계는 단순한 stop gap 정렬이다. Mozilla의 XForms Add-on은 현재 유효한 SOAP 호출을 하지 않는다. 이 단계는 이러한 결함들이 Mozilla XForms Add-on의 차기 릴리스에서 픽스되면 필요치 않다. 이 글을 쓰고 있는 현재, Firefox Xforms Version 0.7.0.1을 사용하는 웹 서비스 호출은 SOAPAction 헤더가 빠져있다. SOAPForwarding 서블릿은 이 SOAPAction 헤더를 추가하는 것뿐이다.
-
XformEAR을 오른쪽 클릭하고 Import > war file을 선택한다.
- 파일 시스템을 검색하여 SOAPResolution.war 파일을 선택한다. 웹 프로젝트 이름은 아래 나타난 대로 자동 채우기를 실행한다. 이것이 기존 XFormEAR 프로젝트에 추가되었는지를 확인한다.
그림 7. SOAPResolution WAR
-
Click Finish를 클릭하여 서블릿을 가져온다.
-
RAD의 빌트인 웹 서비스 익스플로러를 사용하여 웹 서비스 테스트 하기
- 애플리케이션을 성공적으로 전개 및 시작했다면, 이제 전개된 서비스들을 테스트 할 차례이다.
- RAD에서 생성된 FormServices.wsdl을 오른쪽 클릭하고 Test with Web services explorer를 선택한다.
- 정확한 포트 넘버로 엔드 포인트를 지정하고,
*AsString.
으로 끝나는 메소드를 실행해 본다. 이 샘플에는 이스케이프 스트링으로서 XML을 리턴하는
*AsString
으로 끝나는 세 개의 메소드가 있다. 대부분의 브라우저들은 이스케이프 스트링으로서의 XML을 선호한다. ("<" 대신 <) 하지만, XForms는 실제 XML 값을 좋아한다. 다른 세 개의 메소드(*AsString 제외)는 *AsString과 기능면에서 동일하지만, 이들은 실제 XML 데이터를 리턴한다.
그림 8. 웹 서비스 익스플로러를 사용하여 *AsString 서비스 테스트 하기
-
XForms를 사용하여 XML 웹 서비스 테스트 하기
- 데모에 제공된 XForms를 시작한다.
xmlcustomer.xhtml 파일을 오른쪽 클릭하고 Open with Firefox를 선택한다. 이 단계는 본 글의 사전 조건 섹션에 지정된 대로 XForms 플러그인을 설치한 것으로 간주한다. 아래 스크린 캡쳐와 같은 XForms를 볼 수 있다.
- 고유 "Id Val"을 지정하고 이름에 /modify를 입력한다.
- xmlcustomer Form을 사용하여, Id Val 필드에 고유 ID를 지정하고
Submit을 누른다.
지정된 Id Val은 DB2의 XMLCUSTOMER의 CID 컬럼 고유의 것이어야 한다.
-
Submit을 누르면, XForm은 insertFormData 서비스로 웹 서비스 호출을 하고 이 폼의 사용자 데이터를 XML 인스턴스로서 DB2에 삽입한다.
에러가 생기거나 어떤 것도 발생하지 않으면, "문제 해결 팁" 섹션을 참조하여 필요한 조치를 취한다.
 |
문제 해결 팁
XForms:
"Submit"을 눌러도 아무것도 발생하지 않을 때:
- Firefox에서 Tools > Java script console을 선택하여 스타일스트 에러 외에 다른 에러가 있는지를 확인한다.
-
If you see the XForms Error (14): Security check failed! Trying to submit data to a different domain than document 에러의 경우:
Mozilla의 XForms 확장은 기본적으로 크로스 도메인 제출을 허용하지 않는다. 상세한 내용은
url
을 참조하라. 크로스 도메인 제출을 실행하려면, "hostperm.1" 파일을 찾고 이 라인을 "host xforms-xd 3 scheme:file" 파일에 추가한다. (이와 비슷한 다른 라인도 볼 수 있다.) 필자의 hostperm.1은 C:\Documents and Settings\Administrator\Application Data\Mozilla\Firefox\Profiles\m6g6ho0d.default 디렉토리에 있었지만, 여러분의 경로는 다를 수 있다. 브라우저를 재시작 한다.
WebSphere Application Server:
XForm.war 애플리케이션이 시작하지 않으면, 시스템 로그를 검사해 보라. Microsoft® Windows 시스템의 경우, 기본 위치는 C:\Program Files\IBM\SDP70\runtimes\base_v61\profiles\AppSrv01\logs\server1 이다.
고급 문제 해결:
여러분이 서버 문제를 다루고 있는지, 아니면 클라이언트 문제를 다루고 있는지를 파악하는 좋은 방법은 와이어를 통해 xform에서 WebSphere Application Server로 무엇이 보내지는지를 확인하는 것이다. https://tcpmon.dev.java.net/ 같은 TCP 모니터를 사용하여 이를 수행할 수 있다.
XForms 제출 액션을 TCP 모니터가 실행되는 새로운 포트 넘버로 리다이렉션 하고 TCP 모니터가 인커밍 메시지를 서버로 보내도록 한다.
예제:
localhost:9081을 가리키는 서버에서 localhost:8080에서 TCP 모니터를 실행한다. localhost:8080에 제공된 샘플 xform에 localhost:9081의 모든 현상들을 수정한다. 이러한 방식으로, 모든 제출은 TCP 모니터를 통해 보내지고, 이 모니터는 무엇이 보내지는지를 디스플레이 한다. 방화벽이 통신을 차단하고 있지는 않은지를 확인한다.
|
|
그림 9. xform을 사용하여 insert 서비스 테스트 하기
- 에러가 없다면 검색 폼을 보게 될 것이다. Insert에서 지정된 것과 같은 ID를 지정하고 Retrieve를 누른다.
- 이번에는, xform이 retrieveFormData 서비스로 웹 서비스 호출을 하여 XML 인스턴스로서 DB2에서 사용자 데이터를 검색하고 이를 xform으로 매핑한다.
그림 10. xform을 사용하여 retrieve 서비스 테스트 하기
결론
DB2 pureXML에 있는 XML 데이터를 위한 Bottom-Up 웹 서비스를 생성하는 방법을 살펴보았다. 이러한 서비스들은 SOAP over HTTP 웹 서비스를 사용하여 DB2 9에 XML 데이터를 저장하고 검색할 수 있다. 이 서비스들은 이스케이프 스트링 또는 실제 XML로서 XML을 삽입 및 검색할 수 있다. 자신의 필요에 맞게 자바 소스를 수정할 수 있고 그러한 메소드들은 웹 서비스로서 노출될 수 있다. 이러한 웹 서비스들은 SOAP over HTTP 호출을 하여 데이터를 데이터베이스에 저장 및 검색할 수 있는 클라이언트에 대한 엔드포인트로서 작동한다.
감사의 말
이 글을 검토해 준 Michael Schenker, Keith Wells, Jan Kratky, Cindy Saracco, Sal Ledezma, Matthias Nicola에게 감사의 말을 전하고 싶다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| 샘플 자바 코드와 Xform | javaxformsample.zip | 10KB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | 
|  | Vijay Bommireddipalli는 IBM 실리콘밸리 연구소(캘리포니아)의 데이터 서비스 솔루션 팀에서 일하고 있다. 이 곳에서, DB2 기반 솔루션을 개발하고 있다. 이 팀으로 옮기기 전, Warehouse Manager 개발 팀의 개발자로 있었다. 2000년 7월에 IBM에 입사했으며, 매사추세츠주립대 - Dartmouth에서 전기 공학 및 컴퓨터 엔지니어링 석사 학위를 받았다. |
기사에 대한 평가
|  |