본문 바로가기

IT 살이/04. 기술 - 프로그래밍

[연재 06] 서비스 컨트랙트 정의하기

혹시 여러분은 Windows Live Writer라는 프로그램을 아시나요?  브라우저를 통해서 블로그에 직접 로그인하지 않고도 이 프로그램에서 포스트를 작성해서 바로 블로그로 글을 올릴 수 있습니다. 호오 정말 편합니다. 한번 이 프로그램을 검색해서 알아보세요. 마이크로소프트에서는 이 프로그램에 대한 SDK를 배포하고 있습니다. 직접 애플리케이션에서 이런 기능을 구현할 수 있다는 것이죠. 호오...지금 이 포스트도 이 프로그램으로 작성해서 올리고 있습니다.

서비스 컨트랙트를 정의한다는 것은 외부로 노출되는 전체 서비스에 대한 왁구(토목 현장에서 많이 쓰는 말이다 -_-;)를 만드는 일이라고 볼 수 있다. 메타 정의(?)라고나 할까. 구현(implementation)과는 구분되는 단계이다.  서비스 컨트랙트는 WCF에서는 ServiceContractAttribute로 정의되어 있다. ServiceContractAttribute는 전체 서비스를 정의하는 인터페이스(또는 클래스)에 붙어서 외부로 서비스가 가능한 타입임을 나타낸다.

서비스 컨트랙트는 다시 여러 하위 컨트랙트로 구성되어 진다.

하위컨트랙트     어트리뷰트정의
오퍼레이션컨트랙트     OperatinContractAttribute
데이터컨트랙트     DataContractAttribute
메세지컨트랙트     MessageContract

오퍼레이션 컨트랙트에서는 "메소드 호출과 관련"한 사항을 정의할 수 있다.  예를 들어 어떤 메세지 교환 방법(Message Exchange Pattern, MEP)을 사용할 것인가를 이곳에서 정의할 수 있다. WCF의 메세지 교환 방법에는 Request/Reply 패턴, OneWay 패턴, Duplex(two-way) 패턴등이 지원된다.

서비스 컨트랙트에는 Input, Output 파라미터나 리턴값에 대한 정의를 할 수 있는 데이터 컨트랙트를 표현할 수 있다. 앞에서 본 "Hello World, WCF 버전"에서는 리턴값으로 String 타입을 사용했다. 그러나 복잡하고 다양한 사용자 정의 타입의 객체를 리턴해 줄 수 있다. 클라이언트로 직렬화될때 객체의 특정 멤버만을 포함하도록 설정할 수도 있고, 직렬화 방법도 데이터 컨트랙트에서 지정할 수 있다.

데이터 교환은 SOAP 메세지를 통해서 교환된다. 즉 메세지의 헤더나 바디등에 데이터가 포함되어 오고가게 된다. 메세지를 통해서 데이터(파라미터, 리턴값)가 전달되는 모습을 그림을 그려보면 다음과 같을 것이다.
1060355043

대부분의 WCF 애플리케이션에서는 데이터의 구조나 직렬화 방법등이 이슈가 되지만 어떤 경우는 그 데이터를 포함하는 메세지 구조를 제어하는 것이 중요한 경우도 있다. 예를 들어 메세지 레벨에서의 보안 문제(Security issue)를 다룰려고 할 때는 파라미터나 리턴값을 직접 메세지로 직렬화하는 메세지 컨트랙트를 정의할 수 있다.

정의되어 있는 이런 컨트랙트를 이해하고 사용하는 방법을 하나씩 알아가는 것이 WCF를 이해하게 되는 것이 아닐까 싶다. 다음 포스트부터 본격적으로 이런 컨트랙트 관련 내용의 아티클을 번역해볼 려고 한다.