천객만래 [千客萬來] (It has an interminable succession of visitors)



도입

어플리케이션 개발은 종종 매우 역동적인 과정을 거치며, ‘즉각적인 사용가능이란 기술의 특성은 반복적인 개발 과정과 빈번한 발행을 가져온다.

사용자 품질확인 테스팅(UAT: User Acceptance Testing) 위한 빌드를 배포할 , 이는 고객들에게 현재 빌드가 다음과 같은 이유로 디버그 빌드임을 기억나도록 하는데 도움이 된다.

  1. 배너 안에 버전 번호가 보인다면, 피드백이 보내질 쉽게 참조하면 된다.
  2. 빌드 버전은 종종 동일한 어셈블리들의 릴리즈 버전에 비해 형평 없는 결과를 내놓는데, 배너가 이를 설명해주기도 한다.
  3. 사용자는 우연찮게 테스트 사이트를 사용하면서 사이트가 살아 있거나, 혹은 죽어있다고 생각하게 되는데(이런 일이 종종 일어난다!), 배너는 이를 분명하게 해준다.

문서는 점검중인 웹사이트의 ASPX 페이지에서 배너 개발 렌터링하는 HTTP 파이프라인에 대한 플러그인을 위한 매우 실용적인 코드를 설명하고 제공한다.

Web.config 파일에 적절한 설정을 추가하고, 배너 어셈블리가 사이트의 bin 디렉토리에 위치해 있어야 한다는 유일한 요구사항이다.

예제 배너는 페이지에 플로팅 이미지로 구석에 추가되기 때문에 페이지의 레이아웃에 방해가 되지 않는다. 이미지, ALT 텍스트, 그리고 자바스크립트는 모두 최종 어셈블리에 포함 리소스로 저장되며, 이는 완전한 독립실행형, 그리고 모듈러 (modular tool) 만든다.

배경과 전제조건

ASP.NET 기본 지식이 요구되고, HTTP 파이프라인에 대한 기본적인 이해가 도움이 되지만 필요하지는 않다. 사실, 예제를 실행시켜보고 싶을 따름이라면, 완성된 어셈블리를 다운로드 받고 아래 "설정" 부분으로 넘어가면 되겠다!

이미지 띄우기

페이지에 위치한 배너 이미지는 부분 투명 PNG, 페이지의 상단 오른쪽에 할당된 고정된 위치로 설정된 DIV 감싸여 있다. 자바스크립트는 하이퍼텍스트 스트림에 HTML 직접 삽입하기 보다는 페이지에 요구된 HTML 위치시키는데 사용된다.

<div style="Position: absolute;Top: 0;Right: 0;

    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>


이런
모두 갖춰지면, 어플리케이션의 모든 페이지는 디버그 어셈블리로 빌드 배너를 가지게 된다.

 

 

출처 : http://www.codeproject.com/KB/aspnet/BuildBanner.aspx

Posted by SB패밀리

출처 : MKEX''s 닷넷 커뮤니티 “박종명님"

 

여러 언어를 지원해야 하는 다국어 웹 사이트를 구축하기 위한 방법을 알아보자.

 

제일 쉬운 접근 방법은 각 언어에 해당하는 웹 사이트를 별도로 만드는 것이다.

그러나 이것은 접근 방법이 쉽다는 것 뿐, 개발 양적인 측면이나 유지/보수성을 생각한다면 결코 좋은 접근 방법이 아닐 것이다.

동일한 컨셉과 구조, 컨텐츠를 제공하는 웹 사이트가 단지 언어만 다르다는 이유로 쌍둥이 사이트를 새로 개발해야 한다는 문제점과

그렇게 구축된 웹 사이트의 특정 컨텐츠 추가나 변경을 해야 할 때에는 모든 웹 사이트를 다 수정해야 하는 문제점이 있다.

 

예전부터 효율적인 다국어 지원을 위해서 다양한 방법들이 개발자들에 의해 구현되어 왔었는데..

가장 보편적으로는 다국어 처리를 위한 일종의 유틸리티 성 모듈을 거쳐 처리하는 방식이 대부분 이었다.

 

이번 글에서는 닷넷이 제공하는 표준 리소스 메커니즘을 이용해 다국어 지원을 효율적으로 하는 방법을 알아 본다.

 

