[java] Apache CXF와 WSDL

Apache CXF는 Java로 웹 서비스를 개발하는 데 사용되는 인기 있는 오픈 소스 프레임워크입니다. 여기에서는 Apache CXF를 사용하여 WSDL(Web Services Description Language) 기반의 웹 서비스를 개발하는 방법에 대해 살펴보겠습니다.

내용

  1. Apache CXF란 무엇인가?
  2. WSDL이란 무엇인가?
  3. Apache CXF를 사용한 WSDL 기반 웹 서비스 개발 단계
  4. 마치며
  5. 참고 자료

Apache CXF란 무엇인가?

Apache CXF는 기존에는 Apache SOAP와 Apache Axis로 알려진 프로젝트의 후속 제품으로 시작했으며, 현재는 주로 JAX-RS 및 JAX-WS와 같은 웹 서비스 프레임워크를 개발하는 데 사용되는 도구입니다. Apache CXF는 Java로 작성된 웹 서비스를 손쉽게 개발할 수 있도록 다양한 기능을 제공합니다.

WSDL이란 무엇인가?

WSDL는 웹 서비스의 설명을 기술하는 XML 기반의 언어로, 클라이언트가 웹 서비스에 접속할 때 필요한 정보를 제공합니다. WSDL은 서비스의 메서드, 파라미터, 반환 값 등을 명세하고, 웹 서비스를 사용하는 클라이언트가 이를 손쉽게 이해하고 활용할 수 있도록 도와줍니다.

Apache CXF를 사용한 WSDL 기반 웹 서비스 개발 단계

아래는 Apache CXF를 사용하여 WSDL 기반의 웹 서비스를 개발하는 단계입니다.

WSDL 파일 작성

먼저, 기존에 개발한 서비스에 기반하여 WSDL 파일을 작성해야 합니다. 해당 WSDL 파일에는 서비스의 인터페이스, 동작 및 메시지 형식이 명세되어야 합니다.

<definitions name="HelloWorldService"
             targetNamespace="http://www.example.org/hello/"
             xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns:tns="http://www.example.org/hello/"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <message name="sayHelloRequest">
        <part name="name" type="xsd:string"/>
    </message>
    <message name="sayHelloResponse">
        <part name="greeting" type="xsd:string"/>
    </message>

    <portType name="HelloWorldPortType">
        <operation name="sayHello">
            <input message="tns:sayHelloRequest"/>
            <output message="tns:sayHelloResponse"/>
        </operation>
    </portType>

    <binding name="HelloWorldBinding" type="tns:HelloWorldPortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="sayHello">
            <soap:operation style="document" soapAction=""/>
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
        </operation>
    </binding>

    <service name="HelloWorldService">
        <port name="HelloWorldPort" binding="tns:HelloWorldBinding">
            <soap:address location="http://localhost:9000/hello"/>
        </port>
    </service>
</definitions>

위의 XML 코드는 “HelloWorldService”라는 이름의 웹 서비스를 정의한 WSDL 파일 예시입니다. 실제 프로젝트에 맞게 해당 파일을 수정해야 합니다.

WSDL 파일을 기반으로 서비스 및 클라이언트 코드 생성

Apache CXF는 WSDL 파일을 기반으로 서비스와 클라이언트 코드를 자동으로 생성해주는 기능을 제공합니다. Maven 프로젝트인 경우, pom.xml 파일에 Apache CXF 플러그인을 추가하여 WSDL 파일을 기반으로 코드를 생성할 수 있습니다.

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-codegen-plugin</artifactId>
            <version>3.4.1</version>
            <executions>
                <execution>
                    <id>generate-sources</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>wsdl2java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/src/main/resources/wsdl/hello.wsdl</wsdl>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
        </plugin>
    </plugins>
</build>

위의 코드는 Maven 프로젝트에서 WSDL 파일을 기반으로 자바 코드를 생성하는데 필요한 Apache CXF 플러그인을 추가한 예시입니다.

서비스 구현

WSDL 파일을 기반으로 생성된 서비스 코드를 가지고, 해당 서비스의 구현을 작성해야 합니다. 이때 Apache CXF에서는 JAX-WS를 지원하므로, JAX-WS 스타일의 서비스를 구현할 때 주로 Annotation을 사용합니다.

@WebService
public class HelloWorldImpl implements HelloWorld {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}

위의 코드는 “HelloWorld”라는 서비스를 구현한 Java 코드입니다.

서비스 배포

마지막으로, 개발한 서비스를 배포해야 합니다. 이때는 Apache CXF에서 제공하는 내장 서버를 활용하거나, Apache Tomcat과 같은 외부 서버에 배포할 수 있습니다.

마치며

이렇게 Apache CXF를 사용하여 WSDL 기반의 웹 서비스를 개발하는 단계를 살펴보았습니다. Apache CXF를 이용하면 WSDL 파일을 기반으로 손쉽게 웹 서비스를 구현할 수 있으며, 다양한 프로토콜과 서비스 형식을 지원하여 다양한 환경에서 활용할 수 있습니다.

참고 자료