Bill Gibson, 프로그램 관리자
Microsoft Corporation
적용 대상 :
Microsoft Visual Studio 2005 Team System
기본적으로 Windows 응용 프로그램이나 ASP.NET 웹 응용 프로그램의 웹 서비스 접속은 응용 프로그램의 루트 프로젝트 내에 구현되는 웹 참조에 의해 처리됩니다. 그러나 구현 아키텍처 내부에서 즉 클래스 라이브러리나 DLL에서 접속을 처리하는 것이 바람직한 경우도 많이 존재합니다. 여기에서는 웹 서비스 접속이 어떻게 구현되는지, 클래스 라이브러리에서 행해지는 접속을 정의하는 방법, 특히, 처음에 루트 프로젝트에 작성된 웹 참조를 클래스 라이브러리에 안전하게 이동하는 방법을 설명합니다.
응용 프로그램과 웹 서비스와의 접속
Visual Studio Team Edition for Software Architects 버전에서는 응용 프로그램이란, 요약하여 배포하는 일련의 리소스 (어셈블리, 구성 파일 및 그 외의 파일 등)를 추상적으로 표현한 것입니다. 일반적으로 한 개의 응용 프로그램에는 그 응용 프로그램을 정의하는 Visual Studio의 프로젝트 하나에 대응하는 루트 리소스가 한 개 있습니다.
하나의 응용 프로그램에서 다른 응용 프로그램의 리소스에 접근해야 하는 경우 끝점 경유로 접근해야 합니다. 끝점 경유(Endpoint)란 SOA의 전송 계층에서 서비스나 프로세스를 처리할 수 있는 진입 점을 말한다. 서비스가 필요한 응용 프로그램에는 공급자 끝점(endpoint) 주소로 구성되는 등 소비자 끝점이 존재합니다. 이 공급자 끝점은 서비스를 제공하는 응용 프로그램 위에 존재합니다. 공급자 끝점은 응용 프로그램 리소스에 접근 할 수 있도록 하여, 이 응용 프로그램 리소스가 실제로 서비스 구현을 제공합니다.
Visual Studio에서는 일반적으로 프로젝트의 웹 서비스 접속에는 웹 참조 정의가 필요합니다. 웹 참조에서는 소비자 응용 프로그램의 루트 프로젝트 내부에 프록시 클래스를 생성하여, 그 클래스를 관리합니다. 정적 참조를 사용하는 경우를 제외한 루트 프로젝트의 class=SpellE>Web.config 파일 또는 class=SpellE>App.config 파일내에 적절한 구성 엔트리가 존재해야 합니다. 웹 참조가 작성되면, 그 프록시 클래스에는 그 프로젝트의 범위 내에서만 접근 가능해집니다. 기본적으로 응용 프로그램 디자이너를 사용하여 웹 서비스 접속을 작성할 경우에 소비자 응용 프로그램에 관련된 루트 프로젝트의 안에 웹 참조가 생성됩니다.
그러나 일반적인 아키텍처 패턴에서는 응용 프로그램의 루트 프로젝트는 (사용자 인터페이스, 프로그래밍 인터페이스)응용 프로그램의 공개된 인터페이스만을 처리하여, 비즈니스 논리는 한 개 이상의 클래스 라이브러리에 구현합니다. 이 패턴에 의해, 인터페이스의 문제와 비즈니스 논리의 문제가 분리되어, 비즈니스 논리의 구현을 재사용 할 수 있을 가능성이 높아집니다. 이 패턴에서는 다른 응용 프로그램에의 접근은 비즈니스 논리의 구현으로 실시하는 필요성이 높아집니다. 그 때문에 루트 프로젝트 내부 대신, 적절한 클래스 라이브러리 내에 웹 참조를 작성해야 합니다.
.NET 환경에서는 실행시에 클래스 라이브러리를 참조하는 응용 프로그램의 루트 프로젝트에서 클래스 라이브러리의 구성 문맥이 확립됩니다. 즉, 웹 참조를 포함한 클래스 라이브러리는 그 라이브러리가 실행되는 각 응용 프로그램 문맥에서 따로 따로 구성 및 접속할 수 있습니다.
Visual Studio 작업 중에 클래스 라이브러리 내에 웹 참조를 작성하면, 웹 서비스의 URL 를 포함한 구성 엔트리가 클래스 라이브러리 프로젝트의 class=SpellE>App.config 파일에 추가됩니다. 다만, 이 엔트리는 참조 전용으로 실행시에 클래스 라이브러리가 참조될 때는 사용되지 않습니다. 웹 참조를 구현하는 클래스 라이브러리에의 참조를 추가하는 경우는 적절한 구성 엔트리가 루트 프로젝트의 class=SpellE>Web.config 파일 또는 App.config 파일에도 반드시 추가되어야 합니다.
응용 프로그램 디자이너에 의한 클래스 라이브러리의 웹 참조 지원
응용 프로그램 디자이너에서는 루트 프로젝트의 구성 파일을 분석하고, 클래스 라이브러리의 웹 서비스에의 접속을 검색합니다. 적절한 구성 엔트리가 존재하여, 관련된 웹 참조 또는 프록시 클래스가 검색되면, 응용 프로그램 위의 소비자 끝점(endpoint) 및 적절한 웹 서비스 공급자 끝점 접속이 다이어그램 위에 표시됩니다.
이러한 끝점을 시작부터 추가하기 위해서 필요한 것은 웹 참조 또는 프록시 클래스를 포함한 클래스 라이브러리나 DLL의 참조를 추가하여, 대응하는 구성 파일 엔트리를 추가하면 됩니다.
다만, 접속이 먼저 응용 프로그램 다이어그램 위에서 확립되어 웹 참조가 루트 프로젝트내에 생성된 경우에 나중에 이 웹 참조를 클래스 라이브러리로 이동하기로 결정했을 경우, 이 시나리오는 그만큼 단순하지는 않습니다. 이것은 응용 프로그램 디자이너와 시스템 디자이너를 사용하여 응용 프로그램과 전체적인 시스템 아키텍처를 디자인 및 구현하여, 클래스 라이브러리를 사용하여 비즈니스 논리를 처리하는 경우의 일반적인 시나리오입니다.
웹 참조를 루트 프로젝트에서 클래스 라이브러리로 이동
웹 참조를 루트 프로젝트에서 클래스 라이브러리로 이동할 때에 작성된 시스템 다이어그램에 영향을 주지 않게 하는 경우는 주의해야 합니다. 여기에서는 이러한 경우의 문제점과 해결방법을 간단히 설명합니다.
Visual Studio에서는 프로젝트 사이의 웹 참조 이동은 단일 작업으로서는 지원되지 않습니다. 웹 참조를 이동하려면, 클래스 라이브러리 프로젝트에 새로운 웹 참조와 구성을 추가하여, 오래된 웹 참조를 루트 프로젝트에서 삭제해야 합니다. 두 가지 작업은 어느 쪽을 먼저 실행해도 결과가 바뀌지 않습니다.
웹 참조를 루트 프로젝트에서 삭제하면, 관련된 구성 엔트리가 삭제됩니다. 또, 응용 프로그램 다이어그램 내의 응용 프로그램 정의에서 소비자 끝점이 삭제됩니다. 이 끝점 삭제는 웹 참조를 삭제할 경우에 응용 프로그램 다이어그램이 열려 있는지에 관계없이 행해집니다. 웹 참조를 삭제할 경우에 다이어그램이 닫혀 있으면, 다이어그램을 다음에 열렸을 때에 끝점이 삭제됩니다.
클래스 라이브러리에 동등의 웹 참조를 추가하여, 여기에 대응하는 구성 엔트리를 루트 프로젝트의 구성 파일에 추가하면, 새로운 소비자 끝점이 응용 프로그램에 추가됩니다. 이 추가를 하려면, 클래스 라이브러리를 빌드해야 합니다. 같은 URL 값을 사용하면 가정하면, 이 새로운 끝점은 다이어그램 위에서 원래 끝점과 같은 서비스에 접속됩니다. 원래 끝점을 삭제하기 전에 새로운 끝점을 추가하면, 두개의 끝점과 같은 웹 서비스의 접속이 다이어그램 위에 표시됩니다.
시스템 다이어그램의 영향
새로운 끝점 추가보다 먼저 실시할지 이후에 실시할지에 관계없이 원래 소비자 끝점을 소비자 응용 프로그램에서 삭제하면, 응용 프로그램 디자이너 (열려 있는 경우 또는 다음에 열릴 때)에 의해서 이 응용 프로그램을 포함한 "열려있는" 시스템 다이어그램 모두에게 이 삭제가 반영됩니다. 이것에 의해, 각 시스템 다이어그램 내의 응용 프로그램 위의 대응하는 끝점이 삭제됩니다. 거기에 따르고, 그 끝점의 접속이나 위임도 모두, 이러한 다이어그램 위에서 삭제됩니다. 시스템 다이어그램내의, 영향을 받는 끝점이 삭제되면, 프록시 끝점도 삭제됩니다. 이것은 그 시스템을 사용하는 다른 모든 열려있는 시스템 다이어그램에 영향을 줍니다.
웹 참조를 표현하기 위한 새로운 끝점이 클래스 라이브러리에 추가되면, 이 추가도 열려있는 시스템 다이어그램 안에서 그 응용 프로그램이 사용되는 모두에게 반영되지만, 원래 끝점이 접속 또는 위임 된 경우에서도 새로운 끝점은 접속 또는 위임되지 않습니다. 시스템에서는 새로운 끝점의 목적을 인식하지 않고, 이 끝점이 어떻게 접속되어야 할지 판단할 수 없습니다. 이 동작은 시스템 다이어그램의 일반적 사용법과 일관성이 있습니다. 시스템 다이어그램의 일반적 사용법에서는 응용 프로그램 다이어그램 구성 변경은 자동적으로는 반영되지 않습니다. 시스템 다이어그램 내의 응용 프로그램은 응용 프로그램 다이어그램이나 다른 시스템 다이어그램의 구성과는 다른 방법으로 구성할 수 있습니다.
이 시점에서는 영향을 받는 시스템 다이어그램을 변경하여, 끝점을 재 접속 하거나 프록시 끝점을 다시 추가할 수 있습니다. 이것은 1 회만 하면 되기 때문에 귀찮은 작업이 아닙니다. 그러나 웹 서비스 접속을 클래스 라이브러리에 의해서 실시한다는 패턴을 채용하는 경우, 응용 프로그램을 구현 할 때에 웹 서비스의 소비자 끝점을 모두 루트 프로젝트에서 클래스 라이브러리로 이동하기 위해, 많은 접속이나 위임에 영향을 받을 가능성이 있습니다. 최악의 경우, 복잡한 아키텍처의 모든 시스템 다이어그램 내의 접속이 모두 삭제되어 다시 추가해야 할 수도 있습니다.
접속 유지
다만, 끝점 이동시에 시스템 다이어그램이 영향을 받지 않도록 하여 접속과 위임이 삭제되지 않도록 하는 간단한 방법이 있습니다. 다음에 방법을 보여줍니다.
- 참조 클래스 라이브러리에 대체 웹 참조를 추가하여, 이 클래스 라이브러리를 빌드합니다. 적절한 구성 엔트리를 루트 프로젝트의 구성 파일에 추가합니다. 응용 프로그램 다이어그램 위에 두 개의 끝점이 존재하여, 같은 웹 서비스에 접속됩니다.
- 소비자 응용 프로그램을 포함한 시스템 다이어그램을 모두 닫습니다.
- 응용 프로그램 다이어그램에서 원래 소비자 끝점에 사용되는 이름을 써둡니다. 이 이름은 속성 윈도우로 또는 다이어그램의 끝점에서 [Show Label] 를 선택하여, 확인할 수 있습니다.
- 다이어그램 위에서 원래 소비자 끝점을 삭제하거나 대응하는 웹 참조를 솔루션 탐색기에서 삭제합니다.
- 신규 추가한 소비자 끝점 이름을 원래 소비자 끝점과 같은 이름으로 변경합니다. 원래 끝점이 삭제될 때까지는 이것을 실시할 수 없습니다.
소비자 응용 프로그램을 참조하는 시스템 다이어그램을 다음에 열 때, 다이어그램에서는 이 변경이 검색 되지 않기 때문에 소비자 끝점은 변경되지 않고, 이전대로 접속 또는 위임된 대로 입니다. 원래 끝점을 삭제하기 전에 시스템 다이어그램을 닫아, 새로운 끝점에 원래 끝점과 같은 이름을 사용하는 것이 중요합니다. 시스템에 의한 응용 프로그램 끝점 참조는 이름에 근거합니다.
응용 프로그램 및 응용 프로그램 디자이너에서 표현에 관한 자세한 설명은 「응용 프로그램과 응용 프로그램 다이어그램」을 클래스 라이브러리 역할은 「클래스 라이브러리가 응용 프로그램 다이어그램 위에 표시되지 않는 이유」 를 참조해 주세요.
요약
응용 프로그램 디자이너에서는 응용 프로그램에서 참조 클래스 라이브러리와 DLL에 의해서 구현되는 웹 서비스 접속을 표현할 수 있습니다. 웹 참조를 응용 프로그램의 루트 프로젝트에서 클래스 라이브러리로 이동하는 경우에 사용하는 순서는 간단합니다.
이 순서에 따라서 시스템에서 접속과 프록시 끝점을 필요 이상으로 삭제하지 않도록 합니다.