13.6 웹 서비스 개발
웹 서비스를 개발하는 방법은 두 가지가 있다. 첫 번째 방법은 새로운 웹 서비스를 제공하기 위해 Java 코드로 개발하여 배포하고 웹 서비스에 대한 WSDL을 제공하는 방법이 있다. 또 다른 방법은 웹 서비스가 제공해야 할 WSDL이 주어진 경우, 이에 맞는 웹 서비스를 개발해야 하는 경우이다.
Java 코드에서부터 개발하는 방식을 Bottom-up 개발 방식이라고 하며, WSDL에서 시작하는 방식을 Top-down 개발 방식이라고 한다.
Bottom-up을 사용하는 경우 :
- 이미 존재하는 EJB 3 빈을 웹 서비스로 제공하고자 할 때
- 새로운 서비스를 제공하는 WSDL을 생성해야 할 때
Top-down을 사용하는 경우 :
- 다른 언어로 개발된 기존의 웹 서비스를 Java로 다시 개발하여야 할 때
- 예전 클라이언트와 호환을 유지하며 재개발해야 할 때
- 먼저 수동으로 개발된 WSDL과 XML 스키마를 준수하는 서비스를 만들 때
먼저 Java 코드에서 웹 서비스를 개발하는 방법을 살펴보자. 다음과 같이 문자열를 반환하는 간단한 Hello 웹 서비스를 개발하였다. Hello 웹 서비스는 @WebService 어노테이션을 사용하여 웹 서비스 클래스를 지정하였고, @WebMethod 어노테이션으로 웹 서비스의 메서드를 지정하였다.
package com.opennaru.wstest;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService()
public class Hello {
private String message = new String("Hello, ");
public void Hello() {
}
@WebMethod()
public String sayHello(String name) {
return message + name + ".";
}
}
이 웹 서비스를 WAR에 패키징하기 위하여 web.xml에 서블릿으로 등록한다.
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>HelloService</servlet-name>
<servlet-class>com.opennaru.wstest.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloService</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
WAR로 패키징한 애플리케이션을 배포하면 ‘Runtime’ ‘Status’ ‘Subsystems’ ‘Webservices’ 에서 WSDL URL을 확인할 수 있다.

그림 8. 웹 서비스 엔드 포인트
제공하는 서비스에 대한 WSDL URL에 접근하면 웹 서비스에 대한 WSDL이 브라우저에 표시된다.

그림 9. Hello 웹 서비스의 WSDL
Hello 웹 서비스를 테스트하려면 웹 서비스에 접속하는 클라이언트가 필 요하다.
먼저 pom.xml 파일에 JBossWS의 클라이언트에서 필요한 jar파일인 jbossws-cxf-client를 <dependency>에 추가한다.
<dependency>
<groupId>org.jboss.ws.cxf</groupId>
<artifactId>jbossws-cxf-client</artifactId>
<version>4.2.3.Final</version>
</dependency>
또, Hello 웹서비스가 제공하는 WSDL에서 Java 코드를 생성하여 사용하기 위해서 Hello 웹 서비스의 WSDL 파일을 이클립스 프로젝트의 src/test/resources/hellows.wsdl 파일로 저장한다.
메이븐에서 WSDL에서 클라이언트 Java코드를 생성하려면 아래와 같이 maven-jaxws-tools-plugin의 wsconsume을 사용하도록 pom.xml에 설정한다.
<plugin>
<groupId>org.jboss.ws.plugins</groupId>
<artifactId>maven-jaxws-tools-plugin</artifactId>
<version>1.1.1.Final</version>
<executions>
<execution>
<id>My execution</id>
<goals>
<goal>wsconsume</goal>
</goals>
<configuration>
<wsdls>
<wsdl>$\{basedir}/src/test/resources/hellows.wsdl</wsdl>
</wsdls>
<targetPackage>com.opennaru.wstest</targetPackage>
<sourceDirectory>$\{basedir}/src/test/java</sourceDirectory>
</configuration>
</execution>
</executions>
</plugin>
메이븐으로 빌드하면 <sourceDirectory>에 지정한 src/test/java 디렉터리에 Java 파일이 생성된다. 이 파일을 사용하는 클라이언트를 다음과 같이 작성한다.
package com.opennaru.wsclient;
import javax.xml.ws.Service;
import com.opennaru.wstest.Hello;
import com.opennaru.wstest.HelloService;
public class HelloClient {
public static void main(String[] args) {
try {
String name = "JBoss EAP 6";
Service service = Service.create(
HelloService.WSDL_LOCATION,
HelloService.SERVICE
);
Hello hello = service.getPort(Hello.class);
String message = hello.sayHello(name);
System.out.println("message=" + message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
위 클라이언트 코드를 실행하면, Hello 웹 서비스를 호출하여 콘솔에 다음과 같은 메시지가 출력된다.
message=Hello, JBoss EAP 6.
Hello 웹 서비스에서는 WSDL에서 Java 클라이언트 코드를 생성하기 위해 wsconsume을 메이븐 플러그인으로 실행하였다. 예제에서는 WAR 애플리케이션을 배포하면 자동으로 생성되는 WSDL을 사용하였다. 만약 배포하지 않고 WSDL을 생성하려면 메이븐 플러그인의 골(goal)을 wsprovide로 변경하면 Java 코드에서 WSDL이 생성할 수 있을 것이다.
또, 콘솔 명령으로 wsconsume, wsprovide를 제공하고 있다. 사용법은 다음과 같다.
| 명령 | 설명 |
|---|---|
| wsprovide | 웹 서비스로 제공될 Java 구현 클래스로에서 WSDL과 Schema 파일을 생성한다. Bottom-up 개발에 사용된다. |
$ ./wsprovide.sh -w com.opennaru.wstest.Hello -c /home/jboss/workspaces/ hellows/target/hellows/WEB-INF/classes
Could not find log4j.xml configuration, logging to console.
java2ws -s /home/jboss/eap/jboss-eap-6.1/bin/output -classdir /home/ jboss/eap/jboss-eap-6.1/bin/output -d /home/jjeon/jboss/eap/jboss-eap-6.1/bin/output -verbose -wsdl -cp /home/jboss/workspaces/hellows/target/hellows/WEB-INF/classes/: -wrapperbean -createxsdimports com.opennaru.wstest.Hello
java2ws - Apache CXF 2.6.6-redhat-3
| wsconsume | WSDL과 Schema 파일에서 서버 및 클라이언트에 사용할 수 있는 Java 파일을 생성한다. 주로, 웹 서비스의 클라이언트 프로그램을 생성할 때 사용하는 툴이다. |
$ ./wsconsume.sh -k hellows.xml
Could not find log4j.xml configuration, logging to console.
Loading FrontEnd jaxws ...
Loading DataBinding jaxb ...
wsdl2java -compile -exsh false -d /home/jboss/eap/jboss-eap-6.1/bin/output -verbose -classdir /home/jboss/eap/jboss-eap-6.1/bin/output -allowElementReferences file:/home/jboss/eap/jboss-eap-6.1/bin/hellows.xml
wsdl2java - Apache CXF 2.6.6-redhat-3