상세 컨텐츠

본문 제목

spring boot soap web service

카테고리 없음

by somiyuralove 2023. 8. 3. 15:22

본문

프로젝트가 바빠서 한동한 글을 포스팅하지 못했습니다.

오늘은 스프링 부트에서 SOAP를 사용하는 방법에 대해서 알아보겠습니다.

스프링 공식 문서의 예제를 따라하면서 코딩 및 테스트를 진행하도록 하겠습니다.

공식 문서는 아래를 참고할 것입니다.

https://spring.io/guides/gs/consuming-web-service/

 

Getting Started | Consuming a SOAP web service

Spring WS uses Spring Framework’s OXM module, which has the Jaxb2Marshaller to serialize and deserialize XML requests, as the following example (from src/main/java/com/example/consumingwebservice/CountryConfiguration.java) shows: package com.example.cons

spring.io

가이드에서도 나와있듯이 java 1.8 이상, Gradle 7.5+ 이상 그리고 intellj에서 테스트 해보도록 하겠습니다.

전체소스는 아래에서 다운받을 수 있습니다.

git clone https://github.com/spring-guides/gs-consuming-web-service.git

 

GitHub - spring-guides/gs-consuming-web-service: Consuming a SOAP web service :: Learn how to create a client that consumes a WS

Consuming a SOAP web service :: Learn how to create a client that consumes a WSDL-based service - GitHub - spring-guides/gs-consuming-web-service: Consuming a SOAP web service :: Learn how to creat...

github.com

https://start.spring.io/ 로 가서 프로젝트 생성을 합니다.

dependency로 spring web service를 선택하고 제너레이트 해주었습니다.

 

제너레이트된 프젝트를 intellij에서 아래와 같이 불러왔습니다.

build.gradle 을 열어서 아래와 같이 수정합니다.

 
sourceSets {
    main {
        java {
            srcDir 'src/main/java'
            srcDir 'build/generated-sources/jaxb' // xsd 파일을 통해서 역직렬화되어 생성되는 자바 클래스파일의 위치
        }
    }
}
// xsd 파일을 토대로 자바 클래스 파일을 생성한다
task genJaxb {
    ext.sourcesDir = "${buildDir}/generated-sources/jaxb"
    ext.schema = "src/main/resources/countries.xsd"

    outputs.dir sourcesDir

    doLast() {
        // 커스텀 Ant 태스크를 만든다.
        project.ant {
            taskdef name: "xjc", classname: "com.sun.tools.xjc.XJCTask",
                    classpath: configurations.jaxb.asPath
            mkdir(dir: sourcesDir)
            // 위에서 입력한 스키마 폴더와 소스디렉토리에 .xsd 파일을 토대로 XML을 자바 객체로 역직렬화(Unmarshalling) 한다.
            xjc(destdir: sourcesDir, schema: schema) {
                arg(value: "-wsdl")
                produces(dir: sourcesDir, includes: "**/*.java")
            }
        }
    }
}

compileJava.dependsOn genJaxb
dependencies {
   implementation 'org.springframework.boot:spring-boot-starter-web-services'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
   jaxb("org.glassfish.jaxb:jaxb-xjc")
   implementation 'com.sun.xml.bind:jaxb-core:4.0.2'
   implementation 'javax.xml.bind:jaxb-api:2.4.0-b180830.0359'
   implementation 'com.sun.xml.bind:jaxb-impl:4.0.2'
}

jaxb 디펜던시와 task genJaxb를 정의해주었습니다.

src/main/resources/countries.xsd 파일을 아래와 같이 생성해주었습니다.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://spring.io/guides/gs-producing-web-service"
           targetNamespace="http://spring.io/guides/gs-producing-web-service" elementFormDefault="qualified">

    <xs:element name="getCountryRequest">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="getCountryResponse">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="country" type="tns:country"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="country">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="population" type="xs:int"/>
            <xs:element name="capital" type="xs:string"/>
            <xs:element name="currency" type="tns:currency"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="currency">
        <xs:restriction base="xs:string">
            <xs:enumeration value="GBP"/>
            <xs:enumeration value="EUR"/>
            <xs:enumeration value="PLN"/>
        </xs:restriction>
    </xs:simpleType>
</xs:schema>

 

터미널로 가서 ./gradlew compileJava 명령으로 정상적으로 컴파일 되는지 확인합니다.

컴파일이 이상없이 되었다면 소스의 빌드경로에 build/generated-sources 경로에 xsd(countries.xsd) 파일을 읽어서 제너레이트된 소스를 확인 하실 수 있습니다.

 

to-be continued...

 

댓글 영역