2011년 5월 24일 화요일

RSS Reader Web Service 버전

TheServerSide.com RSS Reader 클래스 다이어그램

1. webApp.RssNews.WS.theServerSideInf : 비즈니스 메서드를 정의한 인터페이스
2. webApp.RssNews.WS.theServerSide : 비즈니스 메서드 구현 클래스
3. webApp.RssNews.WS.rssVO : RSS Transfer(Value) Object
Source
인터페이스
Package webApp.RssNews.WS;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface theServerSideInf extends Remote {
public rssVO[] getNewsList() throws RemoteException;
}


구현 클래스
package webApp.RssNews.WS;
import com.sun.cnpi.rss.elements.Item;
import com.sun.cnpi.rss.elements.Rss;
import com.sun.cnpi.rss.parser.RssParser;
import com.sun.cnpi.rss.parser.RssParserException;
import com.sun.cnpi.rss.parser.RssParserImpl;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class theServerSide implements theServerSideInf {
public theServerSide() {
}
public rssVO[] getNewsList() {
try {
RssParser parser = new RssParserImpl();
//Rss rss = parser.parse(new URL("http://www.theserverside.com/rss/theserverside-0.9.rdf"));
Rss rss = parser.parse(new URL("http://servlet.java.sun.com/syndication/rss_java_highlights-PARTNER-20.xml"));
return verifyRss(rss);
}
catch (MalformedURLException e) {
e.printStackTrace();
return null;
}
catch (IOException e) {
e.printStackTrace();
return null;
}
catch (RssParserException e) {
e.printStackTrace();
return null;
}
}
private rssVO[] verifyRss(Rss rss) {
Collection items = rss.getChannel().getItems();
ArrayList array = new ArrayList();
if(items != null && !items.isEmpty()) {
for(Iterator i = items.iterator(); i.hasNext(); ) {
Item item = (Item)i.next();
rssVO vo = new rssVO();
vo.setTitle(item.getTitle().toString());
vo.setLink(item.getLink().toString());
vo.setDescription(item.getDescription().toString());
array.add(vo);
}
}
rssVO vo[] = new rssVO[array.size()];
array.toArray(vo);
return vo;
}
}


