Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

이클립스(Eclipse)에서 웹서비스 클라이언트 만들기

사용자 삽입 이미지
여기서 웹서비스는 웹으로 하는 서비스를 얘기하는게 아니고 기술이름인 웹서비스를 말하는 것이다. 내가 웹서비스라는 말을 처음 들은 것은 올 2월정도였던 것 같다. 그뒤로는 심심찮게 들리고 있지만.... 이런게 있는지도 몰랐었다. ㅡ..ㅡ  그때 당시 회의에 들어가서 웹서비스를 나는 웹으로 하는 서비스라고 당연히 생각하고 있었기 때문에 회의내용을 도저히 이해 못하고 있었고 나와서 웹서비스가 기술중 하나의 이름이라는 것을 알게 되었다. (그당시에는 보편적인 이름이 아니었는지 몰라도 네이밍 센스 한번.. ㅡ..ㅡ 이건 현대에서 자동차 새로 만들었는데 모델명이 자동차라고 지은거랑 똑같잖아.. ㅡ..ㅡ)

어쨌든 웹서비스란게 있다. 쉽게 말하면 이기종간의 통신을 위한 것이다. SOAP, WSDL, UDDI등을 이용해서 자바사에서 C#으로 만들어진 서비스에 요청을 보내도 응답을 받을 수 있다. 그 이념과 목표는 대단했지만 너무 복잡한 스펙덕분에 빛을 발휘 못하고 요즘은 그나마 지원하는 툴들이 많아져서 괜찮아진것 같지만 REST의 등장으로 인하여 아주 큰 주목을 받지 못하고 있는 듯 하다. 검색해 보면 웹서비스에 대한 많은 글들을 볼수가 있고 크게 뜨진 못했지만 웹서비스는 끝났다라고 말할수는 없는듯 하다. REST가 뜨면서 같이 다시 주목받고 있는 듯한 느낌도.... 한글 위키피디아는 간략한 내용밖에 없고 좀 자세한 걸 보려면 역시 영문 위키피디아의 내용을 보아야 한다.(오른쪽 그림이 웹서비스 아키텍쳐)

물론 나도 웹서비스를 거의 이해하고 있지 못하다. 올초 관련 사업이(하진 않았지만) 있어서 책을 좀 보았는데 스펙에 대한(XML) 설명만 너무 길게 있어서 이해하기가 쉽지 않았다.(나의 내공으로는...) 대충 머하는 것인지만 알고 있지 그래서 어쩌라고? 정도의 수준이다.. ㅡ..ㅡ




어쨌든 그래도 웹서비스라는게 있다라는 걸 안것 만으로도 일단 도움이 되었다고 할 수는 있는데 최근에 웹서비스 클라이언트를 만들어야 되는 상황이 왔다. 쉽게 말하면 우리 시스템은 자바기반인데 다른 시스템의 닷넷기반에서 만들어준 웹서비스를 우리쪽에서 호출해서 값만 받아오면 끝나는 문제. 상황은 아주 명확하고 WSDL도 받았는데 위에 말한대로 그래서 어쩌라고? ㅡ..ㅡ 어떻게 호출하는 지를 몰랐다. 여기저기 찾아다녔지만 이렇다할 정보를 찾을수 없었고 클라이언트 구현하자고 책펴놓고 웹서비스 자체를 다 공부하기에는 시간이 모자랐다.


물어볼 사람도 없고 답답한 와중에 kenu님의 포스팅을 발견했다. 깜깜하던 가운데 발견한 한줄기 빛이...
이클립스로 쉽게 웹서비스 시작하기
이클립스로 웹서비스 개발 쉽게하기 part2



일단 익히기 위해서 따라해본 다음에 강좌에서는 자바로 기능을 만들어서 서버/클라이언트를 모두 만들었지만 난 만들어진 서버의 WSDL이 있는 상황이었기 때문에 이것저것 만져가면서 클라이언트 부분만 구현을 했다. 자세한 내용은 kenu님의 포스팅을 참고하고 내가 확인해본 바로는 3.2 WTP나 3.3 Europa나 둘다 웹서비스를 만드는 기능이 있었다. 당연히 3.4 Ganymede에도 있을꺼라 생각하고 그 이하버전에 대해서는 확인안해봐서 정확히 모르겠다.

사용자 삽입 이미지

일단 New Project를 만든다. 웹으로 할것이므로 당연히 "Dynamic Web Project"로 생성한다. 이름은 적당히 주고...

사용자 삽입 이미지

만들어진 프로젝트에서 오른쪽 마우스를 눌어서 New - Other를 실행한다.

사용자 삽입 이미지

Other로 들어가면 너무 많이 나오기 때문에 상단 filter란을 통해서 Web Service를 찾는다. 여기서는 클라이언트만 만들 것이므로 "Web Service Client"를 실행한다.

사용자 삽입 이미지

