본문 바로가기

.Net Technology/WCF

(3) WCF 아키텍쳐



WCF 아키텍처의 개요

WCF의 기본적인 개념부터 살펴보도록 하겠다. WCF에서 서비스와 클라이언트는 EndPoint를 통해서 통신을 하게 된다. 서비스에서는 여러 개의 EndPoint가 존재 할 수 있으며, 그 EndPoint를 통해서 메시지를 주고 받게 된다.

<그림 7> Endpoint를 통한 WCF의 통신

WCF에서는Endpoint만 잘 알고 있으면 WCF를 쉽게 다룰 수 있다. Endpoint는 다음과 같이 구성된다.

<그림 8> Endpoint의 구성

Endpoint는Address, Binding, Contract로 구성된다. WCF에서 반드시 알고 있어야 하는 구성들이다. 즉, 어디에서 무엇을 어떻게 보낼 것인지에 대한 규약이라고 보면 된다. 다음 그림은 WCF와 Endpoint의 관계를 잘 표현해 주고 있다.

<그림 9> WCF를 잘 하려면

WCF로 서비스를 구현하게 된다면 80%정도는 이 EndPoint를 설정하는 부분이 될 것이다. EndPoint는 다음 회차의 강좌에서 예제와 함께 구체적으로 살펴볼 예정이며, 이번 강좌에서는 간단하게 WCF의 서비스를 구현해 볼 것이다. 그럼 간단한 WCF 서비스를 하나 만들어 보도록 하자. 앞서 설명한대로 WCF는 높은 생산성을 가지고 있다. 즉, 몇 줄의 코드만으로 서비스의 여러 기능들을 구현 할 수 있다는 것이다. 자, 그럼 모든 개발 환경 준비 되었다면 WCF의 서비스를 한번 만들어 보도록 하겠다.

먼저 Visual Studio.NET 2005를 열어서 새 웹 사이트 열기를 선택한다. 닷넷 3.0 개발 툴이 설치 되어 있다면 다음과 같은 웹 사이트 창이 뜨게 될 것이다. 여기서 WinFX Service를 선택하도록 하자.


<화면 5> 새 웹 사이트

WinFX Service 프로젝트를 선택하면 다음과 같은 파일들이 자동으로 생성되게 된다.


<화면 6> WCF 프로젝트 파일

웹 서비스는 IIS에서 호스팅 된다. 하지만 WCF는 IIS에서도 할 수 있으며 자신이 직접 프로그램을 만들어서 Self 호스팅을 할 수도 있다. 이 부분은 다음 강좌에서 자세히 다루도록 하겠다. Service.svc는 서비스를 호스팅하는 파일이고, 실제 로직은 Service.cs에서 작성된다. 서비스의 구성이 웹 서비스와 비슷하다는 느낌을 받게 될 것이다.

그럼 먼저 Web.config 파일을 살펴보도록 하겠다. 

<system.serviceModel>

<services>

<service name="MyService" behaviorConfiguration="returnFaults">

<endpoint contract="IMyService" binding="wsHttpBinding"/>

</service>

</services>

<behaviors>

<serviceBehaviors>

<behavior name="returnFaults" >

<serviceDebug includeExceptionDetailInFaults="true" />

</behavior>

</serviceBehaviors>

</behaviors>

</system.serviceModel>


<리스트 1> Web.Config 파일


가장 최상위의 Service 엘리먼트를 보면 endpoint 가 추가 되어있는걸 볼 수 있다. Endpoint는 여러 개가 존재 할 수 있고, 앞서 설명 했듯이 Endpoint의 구성은 Address, Binding, Contract로 구성 된다고 했었다. 지금 endpoint에는 contract와 binding이 정의 되어있다. 그리고 Address는 IIS로 호스팅이 되는 주소가 바로 Address가 되기 때문에 생략하게 된다. 그럼 이제 자동으로 생성된 파일 중에 Service.cs 파일을 살펴보도록 하자.

using System;

using System.ServiceModel;

using System.Runtime.Serialization;

[ServiceContract()]

public interface IMyService

{

[OperationContract]

string MyOperation1(string myValue1);

[OperationContract]

string MyOperation2(DataContract1 dataContractValue);

}

public class MyService : IMyService

{

public string MyOperation1(string myValue1)

{

return "Hello: " + myValue1;

}

public string MyOperation2(DataContract1 dataContractValue)

{

return "Hello: " + dataContractValue.FirstName;

}

}

[DataContract]

public class DataContract1

{

string firstName;

string lastName;

[DataMember]

public string FirstName

{

get { return firstName; }

set { firstName = value }

}

[DataMember]

public string LastName

{

get { return lastName; }

set { lastName = value }

}

}

 


<리스트 2> Service.cs의 코드