ASP.NET 1.x 2.0 모두 리소스를 이용할 수 있다.

닷넷의 리소스에 대한 개념은 다음 글에서 확인해 주길 바란다.

리소스(Resource)

 

ASP.NET 1.1 에서는 리소스를 이용한 다국어처리를 위해 ResourceManager 를 이용했었다.

그러나 ASP.NET 2.0에서는 보다 관리용이하고 개발용이 하도록 개선된 부분이 있다.

 

 

전역(Global) 리소스 파일 / 지역(Local) 리소스 파일

ASP.NET 2.0 에서는 리소스 파일의 사용 범위에 따라 전역,지역 두 가지로 분리되었다.

App_Code App_Data 처럼 리소스 파일 역시 예약된 폴더를 가지고 있다.

 

전역 리소스 파일 저장 -> App_GlobalResources

지역 리소스 파일 저장 -> App_LocalResources

 

전역 리소스는 말 그대로 웹 사이트 모든 영역에서 사용할 수 있으나

지역 리소스는 특정 단일 페이지(aspx, ascx, master) 에서만 사용가능하다.

또한 당연하겠지만 App_GlobalResources 폴더는 웹 사이트 루트에 단 1 개만 허용되지만 App_LocalResources 폴더는

웹 사이트 내의 모든 폴더에 하나 씩 존재해도 된다.

 

 

Web.Config 에 언어정보 추가하기.

언어 설정에 따른 지역화를 테스트 하기 위해 웹 사이트의 설정 파일인 Web.Config 파일에 다음과 같이 언어 정보를 기록하자.

<globalization uiCulture="en" />

일단 테스트를 위해 현재 UICulture 를 영어(en) 으로 설정하였다.

 

 

* 현재 브라우저에 설정된 기본 언어(첫 번째 언어) 를 참고해서 UICulture 를 지정하려면 ‘auto’ 를 사용하면 된다

<globalization uiCulture="auto" />

또는

<%@ Page UICulture="es" UICulture="auto" %>

 

이렇게 설정 하면 브라우저에 설정된 첫 번째 언어로 설정되게 된다



 

 

 

전역(Global) 리소스 이용하기.

웹 프로젝트에 App_GlobalResources 폴더를 생성하고 다음과 같이 리소스 파일을 생성하자.



 

  

언어 정보가 없는 Resource.resx 기본 리소스 파일이다.

이 리소스 파일은 해당 언어의 리소스 파일이 없을 경우 대체(fallback) 리소스 파일로 사용된다.

이 기본 리소스 파일을 한국어를 위한 리소스 파일로 사용할 것이며 영어를 지원하기 위해서 Resource.en.resx 을 사용한다.

 

리소스 파일명에 포함된 언어 정보는 정확히 기입해야 한다.

런타임에 ASP.NET  에서는 CurrentUICulture 속성과 가장 많이 일치 하는 리소스 파일을 자동으로 찾아서 사용하게 된다.

이때 참조되는 정보가 리소스 파일명이 된다.

 

각 국가별 언어 표현은 아래와 같이 확인할 수 있다.



  

이렇게 리소스 파일이 준비 되었으면 컨트롤의 지역화를 수행해 보자.

웹 페이지에 버턴과 Localize 컨트롤을 올리고 Text 속성에 명시적으로 지역화를 수행하도록 한다.

<asp:Button ID="Button1" runat="server"

        Text="<%$ Resources:Resource, Message %>" /><br />

              

<asp:Localize ID="Localize1" runat="server"

        Text="<%$ Resources:Resource, Message %>"></asp:Localize>

 

전역 리소스 파일을 사용할 경우 다음과 같은 표현식으로 리소스 내용을 참조하게 된다.

이를 명시적 지역화라 한다.

<%$ Resource: Class , Key %>

Class 의 경우 확장자와 언어정보를 제외한 리소스 파일명이 된다. 이 예에서는 Resource 가 된다.

Key 는 리소스 파일에 기록한 Key 정보 이다. Key 에 해당하는 Value 를 가져오는 것이 되겠다.

 

Localize 컨트롤은 닷넷 2.0에 새로 추가된 컨트롤로써 Literal 컨트롤을 상속받은 컨트롤이다.

이는 웹 페이지에 고정되고 정적인 내용을 표현하기 위한 가벼운 컨트롤 즈음 될 것이다.