client레벨을 Test까지 올려준다.(정확한 차이는 잘 모르겠다.) 캡쳐에는 안나왔지만 Monitor the Web Service를 체크하면 웹서비스를 이클립스에서 모니터할 수 있다. 상당 Service definition에 wsdl의 위치를 넣어주어야 한다. Browse를 눌어서

사용자 삽입 이미지
WSDL의 위치를 넣으면 아래쪽에 선택한 WSDL에 대한 정보(?)가 나타난다. 내가 실제 사용했던 것은 펼치고 열어볼수 있었는데 사업에 쓴 WSDL을 공개할 순 없어서 공개된 구글 WSDL을 썼더니 Read Only로만 나타난다. WSDL의 차이로 인한 형상인듯 하다. 어쨌든 가운데 칸에 WSDL에 대한 것이 나와야 한다. 잘못된 WSDL일 경우에는 나오지 않는다.


이게 끝이다. Finish를 눌러주면 스스로 WSDL을 분석해서 소스를 뱉어준다.(WSDL에 따라 생성되는 시간은 좀 다른것 같다.)

사용자 삽입 이미지

위의 프로젝트가 Web Service 자동생성으로 만들어진 코드이다. TestClient.jsp를 실행하면

사용자 삽입 이미지

위와같은 화면이 나오고 웹서비스 프로바이더에서 제공하는 함수를 클릭해서 테스트해볼 수 있는 페이지가 제공된다. 관련함수들 중에서 Proxy라는 이름이 붙은(여기서는 GoogleSearchPortProxy.java)파일에 제공된 함수들이 정의되어 있다. 실제적으로 사용할때도 이것만 사용하면 된다.



method.jsp에서 각 함수별로 파라미터로 분류 숫자를 넘겨주고 input에서 case문으로 각 함수별로 필요한 필드값을 보여준다. 그리고 Result에서 동일하게 case문을 이용해서 실제 함수를 실행한다. 결국 함수 사용법을 참고하려면 Result만 보면 된다.(input쪽도 필요하면 같이 참고하고...)


<jsp:useBean id="sampleGoogleSearchPortProxyid" scope="session" class="GoogleSearch.GoogleSearchPortProxy" />
<%
    if (request.getParameter("endpoint") != null && request.getParameter("endpoint").length() > 0)
        sampleGoogleSearchPortProxyid.setEndpoint(request.getParameter("endpoint"));
%>


다양하게 안해봐서 항상 같은지는 모르겠지만 보통 위와 같은 코드는 기본적으로 들어간다. 물론 WSDL마다 이름은 달라지겠지 GoogleSearchPortProxy의 Bean을 생성하고 엔드포인트(정확한 의미는 모르겠다.)를 생성한다. 이정도가 기초작업인것 같다. 그 다음부터는 그냥 Bean의 객체를 사용해서 자바에서 메서드 사용하듯이 GoogleSearchPortProxy를 호출하고 파라미터를 넘겨주면 된다.

위의 예시해서 한 GoogleSearch에서는 이런 형태가 없었지만 내가 만진 WSDL에서는 다음과 같은 형태가 있었다. 메서드 동작은 중요하지 않으니 정의형 형태만 보자

public void getInfo(java.lang.String strID, javax.xml.rpc.holders.IntHolder getInfoResult, javax.xml.rpc.holders.StringHolder strInfo)

WSDL을 가지고 이클립스에서 자동생성을 했더니 저런식으로 만들어 주었다. 여기서 API정의를 보면 실제 내가 넘기는 파라미터는 strID뿐이고 getInfoResult와 strInfo는 내가 메서드 호출 결과로 받아야 할 리턴값들이었다. 생전 처음보는 타입들이었기 때문에 고생을 좀 했는데 Holder라는 타입의 변수를 미리 정의해 놓고 메서드 호출할 때 파라미터로 넘겨주면 메서드 호출후 해당 변수에 결과값이 할당된다.(결과값이 여러개인 API정의를 보고 신기했는데.. 이것 말고 다른 방법이 있는지 모르겠지만 일단 이클립스에서는 이렇게 생성을 해 주었다.)


javax.xml.rpc.holders.IntHolder infoResult= new javax.xml.rpc.holders.IntHolder(-1);
javax.xml.rpc.holders.StringHolder info= new javax.xml.rpc.holders.StringHolder("");

Proxyid.getInfo(id, infoResult, info);

System.out.println("result : " + infoResult.value);
System.out.println("info: " + info.value);


결과값을 가져올 때는 value속성을 이용해서 가져온다. 이렇게만 하면 웹서비스 클라이언트를 이용할 수 있다. XML로 된 WSDL문서만 가지고 이렇게 자동화 할 수 있다는 점은 참 신기하긴 하다.





전체에 구동에 대해서 이해하지 못한채로 구현에만 초점을 맞추는 것은 내가 추구하는 방식은 아니지만 항상 그렇게만 할수는 없는 노릇이니까(특히 이번처럼 파악해야 할 것의 덩치가 무지 큰 경우에는....) 다음에 또 접할 기회가 생기면 더 잘 이해할 수 있겠지....
2008/08/18 14:07 2008/08/18 14:07