도입
웹 어플리케이션 개발은 종종 매우 역동적인 과정을 거치며, ‘즉각적인 사용가능’이란 기술의 특성은 반복적인 개발 과정과 빈번한 발행을 가져온다.
사용자 품질확인 테스팅(UAT: User Acceptance Testing)를 위한 빌드를 배포할 때, 이는 고객들에게 현재 빌드가 다음과 같은 이유로 디버그 빌드임을 기억나도록 하는데 도움이 된다.
- 이 배너 안에 버전 번호가 보인다면, 피드백이 보내질 때 쉽게 참조하면 된다.
- 빌드 버전은 종종 동일한 어셈블리들의 릴리즈 버전에 비해 형평 없는 결과를 내놓는데, 이 배너가 이를 설명해주기도 한다.
- 사용자는 우연찮게 이 테스트 사이트를 사용하면서 이 사이트가 살아 있거나, 혹은 죽어있다고 생각하게 되는데(이런 일이 종종 일어난다!), 배너는 이를 분명하게 해준다.
이 문서는 점검중인 웹사이트의 ASPX 페이지에서 ‘배너 개발’을 렌터링하는 HTTP 파이프라인에 대한 플러그인을 위한 매우 실용적인 코드를 설명하고 제공한다.
Web.config 파일에 적절한 설정을 추가하고, 배너 어셈블리가 사이트의 bin 디렉토리에 위치해 있어야 한다는 게 유일한 요구사항이다.
예제 배너는 페이지에 플로팅 이미지로 한 구석에 추가되기 때문에 페이지의 레이아웃에 방해가 되지 않는다. 이미지, ALT 텍스트, 그리고 자바스크립트는 모두 최종 어셈블리에 포함 리소스로 저장되며, 이는 완전한 독립실행형, 그리고 모듈러 툴(modular tool)로 만든다.
배경과 전제조건
ASP.NET의 기본 지식이 요구되고, HTTP 파이프라인에 대한 기본적인 이해가 도움이 되지만 꼭 필요하지는 않다. 사실, 예제를 실행시켜보고 싶을 따름이라면, 완성된 어셈블리를 다운로드 받고 아래 "설정" 부분으로 넘어가면 되겠다!
이미지 띄우기
웹 페이지에 위치한 배너 이미지는 부분 투명 PNG로, 페이지의 상단 오른쪽에 할당된 고정된 위치로 설정된 DIV로 감싸여 있다. 자바스크립트는 하이퍼텍스트 스트림에 HTML을 직접 삽입하기 보다는 페이지에 요구된 HTML을 위치시키는데 사용된다.
<div style="Position:
Background: transparent;Filter: Alpha(Opacity=60);-moz-opacity:.60;opacity:.60;">
<img src="{0}" alt=\"development build: version {1}\" />
</div>
String 형식은 HTML string에 배너 이미지의 경로와 대체 텍스트(alternate text,)를 삽입하기 위해 사용된다.
// 실행중인 어셈블리의 버전 가져오기,
// 즉 배너 대체 텍스트에서 사용되어야 하는 어셈블리의 버전
Version version = page.GetType().BaseType.Assembly.GetName().Version;
// 로컬 리소스에서 배너 HTML을 검색하고,
// 이미지와 대체 텍스트를 위한 동적 URL을 삽입
string szHtml = string.Format(BuildConfigurationBannerResources.BannerHtml,
page.ClientScript.GetWebResourceUrl(GetType(),
"Common.Web.Resources.BannerImage.png"), version);
// 페이지가 로드된 후에 HTML에서 DOM으로 삽입되는 자바스크립트 등록
page.ClientScript.RegisterStartupScript(GetType(), "DevelopmentBanner",
string.Format("Event.observe(window, 'load', function()
{{new Insertion.Bottom($(document.body), '{0}');}});", szHtml), true);
HTTP 파이프라인: 동작중인 ASP 조작
HTTP 파이프라인은 ASP.Net의 실행 시퀸스로, HTTP 요청을 다룰 때 실행의 시퀸스를 다룬다.
기본적으로, HTTP 모듈은 IHttpModule 인터페이스의 구현물로, Web.config를 통해 이 실행 시퀸스를 병합시키도록 설정하며, 개발자들은 이 파이프라인에 쉽사리 기능을 추가하도록 해준다.
런타임 때 제공되는 모든 ASP.NET 페이지에 사용자지정 자바스크립트를 등록하기 위해서 HTTP 모듈을 사용하려 한다.
관심을 갖고 있는 파이프라인 이벤트는 PreRequestHandlerExecute로, 우리의 사용자 지정 자바스크립트를 첨부할 것이다. HTML 콘텐츠를 직접 조작해야 해야 하지만, HTML 결과를 차례로 다루는 C# Page 오브젝트 모델을 사용하면 HTML 파싱의 복잡한 작업을 자초할 필요는 없다.
어플리케이션의 Context Handler를 통해서 Page 오브젝트에 접근 가능하며, 이번 경우엔 ASPX 페이지(AXD, 혹은 런타임 매핑 URL 타입과는 대조적으로)를 위한 요청인 Page 인스턴스이다.
IHttpHandler handler = application.Context.Handler;
if (handler is Page)
{
Page page = handler as Page;
if (IsAssemblyDebugBuild(page))
{
...
}
}
배너 표시 여부 결정
웹 어플리케이션 어셈블리가 디버그 빌드인지 결정하기 위해서는, 디버그 빌드 동안 닷넷 컴파일러에 의해 삽입된 어셈블리 내의 다음 코드에서 DebuggableAttribute를 찾아야 한다.
private bool IsAssemblyDebugBuild(Page page)
{
foreach (Attribute att in
page.GetType().BaseType.Assembly.GetCustomAttributes(false))
if (att is System.Diagnostics.DebuggableAttribute)
return (att as System.Diagnostics.DebuggableAttribute).IsJITTrackingEnabled;
return false;
}
설정
웹 어플리케이션에 배너를 사용하도록 설정하기 위해서, 웹 어플리케이션의 bin 디렉토리에 배너 어셈블리가 포함되어 있어야 하고, Web.config 파일에 다음 XML을 추가해야 한다.
<httpModules>
<add name="Banner" type="Common.Web.Modules.BuildConfigurationBannerModule,
Common.Web"/>
</httpModules>
이런 게 모두 갖춰지면, 어플리케이션의 모든 웹 페이지는 디버그 어셈블리로 빌드 할 때 배너를 가지게 된다.
'IT-개발,DB' 카테고리의 다른 글
[개발] Javascript로 Excel파일 만들어보자 (0) | 2010.10.28 |
---|---|
[개발] 웹 응용 프로그램에서 보다 효율적인 ASP.NET 파일 다운로드 구축 (0) | 2010.10.28 |
[개발] ASP.NET <% %>, <%= %>, <%# %>의 차이점 (0) | 2010.10.27 |
[개발/asp.net] ASP.NET 2.0 다국어지원 웹사이트 구축하기 (0) | 2010.10.27 |
[asp.net] ASP.NET 2.0 웹 페이지 전역화를 위한 Culture 및 UI Culture 설정 (0) | 2010.10.27 |
댓글