(사실 Literal , Label 컨트롤로도 동일한 지역화를 구현할 수 있다)

 

이렇게 다 구현되었다면 Web.Config <globalization uiCulture="en" /> 내용을 변경하면서 테스트 해 보자.

아래는 en, ko 두 가지를 테스트 해본 결과 이다.



en으로 설정하면 Resource.en.resx 가 사용될 것이며

ko 로 했을 경우에는 Resource.ko.resx 가 없으므로 기본 리소스 파일인 Resource.resx 가 대체되어 사용되었다.

 

또한 다음과 같이 전역 리소스의 내용을 출력할 수 있다.

Response.Write(this.GetGlobalResourceObject("Resource", "Message"));

 

 

지역(Local) 리소스 이용하기.

웹 프로젝트의 원하는 폴더에(웹 루트도 상관없다) App_LocalResources 폴더를 생성하고 다음과 같이 리소스 파일을 생성하자.



 

이전과 동일하게 기본리소스와 영어지원을 위한 리소스 두 개를 생성하고 내용을 Key-Value 형태로 기록하였다.

 

주의 해야 할 것은 지역(Local) 리소스의 경우 특정 한 페이지만을 위한 리소스 이므로 페이지명과 연결 시켜서 리소스 파일명이 부여되어야 한다.

현재 이 예제에서는 Local.aspx.resx 리소스라는 말은 Local.aspx 라는 페이지를 위한 리소스 파일이 되는 것이다.

또한 닷넷 컨트롤의 속성과 리소스 파일의 Key 이름과도 연관성이 있는데, 이 예제에서는

ButtonResource.Text 라 했으므로 컨트롤의 Text 속성에 이 Key 가 자동으로 사용된다 라고 해석하면 되겠다.

 

일단 지역 리소스파일을 이용해 컨트롤의 지역화를 수행해 보자

<asp:Button ID="Button1" runat="server"

        Text="<%$ Resources: ButtonResource.Text %>" />

또는       

<asp:Button ID="Button2" runat="server" Text="DefaultText2"

        meta:resourcekey="ButtonResource" />

 

지역 리소스를 사용할 경우 전역 리소스처럼 명시적 지역화를 수행할 수도 있지만

Meta 태그를 이용한 암시적 지역화로도 사용가능하다.

암시적 지역화는 앞서 말했듯이 리소스 키 값만 연결해 주면 컨트롤의 특정 속성과 리소스 파일에 속성이 매칭되어 사용되는 것을 말한다.

 

또한 명시적 지역화를 사용할 경우에도 Class 명을 생략할 수 있다. 단일 페이지에 연결된 리소스 파일이기 때문에 굳이 리소스 파일명을

기입할 필요가 없는 것이다.

역시 Web.config 의 언어 정보를 변경하면서 수행하면 다음과 같이 결과가 나온다.



 

물론 지역(Local) 리소스 파일의 경우에도 다음과 같이 일반 출력이 가능하다

Response.Write(this.GetLocalResourceObject("ButtonResource.Text"));

 

 

전역(Global) 리소스 와 지역(Local) 리소스의 적용 상황

닷넷 프레임워크에서는 지역화를 위한 단일한 접근이 아니라 범위에 따른 두 개의 영역으로 리소스 파일을 관리하도록 하였다.

이 둘 중 어느것을 사용할 지에 대한 기준은 프로젝트의 성격에 따라 다르겠지만

일반적으로 다음과 같은 가이드 라인을 제공할 수 가 있겠다.

1)       공용 메시지나 단순 출력 메시지일 경우 전역 리소스 사용

2)       웹 사이트에 전역적으로 사용되는 메시지일 경우 전역 리소스 사용

3)       전역 리소스 파일이 너무 커져 협업의 어려움이나 관리의 어려움이 있을 경우 지역 리소스 사용
-
웹 사이트의 모든 페이지의 리소스를 하나의 전역 리소스에 다 표현한다면 파일을 관리하기도 어려울 것이며,
 
협업 시 발생하는 파일 동시 변경과 같은 문제점도 발생할 수 있다.
 
로컬 리소스를 사용하면 각 폴더마다 리소스 폴더를 별도로 둘 수 있으며 각 페이지에 해당하는 리소스 파일을 각각 생성함으로써
 
