Ace-T's Blog 내 검색 [네이버 커넥트 이웃 합니다~^-^/ 요청 大 환영~~]

[SOAP] 웹서비스를 구축하여 보자!(apache cxf 사용?)

OpenSource/Apache CXF 2014.05.28 18:24
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

Webservice 유용 정의

http://www.ehow.com/info_12212371_definition-service-endpoint.html



위의 용어중에 endpoint라는 것이 있다.


기본적으로 consumer - provider 이런 용어가 있는데 

endpoint라는 친구는 provider에서 공개적으로 열어 놓는 것이다.


그래서 여기에서의 시나리오는 이러하다.


환경은 Spring + Maven 기반이고, 첫번째로 endpoint구성 후 soap UI라는 것을 통해 동작을 살펴보자.

두번째로는 아파치 cxf를 통해서 consumer에서 사용 할 stub code를 생성하자. 여기까지 해보겠다 ㅋㅋ 프록시를 만들어서 코드를 짜는 것은 우선 패스~~:D


자 시작해보자! ㅎㅎㅎ

1) web.xml 설정

   아래와 같이 Servlet설정을 해보자.


  <!-- cxf Webservice DispatcherServlce  -->

  <servlet>

         <servlet-name>CXFServlet</servlet-name>

          <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

   </servlet>

 

   <!--CXF Webservice Dispatcher Servlet Mapping -->

   <servlet-mapping>

          <servlet-name>CXFServlet</servlet-name>

          <url-pattern>/webservice/*</url-pattern>

   </servlet-mapping>


2) Spring 소스 설정

     아래와 같이 RndProvider.java(인터페이스) 와 구현체인 RndProviderImpl.java를 만들고

     context-webservice.xml을 생성하여 endpoint를 만들어보자.





RndProvider.java


RndProviderImpl.java


context-webservice.xml



우선 context-webservice.xml을 살펴보자.

<jaxws:endpoint id="rndProvider"

                              implementor="kr.pe.constr.webservice.RndProviderImpl"

                              address="/RndProvider" />


위의 부분이 endpoint의 설정부분이며 RndProviderImpl.java가 연결 되어져있다.


그런 다음 서버를 기동 하여 아래의 주소를 치면 WSDL의 주소가 나오게 된다.




클릭을 하게 되면 아래와 같이 wsdl이 생기게 된다. (http://localhost:9080/webservice/RndProvider?wsdl)




 그런 다음 soap ui를 통해 테스트 해보자. 우선은 다운로드!! http://www.soapui.org/



RndProviderImpl.java에서의 소스 내용은 아래와 같다.

@Override

public int acet(UserVo userVo) {

// TODO Auto-generated method stub

System.out.println(userVo.getId()+"====="+userVo.getName());

if(userVo.getId().equals("acet")){

   return 1000;

}

return 0;

}


그러므로 코딩에 의해서 0이 나오게 된다.


이제는 stub code를 apache cxf를 통해서 만들어보자.

우선 apache cxf를 셋팅하자.  

다운로드 : http://www.apache.org/dyn/closer.cgi?path=/cxf/3.0.0/apache-cxf-3.0.0.tar.gz


pom.xml에도 디펜던시를 추가해줘야 한다.

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-frontend-jaxws</artifactId>

            <version>${cxf.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-transports-http</artifactId>

            <version>${cxf.version}</version>

        </dependency>

        <dependency>

            <groupId>org.apache.cxf</groupId>

            <artifactId>cxf-rt-transports-http-jetty</artifactId>

            <version>${cxf.version}</version>

        </dependency>

참고 사이트 : http://svn.apache.org/viewvc/cxf/trunk/distribution/src/main/release/samples/java_first_spring_support/


cxf의 bin아래로 가서 다음의 명령어를 실행한다.

wsdl2java -client -p kr.pe.constr.webservice.consumer.stub -impl -validate -exsh false -dns true -dex true -wsdlLocation http://localhost:9080/webservice/RndProvider?wsdl -encoding UTF-8 -verbose -defaultValues -fe jaxws -db jaxb -wv 1.1 RndProvider.wsdl


명령어로 나온 소스를 아래와 같이 스프링쪽으로 옮겨준다.(단, 이 소스는 consumer쪽 소스이다!!)





단, RndProviderImplService.java에서 아래의 오류나는 부분은 삭제를 한다.




프록시를 하나 만들어서 원하는 아파치 cxf를 통해 나온 stub 코드를 통해 consumer에서 provider에서 열어놓은 endpoint쪽을 접근해 실행 시킨다.


참고 사이트 : http://cxf.apache.org/docs/writing-a-service-with-spring.html


     - END -

acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

SOAP(Simple Object Access Protocol)이란?

OpenSource/Spring MVC 2012.11.09 15:25
[Good Comment!!, Good Discussion!!, Good Contens!!]
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T

soap??? 비누?? @.@;;;;;

웹을 구현하는데 있어서...Web Service라는 놈이라는 장벽에 부딪혔다..ㅠ.ㅠ..
모르면 학습만 있을뿐!! +ㅁ+/ good~

SOAP은 XML과 HTTP 통신을 기반으로 하여 네트워크 상에 존재하는 각종 컴포넌트간의 호출을
효율적으로 실현하기 위한 방법을 제시하는 규약이다.
다시 말해 네크워크상에서 Client와 Service Provider간에 메시지를 요청하고 이에 응답해주는 방법을 제공!
이러한 방식들은 기존의 RPC(Remote Procedure Call)이라 묶여서 불려오던 것이고 SOAP은 RPC의 한가지 방법이라 할 수 있다.

SOAP의 특징
1) Application Layer Protocal 들 중에 HTTP를 사용함으로써 여러 시스템간의 통신과 통합을 위한
    좀 더 단순하면서도 가벼운 메카니즘을 제공.
2) HTTP를 사용하게 된 중요한 이유는 바로 방화벽에 제한을 받지 않는 범용성 때문이라 할 수 있다.
    다른 Application Layer Protocal의 경우 그들만의 약정된 TCP or UDP 포트를 사용하기 때문에
    인터넷상에 설치 되어있는 방화벽에 많은 제약을 받게 된다.
3) SOAP은 SOAP만이 가지는 특정한 HTTP Header를 방화벽의 필터링 부분에 보냄으로써 메시지의
    통과여부를 가릴 수 있게 하는 방법으로 보안이라는 문제를 해결한다.

SOAP 내부
1) SOAP은 크게 네가지로 구성 되어있다,
  [1] SOAP envelope
        : Message에 무엇이 있는가. 누가 무엇을 다루는가, 어떤 것이 Optional 이고 manatory를
           나타내기 위한 전체적인 Framework를 제공한다.
   [2] SOAP encoding rules
        : Application에 정의 된 data type들의 instance를 교환하는데 사용되는 메카니즘이다.
   [3] SOAP RPC 표현
        : Remote procedure call과 response들을 나타내는데 사용되는 규약을 정의 한다.
   [4] SOAP binding
        : 두 peer간의 전송 프로토콜을 사용하여 SOAP envelope 교환에 대한 규약을 정의 한다.

위의 4가지 중 envelope와 encoding rule은 서로 다른 namespace에 정의되어있는 XML이며,
link를 걸어 놓음으로써 정의된 내용을 사용 할 수 있다.

SOAP은 Message Based Protocol이기 때문에 두 시스템간의 통합 시 쌍방 간의 Message Format만을 약속하면 되므로 통합시간 및 효율을 높일 수 있으며, 매우간단하다.(레알??)



SOAP은 HTTP 통신을 위한 WebServer, XML과 Service Provider의 3가지로 구성 되어있다.

★ SOAP의 동작방식
 1) Client가 어떤 Service Provider의 Service가 어떤 것이 있는지를 파악하기 위해 제공하는 Service의 
     목록을 HTTP를 통해 XML 형태로 요청한다.
     (만약 목록을 이미 알고 있는 경우이면 이 과정은 생략 가능)

 2) Server는 자신이 제공하는 Service의 목록을 XML로 응답을 보낸다.
     (만약 목록을 이미 알고 있는 경우이면 이 과정은 생략 가능)

 3) 응답을 받는 Client는 그 중 자신이 원하는 Service를 알아내어 다시 Provider에 요청한다.

 4) Provider는 받는 요청에 대한 처리를 한 후 결과를 되돌려준다.

2. SOAP Message

 

다음은 HTTP Request 속에 포함된 SOAP Message의 구조이다..

 

POST /StockQuote HTTP/1.1

Host: www.stockquoteserver.com

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

SOAPAction: "http://example.org/2001/06/quotes"

 

<Envelope ...>

   <Header>

      ......

   </Header>

 

   <Body>

      <Content>

         ......

      </Content>

   </Body>

</Envelope>

 

° Envelope : Root Tag로써 SOAP Message가 시작됨을 나타낸다.

° Header : 가외의 정보를 나타내기 위한 것으로 생략이 가능하다.

° Body :  내용이 들어가는 Tag이며 다양한 형태의 태그들이 들어간다.

° Content : 서비스에 대한 요청이나 응답이 들어간다.

 

 

일단 간단한 예제를 보면서 이해해보자

 

SOAP은 XML의 형태로 Message를 교환한다

 

 

 Example 1 ( Request Message 형태 )

 

POST /StockQuote HTTP/1.1

Host: www.stockquoteserver.com

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

SOAPAction: "http://example.org/2001/06/quotes"

 

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

 <env:Body>

  <m:GetLastTradePrice

        env:encodingStyle="http://www.w3.org/2001/06/soap-encoding"

        xmlns:m="http://example.org/2001/06/quotes">

    <symbol>DIS</symbol>

  </m:GetLastTradePrice>

 </env:Body>

</env:Envelope>

 

Service Provider가 가지고 있는 서비스 중에 LastTradePrice 정보를 요청하는 SOAP Message로 DIS의 값을 요구하고 있다.

[위에서 말했듯이 서비스 파악!!을 하는 거라 할 수 있다.

 "Service의 목록을 HTTP를 통해 XML 형태로 요청한다."]
 

 

 

 Example 2 (Response Message 형태 )

 

HTTP/1.1 200 OK

Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

 

<env:Envelope xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

 <env:Body>

  <m:GetLastTradePriceResponse

        env:encodingStyle="http://www.w3.org/2001/06/soap-encoding"

        xmlns:m="http://example.org/2001/06/quotes">

   <Price>34.5</Price>

  </m:GetLastTradePriceResponse>

 </env:Body>

</env:Envelope>

 

Response Message의 경우에는 Client가 요청한 Service 이름에 Response가 붙게되며(GetLastTradePriceResponse) Request에 대한 결과 값을 가지고 있다.

 

 

그럼 좀더 구체적으로 살펴보자!!!!

 

2-1. SOAP Envelope

 

SOAP Message는 필수항목인 SOAP envelope와 생략 가능한 SOAP Header 그리고 SOAP Body로 구성되어 있는 XML Document이다.

 

2-2. SOAP Header

 

SOAP는 Header라는 element를 통해 통신을 하는 쌍방 간의 어떤 제약없이 Message를 확장할  있는융통성 있는 구조를 제공한다. 일반적으로 Header는 authentication이나 transaction과 같은 비교적 연관성이 없는 정보들을 구현할  있도록 해준다.  Header element는 SOAP Envelope 바로 다음에 오는 번째 Child element로서 모든 Header 다음에 오는 Child element들을 Header Entry라고 한다.

 

Example 3 ( SOAP Header block )

 

<env:Header xmlns:env="http://www.w3.org/2001/06/soap-envelope" >

  <t:Transaction xmlns:t="http://example.org/2001/06/tx" env:mustUnderstand="1" >

    5

  </t:Transaction>

</env:Header>

 

2-3 SOAP Body

 

SOAP Body element는 필수 정보를 교환하기 위해 사용되는 간단한 메카니즘을 제공한다. 
일반적으로Body는 어떤 결과나 error를 보고하기 위해 사용된다. Body는 SOAP Envelope 바로 다음에 오는 Childelement로서 만약 Header가 존재하면 Header 다음에 와야하고 Header가 정의되어있지 않으면Envelope 바로 다음에 와야한다. Header와 마찬가지로 Body element 바로 다음에 오는 Child element들을 Body entry라고 부른다.

 

2-4. Fault Code

 

SOAP은 error를 reporting 하기 위해 Fault element를 사용한다.  Fault element는 다음과 같은 Childelement로 구성된다.

 

° faultcode : Software나 Provider가 사용하는 error number로 error를 구분하기 위해 사용된다. 반드시존재해야하는 element이다.

° faultstring : error에 대한 간단한 이유나 제목을 기술하며 반드시 존재해야하는 element이다.

° faultactor : message 경로에서 누구에 의해 야기되는 error인지에 대한 정보를 나타낸다. 반드시 존재해야하는 것은 아니다.

° detail : error에 대한 상세 정보를 기술한다. 반드시 요구되는 것은 아니고 사용자가 정의한 error tag가  있다.

 

Example 4 ( SOAP Fault Code )

 

<env:Envelope xmlns:env='http://www.w3.org/2001/06/soap-envelope'

                      xmlns:f='http://www.w3.org/2001/06/soap-faults' >

  <env:Header>

    <f:Misunderstood qname='abc:Extension1'

                                xmlns:abc='http://example.org/2001/06/ext' />

    <f:Misunderstood qname='def:Extension2'

                                xmlns:def='http://example.com/stuff' />

  </env:Header>

  <env:Body>

    <env:Fault>

      <faultcode>MustUnderstand</faultcode>

      <faultstring>One or more mandatory headers not understood</faultstring>

    </env:Fault>

  </env:Body>

</env:Envelope>


출처 : http://blog.naver.com/devils129/80009306881

참고 사이트 :  http://www.w3.org/TR/2011/REC-ws-soap-assertions-20111213/
참고 자료     : http://ettrends.etri.re.kr/PDFData/25-2_112_120.pdf

참고내용

더보기


acet 박태하가 추천하는 readtrend 추천글!

설정

트랙백

댓글

:::: facebook을 이용하시는 분들은 로그인 후 아래에 코멘트를 남겨주세요 ::::

티스토리 툴바