(Terms 참조) RPC : 한 프로그램이 네트워크 상의 다른 컴퓨터에 위치하고 있는 프로그램에 서비스를 요청하는데 사용되는 프로토콜
RPC는 Remote Procedure Call의 약자로, 분산 환경에서 이기종간의 프로그램을 인터넷을 통해 호출할 수 있도록 하는 기술입니다. 즉, RPC를 통해 다른 시스템에 있는 함수 또는 메소드를 호출할 수 있는 것입니다.
XML-RPC는 HTTP 프로토콜 상에서 데이터를 XML 방식으로 인코딩하여 전송합니다.

XML-RPC에 대한 자세한 내용은 http://www.xmlrpc.com 에서 찾아보실 수 있습니다.
여기서는 자바를 예제로 하여, XML-RPC를 어떻게 사용하는지 알아보도록 하겠습니다.
1. XML-RPC의 동작 방식
XML-RPC는 HTTP 기반의 클라이언트/서버 방식으로 동작합니다. 따라서 XML-RPC 서비스를 하기 위해서는 반드시 XML-RPC 서버가 필요합니다. XML-RPC 서버는 클라이언트로부터 특정 객체의 메소드 호출 요청을 받고, 그 메소드를 실행시켜주는 역할을 합니다.
XML-RPC API (http://ws.apache.org/xmlrpc/apidocs/index.html) 를 보면, WebServer 클래스를 찾아볼 수 있는데 이 클래스가 XML-RPC 서버 역할을 하는 클래스입니다.
2. XML-RPC 서버 만들기
XML-RPC 서버는 WebServer 클래스 또는 XmlRpcServer 클래스를 이용해 작성할 수 있습니다. 아래의 코드를 보면 addHandler라는 메소드를 볼 수 있는데, 이 메소드를 이용해 클라이언트가 이용할 객체를 등록할 수 있습니다.
예제) XML-RPC 서버
import java.util.Hashtable;
import org.apache.xmlrpc.*;
public class JavaServer {
public JavaServer () {
// Our handler is a regular Java object. It can have a
// constructor and member variables in the ordinary fashion.
// Public methods will be exposed to XML-RPC clients.
}
public Hashtable sumAndDifference (int x, int y) {
Hashtable result = new Hashtable();
result.put("sum", new Integer(x + y));
result.put("difference", new Integer(x - y));
return result;
}
public static void main (String [] args) {
try {
// Invoke me as <http://localhost:8080>.
WebServer server = new WebServer(8080);
server.addHandler("sample", new JavaServer());
server.start();
} catch (Exception exception) {
System.err.println("JavaServer: " + exception.toString());
}
}
}
3. XML-RPC 클라이언트 만들기
XML-RPC 클라이언트는 서버와 마찬가지로 매우 간단하게 작성할 수 있는데, XmlRpcClient 클래스를 이용하여 다른 시스템의 객체에 접근할 수 있습니다. 메소드의 호출은 XmlRpcClient의 execute 메소드를 이용하여 할 수 있습니다. 이 때 호출할 다른 시스템의 메소드에 넘겨줄 인자(parameter)는 Vector에 담아 넘기도록 하고 있습니다.
예제) XML-RPC 클라이언트
import java.util.Vector;
import java.util.Hashtable;
import org.apache.xmlrpc.*;
public class JavaClient {
// The location of our server.
private final static String server_url =
"http://localhost:8080";
public static void main (String [] args) {
try {
// Create an object to represent our server.
XmlRpcClient server = new XmlRpcClient(server_url);
// Build our parameter list.
Vector params = new Vector();
params.addElement(new Integer(5));
params.addElement(new Integer(3));
// Call the server, and get our result.
Hashtable result =
(Hashtable) server.execute("sample.sumAndDifference", params);
int sum = ((Integer) result.get("sum")).intValue();
int difference = ((Integer) result.get("difference")).intValue();
// Print out our result.
System.out.println("Sum: " + Integer.toString(sum) +
", Difference: " +
Integer.toString(difference));
} catch (XmlRpcException exception) {
System.err.println("JavaClient: XML-RPC Fault #" +
Integer.toString(exception.code) + ": " +
exception.toString());
} catch (Exception exception) {
System.err.println("JavaClient: " + exception.toString());
}
}
}
4. XML-RPC 서버 서블릿 만들기
XML-RPC가 HTTP 기반이므로, 서블릿으로 XML-RPC 서버를 만들 수 있습니다. 이렇게 하면, 클라이언트에서 서블릿의 URL로 접근하여, 원격으로 메소드를 호출할 수 있습니다.
예제) XML-RPC 서버 서블릿 만들기
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.xmlrpc.*;
public class XmlRpcServlet extends HttpServlet {
protected XmlRpcServer xmlrpc;
public void init(ServletConfig config) throws ServletException {
XmlRpc.setEncoding("euc-kr");
XmlRpc.setKeepAlive(true);
xmlrpc = new XmlRpcServer();
xmlrpc.addHandler("hello", new HelloHandler());
XmlRpc.setDebug(false);
}
// doPost , doGet
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//maintenance of public security
//String auth = request.getHeader( "Authorization" );
byte[] result = xmlrpc.execute( request.getInputStream() );
response.setContentType( "text/xml" );
response.setContentLength( result.length );
OutputStream output = response.getOutputStream();
output.write( result );
output.flush();
}
}
5. XML-RPC Tip
XML-RPC를 이용한 원격 메소드 호출 시 인자와 리턴 값이 HTTP 프로토콜을 통해 전송되기 때문에 인자와 리턴 값은 반드시 Serializable한 객체여야 합니다.
아래 표는 현재 아파치 XML-RPC에서 사용 가능한 타입입니다.
| XML-RPC data type | Data Types generated by the Parser | Types expected by the Invoker as input parameters of RPC handlers |
|---|---|---|
| <i4> or <int> | java.lang.Integer | int |
| <boolean> | java.lang.Boolean | boolean |
| <string> | java.lang.String | java.lang.String |
| <double> | java.lang.Double | double |
| <dateTime.iso8601> | java.util.Date | java.util.Date |
| <struct> | java.util.Hashtable | java.util.Hashtable |
| <array> | java.util.Vector | java.util.Vector |
| <base64> | byte[ ] | byte[ ] |
========================================================================================
2004-09-15 조재호(tinywolf@korea.com)
이 글은 자바캔 에서도 보실 수 있습니다.
자바캔 원고 보기 : http://javacan.madvirus.net/main/content/contentRead.jsp?contentNo=95&block=1
'XML' 카테고리의 다른 글
| 새로운 AJAX - Asynchronous Javascript And XML (0) | 2007/06/07 |
|---|---|
| xmlrpc 관련 참조 (0) | 2007/06/07 |
| XML-RPC를 이용한 원격 메소드 호출 (0) | 2007/06/07 |
| XML Tree Viewer (0) | 2007/06/07 |
| ADO 2.5 Streams and XML (0) | 2007/06/07 |
| xmlrpc - javascript 연동 (0) | 2007/06/07 |




최근에 달린 댓글
링크
최근에 받은 트랙백
태그목록