협업 시 서로 신경 쓰지 않고 작업할 수 있으며 페이지 별로 리소스를 관리하기 때문에 파일에 대한 관리도 용이해 질 수 있다.

4)       각 페이지의 컨트롤의 텍스트 표현(Text 속성)을 위해서는 지역 리소스 사용
- 3)
의 이유와도 동일함.
 
모든 페이지의 컨트롤 Text 속성을 단 하나의 전역 리소스에 포함해야 한다면.. 끔찍할 것이다.

 

이상의 가이드 라인을 기준으로 현재 프로젝트에 적합한 리소스 파일을 사용하기 바란다.

 

 

리소스를 이용한 웹 페이지 지역화에 대해 보다 상세한 내용은 다음의 MSDN 을 참고하기 바란다.

http://msdn2.microsoft.com/ko-kr/library/ms227427(VS.80).aspx

 

 

 

 

* 참고

아래 이미지를 보자


이와 같이 텍스트를 포함하는 이미지일 경우에도 다국어 처리를 해 주어야 한다.

여러 방법이 있을 수 있으나,

통상적으로 각 언어별로 이미지를 새로 만들어 폴더를 구분하는 방법이 있다.

이 경우에도 리소스 파일과 연계하여 사용하면 그나마 유연한 환경이 될 것이라 본다.

아래처럼 각 언어별 리소스 파일에 이미지의 경로를 기록하는 것이다.

 



 
그리고 아래와 같이 현재 UICulture 에 맞는 리소스의 경로를 참조하도록 한다.

<asp:Image ID="Image1" runat="server" ImageUrl="<%$ Resources:Resource, ImageUrl %>" />

또는       

<img src="<%$ Resources:Resource, ImageUrl %>" runat=server />

 

물론 웹 사이트의 모든 이미지를 서버 컨트롤로 만드는 것이 결코 좋은 선택은 아니다.

닷넷의 서버 컨트롤은 필요하다면 최소화 하는 것이 수행 속도 면에서는 좋을 수 있다.

 

여기서 말하는 이미지 다국어 처리 방법은 리소스와 연계한 힌트 성 글이니 이 글을 절대적으로 수용할 필요도 없으며

적합하지 않을 가능성이 크다.  그래서 참고인 것이다 ^^;

 

Posted by SB패밀리

스마트 클라이언트 프로젝트를 하다보니 여기저기서 안되는게 생기고
하는데.. 해결하고나서 보니 아무것도 아니지만 웹을 잘모느는 나로써는 찾는데 시간이 좀 걸렸다...

지금하고 있는 프로젝트가 원래는 따로 프레임웍을 만들어서 작업을 하기로 했는데
이전에 작업한 프레임웍과 프로젝트 소스에 합치기로 하면서 문제가 생겼다..

앞으로 하는 2개의 프로젝트를 기존 프로젝트에 붙여야 되는것이다...
별로 문제날 것은 없는데. 어떤 페이지에서 로긴하는가에 따라 다른 프로그램이 내부적으로 돌아가야 되는것이다.

첨에는 로긴페이지에서 플레그값을 전달받아 할려고 했는데... 그러다 보니 이전에 코딩을 해 놓은것에 고칠것이
많아서 이거 어떻게 손안대고 코푸는 방법을 생각하다보니 웹설정파일에 appSettings에 값을넣어서 읽어서
웹서비스에서 데이터를 처리 할 수 있었으면 좋겠다고 생각이 났다...

첨에는 쿠키등등 쓸데없는걸 알아봤는데...삽질만...

그런데 기존의 Web.config파일은 공통으로 빌드해서 써야 되니 appSettings를 다른 config파일로 빼고 싶어졌다

appSettings에 보니 file이라는 속성이 있어 알아 봤더니 다른 파일로 뺄수 있는게 아닌가 ...

그렇게 되면 웹을 다시 빌드 하지 않고도 따로 뺀 파일만 수정하면 자동으로 읽어서 동작하게 되는것이다...


<appSettings file="파일경로">
</appSettings>


이렇게 하면 된다.

따로 뺀 파일에는 <configuration> 태그를 쓰면 안된다.

<appSettings>
    <add key="systemname" value="CK"/>
</appSettings>


뭐 요런식으로 하면 된다 ....

Posted by SB패밀리