스프링에서는 웹서비스(SOAP)의 구현을 위한 라이브러리와 어노테이션을 제공 합니다. 웹서비스는 네트워크 상에서 서로 다른 종류의 컴퓨터들 간에 상호작용을 하기 위한 소프트웨어 시스템입니다.
웹서비스도 일종의 통신 프로토콜 방식으로 연결 되는데 SOAP, WSDL, UDDI 스택으로 이루어집니다.
SOAP은 WSDL(Web Services Description Language)을 통해 서비스를 정의하며, 클라이언트와 서버 간의 메시지 교환을 위해 XML 기반의 메시지 포맷을 사용합니다.
SOAP은 데이터를 제공해주는 ENDPOINT인 서버단과 데이터를 제공받으려고 요청하는 클라이언트 단이 있습니다.
이번에는 ENDPOINT인 서버단 구현에 대해 알아보고자 합니다.
스프링으로 WSDL 파일 생성
WSDL(Web Services Description Language)은 웹 서비스를 설명하기 위한 XML 기반의 언어입니다. 특정 웹 서비스의 구체적인 내용이 기술되어 있어 프로토콜, 데이터 포맷들을 더욱 상세하게 정의하는 스크립트입니다. WSDL은 SOAP와 XML 스키마와 결합하여 인터넷 상에 웹 서비스를 제공하기 위해 사용되며, 웹 서비스에 연결되는 클라이언트 프로그램은 WSDL 파일을 읽어들여 서버에 어떤 조작이 가능한지를 결정할 수 있습니다. 현재의 WSDL 버전은 2.0입니다.
1. WSDL 작성을 위한 메시지 정의로 XSD 파일을 만듭니다.
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/users"
xmlns="http://example.com/users"
elementFormDefault="qualified">
<xs:element name="UserDetails">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
2. XSD 규격을 바탕으로 한 WSDL 발행하기
스프링에서 XSD를 바탕으로 WSDL을 발행할때는 WSDL파일 직접 작성할 필요 없이 SpringWsConfiguration클래스에 빈을 추가하여 발행 할 수 있습니다.
@Configuration
@EnableWs
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<>(servlet, "/ws/*");
}
@Bean(name = "example")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema exampleSchema) {
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("ExamplePort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace("http://example.com/ws/example");
wsdl11Definition.setSchema(exampleSchema);
return wsdl11Definition;
}
@Bean
public XsdSchema exampleSchema() {
return new SimpleXsdSchema(new ClassPathResource("example.xsd"));
}
}
3. 실제 클라이언트 요청이 왔을때 해당 데이터를 전송해주는 엔드포인트 구현
@Endpoint
public class UserEndpoint {
private static final String NAMESPACE_URI = "http://example.com/ws/example";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "UserDetails")
@ResponsePayload
public UserResponse getUser(@RequestPayload UserRequest request) {
UserResponse response = new UserResponse();
// 사용자 정보 조회 로직 구현
return response;
}
}
@Endpoint 어노테이션 설정으로 웹서비스의 엔드포인트로 액세스 가능하게 되고 @PayloadRoot 어노테이션을 붙여 서비스 요청을 매핑하여 데이터를 처리 해줍니다.
@ResponsePayload는 데이터를 클라이언트에게 보내주는 응답 데이터라는 의미이고 @RequestPayload는 클라이언가 요청한 데이터 입력값을 가지고 있는 요청 데이터라는 의미를 가집니다.
'웹개발 > spring && springboot' 카테고리의 다른 글
[Springboot]유효성 검사 에러 노출 (0) | 2024.04.03 |
---|---|
spring validation (0) | 2024.04.03 |
스프링 페이징 pageble (0) | 2024.03.30 |
SPRING 스케쥴러(Scheduler) (0) | 2024.03.28 |
spring 프로젝트의 문서화 (0) | 2024.03.28 |