참고 : 이 글을 쓰고 있는 동안에 theServerside.com RSS XML 문서에 에러가 있어 다른 java.sun.com 사이트의 RSS를 읽어 오게 했습니다.
Transfer Object
package webApp.RssNews.WS;
import java.io.Serializable;
public class rssVO implements Serializable {
private String title;
private String description;
private String link;
public rssVO() {
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getLink() {
return link;
}
public void setLink(String link) {
this.link = link;
}
}


Compile
“ javac –d ./WEB-INF/classes *.java “
참고 : RSS UTIL 라이브러리는
http://java.sun.com/developer/technicalArticles/javaserverpages/rss_utilities/rss_utils_1.1.zip
에서 받을수 있수 있습니다. rssutils.jar 파일을 WEB-INF/lib 디렉토리에 COPY 합니다.
jaxrpc-ri.xml : WEB-INF 디렉토리 밑에 저장
<?xml version='1.0' encoding='UTF-8'?>
<webServices version="1.0" xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/dd"
targetNamespaceBase="http://192.168.11.128:80/RSSNewsWS/webservice/wsdl"
typeNamespaceBase="http://192.168.11.128:80/RSSNewsWS/webservice/type">
<endpoint name="webservice" interface="webApp.RssNews.WS.theServerSideInf"
implementation="webApp.RssNews.WS.theServerSide"/>
<endpointMapping endpointName="webservice" urlPattern="/webservice"/>
</webServices>


web.xml : WEB-INF 디렉토리 밑에 저장
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
</web-app>


WAR 파일 생성
“jar –cvf RSSNews.war ./WEB-INF”
Web Service WAR 파일 생성
“wsdeploy –o RSSNewsWS.war RSSNews.war”
참고 : wsdeploy, wscompile등은 java.sun.com 사이트에서 JWSDP을 다운 받아서 설치 해야 합니다.
Web Service 배포
Web Service 테스트는 일반적으로 Tomcat5.0 JWSDP 버전에 배포합니다. 배포 방식은 일반 WAR 파일 배포와 같습니다. 여기서는 Tmax Soft의 JEUS 4.2 버전에서 배포하여 보겠습니다.
JEUS 4.2 버전 설치는 Tmax Soft의 http://technet.tmax.co.kr 를 참고 하십시오.
- JEUS_HOME/lib/application 디렉토리에 JWSDP 라이브러리를 추가합니다.
JWSDP/jaxrpc/lib 디렉토리에 있는 파일
jaxrpc-api.jar
jaxrpc-impl.jar
jaxrpc-spi.jar
JWSDP/saaj/lib 디렉토리에 있는 파일
saaj-api.jar
saaj-impl.jar


- WAR 파일 배포
{JEUS_HOME}/config/{HOST_NAME}/{HOST_NAME}_servlet_engine1/WEBMain.xml 파일에 Context 추가
<context>
<context-name>RSSNewsWS</context-name>
<context-path>/RSSNewsWS</context-path>
</context>


{JEUS_HOME}/config/{HOST_NAME}/{HOST_NAME}_servlet_engine1/jeus-web-dd_RSSNewsWS.xml 파일 추가
<?xml version="1.0"?>
<!DOCTYPE jeus-web-dd PUBLIC "-//Tmax Soft., Inc.//DTD JEUS WEB Deployment Info 4.0//EN"
"http://www.tmaxsoft.com/jeus/dtd/4.0/jeus-web-dd.dtd">
<jeus-web-dd>
<context>
<context-name>RSSNewsWS</context-name>
<docbase>RSSNewsWS</docbase>
<auto-reload>
<enable-reload>true</enable-reload>
<check-on-demand>true</check-on-demand>
</auto-reload>
</context>
</jeus-web-dd>


WAR 파일 COPY
위에서 생성한 RSSNewsWS.war 파일을 “{SERVLET_HOME}/webapp/RSSNewsWS” 디렉토리를 만들어 압축을 풀어서 Copy한 후 JEUS를 제기동한다.
Web Service 기동 확인
http://localhost:8088/RSSNewsWS/webservice을 클릭하면 기동을 확인 할 수 있다.

필자와 URL은 다르게 나올것이다.
Web Service 클라이언트
여기서 클라이언트는 정적 클라이언트를 사용하기로 한다. 클라이어트가 사용할 스텁을 생성한다.
config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright 2004 Sun Microsystems, Inc. All rights reserved.
SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
-->
<configuration
xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<wsdl
location="http://192.168.11.128/RSSNewsWS/webservice?WSDL"
packageName="webApp.RssNews.client" />
</configuration>


wsdl location은 실제 접근 가능한 URL로 고쳐준다. 위는 필자의 Web Service URL이다.
스텁 생성
“wscompile –gen:client –d . config.xml” à 아래와 같은 스텁이 생성된다.
RssVO.class
RssVO_SOAPBuilder.class
RssVO_SOAPSerializer.class
TheServerSideInf.class
TheServerSideInf_getNewsList_RequestStr…
TheServerSideInf_getNewsList_RequestStr…
TheServerSideInf_getNewsList_ResponseSt…
TheServerSideInf_getNewsList_ResponseSt…
TheServerSideInf_getNewsList_ResponseSt…
TheServerSideInf_Stub.class
Webservice.class
Webservice_Impl.class
Webservice_SerializerRegistry.class


위 파일을 ClassPath에 잡고 클라이언트 프로그램을 작성한다.
클라이언트 프로그램 RssView.jsp
<%@ page contentType="text/html;charset=EUC-KR"%>
<%@ page import="java.rmi.RemoteException"%>
<%@ page import="javax.xml.rpc.Stub"%>
<%@ page import="webApp.RssNews.client.*"%>
<%!
public RssVO[] getRSSList() {
try {
Webservice_Impl webservice = new Webservice_Impl();
Stub stub = (Stub) webservice.getTheServerSideInfPort();
TheServerSideInf rssInfo = (TheServerSideInf)stub;
return rssInfo.getNewsList();
}
catch (RemoteException e) {
System.out.println(e);
return null;
}
}
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>RSSNEWSLIST</title>
<table cellspacing="2" cellpadding="3" border="1" width="100%">
<tr>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<%
RssVO rssvo[] = getRSSList();
for(int i = 0; i < rssvo.length; i++) {
%>
<tr>
<td><a href="<%=rssvo[i].getLink()%>" target="new"><%=rssvo[i].getTitle()%></a></td>
<td><%=rssvo[i].getDescription()%></td>
</tr>
<%
}
%>
</table>
</head>
<body>
</body>
</html>


실행화면

PS : JEUS를 통해서 Web Service를 구현하는 것은 불편하게 생각될 수 있다. 하지만 JEUS에서 Web Service을 개발하기 위해 지원하는 도구를 이용하면 이보다 더 쉽게 개발을 할 수 있을 것이다. Web Service을 개발한다는 것은 아직까지 개발자에게 부담으로 남아있다. 각 IDE 툴에서 Web Service 개발을 지원한다지만 아직 실전에는 사용이 힘들 다고 생각된다. 특히 파라미터나 리턴값으로 Web Service에서 지원하는 기본 타입의 제한은 정말 무덤을 파고 들어가는 기분이다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...