.Net 에서 웹서비스(Web Service) 동적으로 참조하기~!!
안녕하세요? 이번 티스토링에서는 .Net Framework에서 개발하시는 분들을 위한 내용입니다. 끝까지 꼭 읽어 주셔야만 왜 동적으로 웹서비스(Web Service)를 호출하는지 이해할 수 있으실 겁니다. 우선 웹서비스(Web Service)에 대해서 알아 보겠습니다.
서로 다른 컴퓨팅 환경의 모든 애플리케이션들이 직접 소통하고 실행될 수 있도록 동적 시스템 환경을 구현해 주는 소프트웨어 컴포넌트입니다. 단순 객체 접근 프로토콜(SOAP), 웹 서비스 기술 언어(WSDL), 전역 비즈니스 레지스트리(UDDI) 등의 표준 기술을 사용하여 네트워크에 연결된 다른 컴퓨터 간의 분산 컴퓨팅을 지원하는 소프트웨어 및 기술들입니다.
위 내용은 네이버 지식백과에서 가져온 내용입니다. 내용이 조금 어렵게 설명이 되어 있기는 하지만 넘가도록 하겠습니다. 본 내용을 찾아 오시는 분들은 대부분 아실꺼라 생각이 됩니다. 아래는 각 용어에 대한 간단한 설명입니다.
- SOAP(Simple Object Access Protocol) : 웹상에 연결된 컴퓨터속에 있는 각 객체들을 액세스 하기 위한 프로토콜
- WSDL(Web Service Description Language) : 어떤 등록처나 저장소에 자료를 저장하려면 어떤자료가 어디에 어떤형식으로 저장되는지 알아야 사용이 가능한데 이런 특정서비스의 설명과 접근방법을 XML언어기반으로 제공
- UDDI(Universal Description, Descovery Intergration) : 기업이나 단체, 개인이 자신들의 서비스내용을 인터넷상에 등록할 수 있게하는 XML 기반의 등록처
아래 그림은 UDDI를 도식화한 그림입니다.
비주얼 스튜디오(Visual Studio) 2008을 이용하여 웹서비스를 하나 생성하고 동적으로 참조해서 결과를 보여드리도록 하겠습니다. 저는 VB.NET을 기준으로 설명을 드리겠습니다. C#.NET 역시 큰 차이가 없이 진행 할 수 있을 껍니다.
1. 웹서비스 생성
비주얼 스튜디오(Visual Studio)를 실행 하시고 "파일(F)" -> "새 프로젝트(P)... Ctrl+N"으로 들어갑니다. "ASP.NET 웹서비스 응용프로그램"을 선택하시고 프로젝트 이름(N), 위치(L), 솔루션 이름(M)을 입력하시고 확인을 클릭합니다(저는 MyWebService로 생성을 했습니다).
생성을 하시면 Service1이라는 클래스(Class)가 생성이 되고 메서드로 HelloWorld가 생성이 됩니다.
클래스명을 Service1에서 TextService로 변경하겠습니다. 오른쪽 솔루션 탐색기에서 Service1.asmx를 TextService로 변경하였습니다. 그리고 HelloWorld 메서드에 이름을 넘겨받을 _Name 파라미터와 넘겨받은 _Name로 인사말을 리턴하도록 수정 하였습니다.
여기서 주의해야 할 부분이 있습니다. 웹서비스의 클래스가 변경이 되면 노출을 위한 태그를 수정해야 됩니다. 아래와 같이 솔루션 탐색기에서 TextService.asmx에서 마우스 오른쪽 클릭을 하고 "태그 보기(K)"를 하시면 태그 소스가 나타납니다. Class부분을 변경하신 클래스(Class)로 수정하시면 됩니다.
이제 "F5"을 눌러 실행을 한번 해보겠습니다. http://localhost:xxxx/TextService.asmx 서비스 요청 수소가 나타납니다(프로젝트 속성에 웹 텝에서 포트를 지정할 수 있습니다). 웹 브라우저에는 요청가능한 메서드(서비스)가 나타납니다.
HelloWorld을 클릭해서 이동하면 위에서 추가했던 메서드의 파라미터에 값을 넣을 수 있는 입력항목이 나타납니다. 저는 dsun을 입력하였습니다.
호출 버튼을 누리면 요청결과가 XML 형태로 출력이 됩니다. 요청결과는 "dsun, Hello World"가 나타납니다.
비주얼 스튜디오에서 웹서비스 프로젝트를 실행하면 ASP.NET Development Server 가 실행이 되게 됩니다. 트레이 아이콘을 찾아 보시면 아래 그림의 같이 아래쪽 가운데 아이콘과 같은 항목이 보입니다. 비주얼 스튜디오에서 실행을 종료 하더라도 ASP.NET Development Server는 계속 실행중으로 있어서 브라우저에서 서비스를 호출 할 수 있습니다.
2. 동적으로 웹서비스 호출하기
이번에는 앞에서 생성한 웹서비스를 동적으로 호출해 보겠습니다. 현재 솔루션에서 프로젝트를 추가하겠습니다. "파일(F)" -> "추가(D)" -> "새 프로젝트(N)..." -> "Windows Form 응용프로그램"을 선택하고 이름과 위치를 지정합니다(저는 MyApplication으로 이름을 입력하였습니다).
프로젝트가 추가되면 Form1을 아래 그림과 같이 TextBox, Button을 추가 합니다. 두 컨트롤의 이름을 TextBox_Name, Button_Invoke으로 변경하였습니다.
MyApplication 프로젝트에 클래스를 하나 생성합니다. 클래스(Class) 이름은 WsProxy로 추가 하였습니다.
WsProxy.vb 소스코드를 아래에 첨부된 소스로 내용을 복사합니다(기존의 WsProxy.vb 소스는 모두 삭제를 합니다).
다음으로 System.Web.Services 참고를 추가합니다.
이제 다시 Form1.vb로 돌아와서 호출 버튼을 더블클릭해서 이벤트를 생성합니다. 그리고 아래와 같이 코딩을 합니다. MyApplication 프로젝트를 실행하시면 Form1 윈도우 창이 뜹니다. 그리고 호출 버튼을 클릭하면 WsProxy.CallWebService 함수를 실행하여 웹서비스를 동적으로 호출하고 결과를 가져옵니다.
아래 그림과 같이 "dsun, Hello World" 메시지 창이 뜹니다.
WsProxy.vb 소스 내용은 웹서비스의 WSDL정보를 받아와서 Service Description을 생성합니다. CodeDomProvider로 CompilerParameters, CodeCompileUnit를 전달받아 컴파일(Compile)을 합니다. 컴파일된 어셈블리(CompiledAssembly)로 인스턴스를 생성(CreateInstance)하여 서비스 메소드를 호출하도록 되어 있습니다.
3. 웹 참조 추가로 웹서비스 호출하기
이번에는 기존에 사용하고 계시는 웹 참조 추가로 웹서비스를 호출해 보겠습니다. MyApplication 프로젝트에서 오른쪽 클릭을 하셔서 "웹 참조 추가(E)..."를 하시면 웹참조 추가 화면이 나타납니다.
URL(U)에 http://localhost:xxxx/TextService.asmx 를 입력하시고 이동을 클릭하시면 웹서비스를 불러 옵니다. "웹 참조 이름(N)"에 참조 이름을 입력하시고 "참조 추가(R)"를 하시면 웹서비스가 추가 됩니다(저는 WsProxyStatic로 참조 이름을 입력했습니다).
Form1.vb 소스를 열어서 아래와 같이 기존에 입력된 소스는 주석처리를 하고 수정을 합니다.
MyApplication 프로젝트를 실행하시면 Form1 윈도우 창이 뜹니다. 그리고 호출 버튼을 클릭하면 WsProxyStatic.TextService.HelloWorld 함수를 실행하여 웹서비스를 호출하고 결과를 가져옵니다.
동적으로 웹서비스를 호출 했던것과 똑같은 결과를 얻을 수가 있습니다.
4. 동적으러 웹서비스를 호출하는 이유
후자에서 설명한 웹 참조 추가를 통하면 간편하게 추가가 되고 소스도 단순하다는 것을 알 수 있습니다. 만약에 MyApplication 프로젝트에서 참조해야 되는 서비스가 1개가 아니라면 웹서비스 참조 추가를 그만큼 해줘야 됩니다.
또 웹 서비스가 변경(WSDL이 변경)이 되면 기존의 웹서비스를 수정하거나 삭제를 하고 다시 추가 해야 됩니다. 동적으로 처리를 하면 필요한 웹서비스를 관리하기가 편해지며 서비스 변경에 대해서 대응하기가 한결 쉬워집니다.
단점이 존재하기는 합니다. WSDL을 매번 가져와서 웹서비스를 컴파일해야 되어 성능에 문제가 될 수 있습니다. 이러한 문제도 생성된 웹서비스를 재활용 하도록 한다면 큰 문제가 없을 것입니다. 개선된 소스가 필요하신 분은 댓글로 이메일 주소를 남겨 주시면 도움을 드리도록 하겠습니다.
'IT > Develop' 카테고리의 다른 글
Visual Basic 6.0에서 닷넷(.Net) 라이브러리(DLL) 사용하기~!! (4) | 2014.04.07 |
---|---|
MS SQL에서 DB, LOG 축소 쿼리 (2) | 2014.04.03 |
웹 디버깅 툴로 알려진 피들러(Fiddler)- Web Debugging Proxy (4) | 2014.02.18 |
개발자 질문하는 방법 !! (0) | 2014.01.21 |
[윈도우앱] Lotto365 앱 개발 티스토링 (0) | 2014.01.07 |