2번 줄에는 System.ServiceModel 이라는 네임스페이스가 추가 되었다. WCF의 서비스의 필수적인 네임스페이스이다. 5~11줄에는 인터페이스가 선언되었다. 그리고 인터페이스에서는 ServiceContract 속성을 정의해 주고 있다. ServiceContract는 서비스 계약을 정의한다는 의미로 인터페이스 위에서 정의가 된다. OperationContract는 서비스 안에서 동작하는 기능을 정의하게 된다. 인터페이스로 만드는 이유는 서비스를 제공할 때 내부적인 코드를 감추고, 뼈대만 노출 시킬 수 있기 때문이다.

14~24줄에서는 인터페이스를 상속받아서 메서드 두개를 구현하였다. 첫번째 MyOperation1 메서드는 단순히 전달된 문자열을 받아서 Hello 와 함께 받은 문자열을 연결하여 반환하는 메서드이고, 두번째 MyOperation2는 26~44줄에서 정의한 데이터 형식의 인자값을 받아서 역시 Hello와 함께 반환해 주고 있다. 기본으로 만들어지는 툴을 기반으로 서비스를 한번 실행해 보도록 하자.


<화면 7> WCF 서비스 실행 화면

메시지를 살펴 보면 Metadata의 퍼블리싱이 불가능하다는 메시지가 나오게 된다. 그리고 Configuration에 다음과 같은 요소를 추가 하라고 자세히 설명해 주고 있다. 그럼 Web.Config를 열어서 Behavior 요소 안에 ServiceMetadata 항목을 추가하도록 하자.

<serviceMetadata httpGetEnabled="true" />

그리고 실행해서 결과를 다시 살펴 보도록 하자.


<화면 8> WCF 서비스 실행 화면

그럼 wsdl 의 주소가 링크 된다. wsdl은 웹 서비스 챕터 에서 자세히 다루어 보았다. 아래 나오는 코드는 C#에서 이 서비스를 호출할 때는 객체를 만들고 반드시 Close()를 실행하라는 예가 되겠다. 그럼 이것이 웹 서비스와 거의 똑 같은 기능을 하는데 WCF와의 차이점을 궁금해 할 수 있다. 하지만 WCF는 웹 서비스의 확장의 기능을 쉽게 구현할 수 있고, 자동 트랜잭션과 같은 기능 역시 쉽게 구현할 수 있다. 그럼 이제 클라이언트를 하나 만들어서 웹 서비스를 호출해 보도록 하겠다. 클라이언트 프로그램은 간단한 콘솔 프로그램으로 구현해 보도록 하겠다. 현재 솔루션에 새로운 콘솔 프로젝트를 추가한다.


<화면 9> WCF 콘솔 프로젝트 추가

콘솔 응용 프로그램을 추가했다면 이제 앞에서 구현한 서비스를 참조해 보도록 하겠다. 참조에서 오른쪽 마우스를 눌러서 서비스 참조 추가를 선택해 보자.


<화면 10> 서비스 참조 추가

그럼 서비스의 URI를 넣는 창이 뜨게 된다. 여기에 앞서서 구현한 서비스의 주소를 넣고 서비스 이름을 정의하고 확인 버튼을 누른다.


<화면 11> 서비스 Address

웹 서비스를 참조 했을 때와 비슷하게 새로운 폴더가 생기고 프록시 코드가 자동으로 생성된다. 즉, 서비스에서 구현한 인터페이스 같은 코드들이 자동으로 생성 된다는 것이다. 

 
<화면 12> 추가된 서비스

이제 서비스를 한번 호출해 보도록 하겠다. 서비스를 호출 할 때 역시 웹 서비스와 똑 같은 방법으로 호출하면 된다.

static void Main(string[] args)

{

using (WinFXService.MyServiceClient Svr = new WinFXService.MyServiceClient())

{

Console.WriteLine(Svr.MyOperation1("HOONS"));

}

}


using은 작업이 끝나면 객체를 자동으로 소멸해 주기 때문에 using 문을 사용하여 서비스 객체를 생성하였다. 그리고 MyOperation1이라는 메서드를 호출 하였다. 결과는 다음과 같다.



<화면 13> 서비스 호출 결과

자 이렇게 해서 WCF의 개념과 특징 그리고 WCF로 서비스 프로그래밍을 직접 만들어 보았다. 다음 호에서는 이제 본격적인 WCF 프로그래밍에 대해서 살펴 볼 예정이다. 앞서서 설명했듯이 WCF 프로그래밍의 가장 중요한 요소는 EndPoint이며, EndPoint는 Address, Contract, Binding으로 나누어지게 된다. 다음 호에서 바로 이 요소 하나하나를 자세하게 살펴보도록 하겠다.