프로젝트가 바빠서 한동한 글을 포스팅하지 못했습니다.
오늘은 스프링 부트에서 SOAP를 사용하는 방법에 대해서 알아보겠습니다.
스프링 공식 문서의 예제를 따라하면서 코딩 및 테스트를 진행하도록 하겠습니다.
공식 문서는 아래를 참고할 것입니다.
https://spring.io/guides/gs/consuming-web-service/
가이드에서도 나와있듯이 java 1.8 이상, Gradle 7.5+ 이상 그리고 intellj에서 테스트 해보도록 하겠습니다.
전체소스는 아래에서 다운받을 수 있습니다.
git clone https://github.com/spring-guides/gs-consuming-web-service.git
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...
댓글 영역