ⓜⓨ ⓢⓣⓞⓡⓨ - 해당되는 글 90건
1. 단지 $ 축약형 하나만을 위해 Java Script Framework인 prototype.js(이하 프로토타입) 를
 쓸것인가....
  럭셔리한 Java Script Action을 위해 프로토타입 사용을 고민한 사람들이 있을것이다...
 이 소스는 약 200키로바이트로 얼마 안되어 보이지만 웹 브라우저와 클라이언트의 측면에서는
 대단히 무거운 소스이다.
   아래는 이 프레임웍에서 자주 사용되는 소스를 활용한 효과적인 팁중 하나이다.
 
  var $ = function(element) {
      return document.getElementById(elemelt);
  }
  위 소스는 프로토타입에서 단순히 $변수명 입력시에 객체를 리턴하기 위한 일부 기능을 소스로
  표현한 것이다 이 기능을 사용하기 위해서 위 소스를 직접 구현하여 사용하여도 된다.
    또는 아래와 같은 소스도 유용하다
  var $ = document.getElmentById;

2. innerHTML을 위해 길게 늘어쓴 String 연산
   Ajax또는 비동기 페이지를 위해 아래와 같은 소스를 사용한 경험들이 있을 것이다.

   var strHTML = "<div id='abcd'>";
   strHTML += "태그들";
   strHTML += "태그들";
   strHTML += "태그들";
   .....
   strHTML += "</div>";

   하지만 위 코드는 치명적인 단점이 있다(특히 IE에서) 왜냐하면 IE를 대표적으로 브라우저에서
  스트링 연산이 빠르지 않아 클라이언트의 부하가 늘수 있다는 것이다.
   아래는 이를 대처하기 위한 방법이다.
  var strHTML = new Array();
   strHTML.push(" 태그들 ");
   strHTML.push(" 태그들 ");
   strHTML.push(" 태그들 ");
   .....
   retrun strHTML.join("");

   위는 배열을 사용하여 배열에 추가하고 총합하여 리턴해주는 방식이다. 이 방식이 상위의
  스트링 연산의 방식보다 속도측면에서 개선할 수 있다고 한다.

3. Document 모델 보다는 DOM 형식의 ID로 찾기
   처음 또는 초보 개발자들은 document.(Form 이름).(컨트롤 이름).(속성) = "값"; 이런 방식으로
  구현해본 경험이 있을것이다.. 이는 W3C 표준에서는 document.getElementByID("ID 명").속성
  = "값"
과 같은 형태로 사용하기를 권장하고 있다.

4. Pseudo code 사용의 자제
   아래와 같은 코드를 대부분 사용해 본적이 있을 것이다.
   <a href ="javascript:goTo();">여기로 이동</a>
  
   위 사항 보다는 아래와 같은 방식을 추천한다.
 
   <a href="#" onclick="goTo();">여기로 이동</a>  또는
    <a href = "anyURL" onclick = "goTo();return false;">여기로 이동</a>
  
   이유는 코드 가독성 및 표준개발 가이드에 입각한 내용이라고 한다.

- 위 내용은 Daum Communication 구경택님의 자료를 바탕으로 했으며 저작권은 http://no7do.tistory.com/ 의 블로거 김도영과 구경택님에게 있음-


|
생일 : 2008년 1월 20일(음력 12월 13일)
집주소 : 서울특별시 강서구 화곡동 111-38호 101호 김도영
신발사이즈 : 270mm


1. 온라인 상품권
사용자 삽입 이미지

디앤샵상품권

제일 문안한 선물이죠 ㅋㅋㅋ 10만원권을 바라는건 아니지만 요즘 힘들다 보니 ㅋㅋㅋ


2. 문화 상품권
사용자 삽입 이미지

책도 보고 영화도 볼수 있는 문화 상품권 ㅎㅎ 공부 열심히 하려고요~ ㅋㅋㅋ

3, 전자레인지
사용자 삽입 이미지
http://itempage.auction.co.kr/detailview.aspx?itemNo=a104444003&firstView=&DR030114=&hdcapital=&mobile=

전자레인지.....살림하는데 정말 필요하더라구요 ㅜ.ㅜ 맨날 남는 음식때문에 걱정을 덜어버리고 싶어~

4. 운동화

반스
사용자 삽입 이미지
http://navershop.lotte.com/go.nhn?mn=%B7%D4%B5%A5%B4%E5%C4%C4&url=http%3A%2F%2Fnaverprice.lotte.com%2Fnaverprice.jsp%3FcurGoodsNo%3D7768673%26curDispNo%3D044009005012024&nv_pchs=WJf8C7p4KhLziEmylRBoEw%3D%3D

뉴 발란스
사용자 삽입 이미지

http://navershop.mall.shinsegae.com/go.nhn?mn=%BD%C5%BC%BC%B0%E8%B8%F4&url=http%3A%2F%2Fmall.shinsegae.com%2Fitem%2Fitem.do%3Fmethod%3DviewItemDetail%26item_id%3D10041300%26ckwhere%3Dnaver&nv_pchs=Sb2W1Sbl3Nxyly2KzctsVJ5WBjHGuih%2F

나이키
사용자 삽입 이미지

http://runtop.co.kr/~runtop/index.php?pgurl=shop%2Fsh_goods_view&salegdno=1255&gtype=1&nv_pchs=mgeRx7h1ZRmwHJtdsV7DwbQqiM1XaXNJ

5. 명함지갑
사용자 삽입 이미지


http://shopping.naver.com/shoppingBar/go.nhn?mn=%BA%F3%C6%FA&url=http%3A%2F%2Fwww.beanpole.com%2Fshop%2Fproduct_detail.jsp%3Fbrand_group%3DY%26brand_cd%3DBC%26style%3DBE8Z9MA145%26category%3DCBB%26flash_main%3D2%26flash_sub%3D11%26from%3Dnavery&nv_pchs=FcqvoxDmM0bxfVWOx67%2FU9jq%2BAQqMLSJ

이제 직장인인데 명함지갑 하나는 필요하겠죠 ㅋㅋㅋㅋ

6. 지갑
사용자 삽입 이미지


http://shopping.naver.com/shoppingBar/go.nhn?mn=%BA%F3%C6%FA&url=http%3A%2F%2Fwww.beanpole.com%2Fshop%2Fproduct_detail.jsp%3Fbrand_group%3DY%26brand_cd%3DBC%26style%3DBE8Z9MA115%26category%3DCBB%26flash_main%3D2%26flash_sub%3D11%26from%3Dnavery&nv_pchs=FcqvoxDmM0bxfVWOx67%2FU1eBiCOBttgI

돈 많이 벌어야죠 ㅋㅋㅋ 지갑~

생일 : 2008년 1월 20일(음력 12월 13일)
집주소 : 서울특별시 강서구 화곡동 111-38호 101호 김도영
신발사이즈 : 270mm
|
IT 면접 채용관이「가장 싫어하는 19개 단어」

돕다, 도왔다
․ 피해야 하는 이유: 채용관리자들은 지원자가 도운 것이 아니라 직접 한 일을 알고 싶어한다. 이력서에 적을 만한 일이라면 '돕다'보다는 나은 어휘를 골라야 한다.
․ 예) PDA 연구를 통해 마케팅 디렉터를 도왔다.
․ 가능한 다른 표현: 마케팅 부서를 위해 PDA 를 연구했다.

실험
․ 피해야 하는 이유: 지원자가 시도한 일에 관심이 없다, 성취한 일에만 관심이 있다.
․ 예) 새로운 LAN 관리 소프트웨어를 시도했다.
․ 가능한 다른 표현: 새로운 LAN 관리 소프트웨어를 시험하고 평가했다.

능숙하게, 효과적으로, 유희하여, 신속하게, 전문가, 마스터했다
․ 피해야 할 이유: 채용 관리자들은 특정 직무를 얼마나 잘 수행했는지 설명하는 단어들을 싫어한다. 많은 경우 자랑처럼 들리며 이는 불필요하다. 한 리크루터는 "그 일을 잘하지 못한다면 이력서에 쓸 이유가 없다"라고 말했다.
․ 예: 윈도우 NT 에서 윈도우 서버 2003으로의 전환을 능숙하게 관리했다.
․ 가능한 다른 표현: 근무시간에 동작중단 없이 윈도우 NT 에서 윈도우 서버 2003으로의 전환을 관리했다.

첨단, 디테일 지향, 조율하다, 촉진하다, 변환하다, 증명된 능력, 시너지, 연락
․ 피해야 할 이유: 채용 관리자들은 이런 어휘가 실제 전달하는 내용 없이 공간만 낭비한다고 말한다. 이러한 어휘가 너무 많이 적혀있기에 원래의 에너지를 잃어버렸다.
․ 예: 일상적인 네트워크 운영을 감독하고 주요 기술 이니셔티브를 구축하는데 증명된 능력을 지닌 디테일 지향 관리자
․ 가능한 다른 표현: 8명 IS 직원을 감독했다. 두 개의 완전한 플랫폼 이전을 완료했다. 사무실 이전에 이은 장비와 자원 통합화를 수행했다.

…에 책임을 지다
․ 피해야 할 이유: 관리자라면 당연히 책임질 일이 있다. 책임질 일이 무엇인지 몇 가지 숫자를 동원해 설명하여 일의 범위를 알리는 것이 좋다.
․ 예: 재고관리, 네트워크 운영 감독, 새 장비 구매, 워크스테이션 문제 해결에 책임을 짐.
․ 가능한 다른 표현: 윈도우 XP를 수행하는 70명의 사용자와 윈도우 서버 2003을 운영하는 두 대의 서버를 감독했다. 재고관리 장비를 위한 자산관리계획을 구축했다. 내부 인프라를 위한 네트워크 운영 팀을 구성했다.@

출처 : http://tong.nate.com/career/15334132


|

특집기사 Microsoft WPF

Windows Vista and WinFX™
차세대 운영체제 이런 예기는 이미 충분히 들었을 줄로 안다.
Windows Vista에 대한 예기들을 하면서 깔끔한 UI, 강화된 보안기능등에 대한
예기를 하면서도 정작 엄청나게 바뀐 내부적인 변화에 대해서는 섵불리
예기 하기가 쉽지 않은것은 그 변화 폭과 내용이 너무 엄청나서 일 것이다.

누가 그랬던가 Windows 3.x에서 Windows 95가 나올때 이상의 변화이다 라고
물론 그때도 UI적인 측면이 충격적으로 바뀠지만 그 보다 더 중요한 변화라고 하면
Win16 API에서 Win32 API로의 환경적인 변화가 실상 더 큰 변화 였다.

이번의 Windows Vista의 변화 역시 Win32 API와 .NET Framework가
WinFX라는 환경으로의 충격적인 진화와 확장이 된 버전으로 그 내부적인 환경의
변화를 설명할 수 있다.
 

WinFX는 아래와 같이 세 부분으로 크게 구성되어 있다.
-WPF -Presentation Foundation
-WCF -Communication Foundation
-WWF -Workflow Foundation

UI의 혁명적 변화를 이끌어 낼 WPF와 SOA를 단일환경으로 통합시릴 수 있는 WCF
그리고 Workflow로 비지니스 프로세스를 구조화 할 수 있는 WWF와 같은 요소들은
바로 WinFX를 구성하고 있는 주요 구성 요소이다.

이 중에서도 설명해 드릴 내용은 WPF라고 하는 UI의 혁명이다.
제가 백마디 하는 것 보다 데모 동영상을 보고나서 계속 이어가겠다.

동영상 URL:http://www.microsoft.com/products/expression/en/demos.mspx

일단은 보기에는 멋있다. 멋있는 정도가 아니라 무슨 방송용 화면이나 광고같기도 하다.
심지어는 마이널리티 리포터의 한 장면이 떠오를라 하려고 까지 한다.
문제는 저런 화면을 실제로 구현할 수 있는가 하는 것이다.
KBS 개그맨 중에서 백수들의 애환을 다루고 있는 누구는
"안돼는게 어딧니~" 라는 대사로 항상 코너를 마무리 지었다.
말 그대로 안되는 건 사실상 거의 없다. 하지만 그 정도의 혁신적인 UI와 환경을
구축하는데 얼마 만큼의 시간과 비용이 소비되는가 하는게 문제 일 것이다.

WPF는 이런 완성된 그리고 엄청난 UI를 비교적 쉽게 구현할 수 있는 환경을 예기하고
있다. WPF는 아래와 같은 구성 요소를 가지고 있다.



WPF는 위의 그림에서 볼 수 있듯이 XAML(Extensible Application Markup Language)
와 C#과 같은 언어로 구성되어 있다.
XAML은 UI를 구성하는 XML의 일종으로 WPF에서 UI의 모든 부분을 담당하고 있다.
UI를 XAML로 구성하면서 UI에 대한 관리가 좀더 직관적으로 변하였고 융통성 있게
관리할 수 있는 장점이 생겼다.

Markup tag로 애플리케이션 구축 할 수 있게 되였고 단순한 명시적 선언구조에
어떤 CLR 객체 구조 표현 가능해 졌다. 또 코드와 내용의 효과적 분리가 되었고
설계자와 개발자 사이의 협업과 동시작업이 가능하다.

XAML로 구성된 UI의 실제 기능은 C#, VB.NET, Java Script등으로 구성할 수 있다.

WPF의 핵심 구성요소로 다음과 같은 내용들을 제공해 준다.
-탐색, 윈도우, 대화상자에 대한 지원
-UI Data binding, 확장 layout 및 풍부한 control objects,
-2D와 3D 그래픽, Animation, Media, Document

엄청나지 않은가 기본적인 폼 이외에도 각종 Media와 2D, 3D 그래픽까지 모두 다룰
수 있게 되었기 때문에 위의 데모 동영상에서 본 것과 같은 화려한 화면을 구상할
수 있게 된 것이다.

또 WPF는 기본적으로 아래와 같이 OS를 지원할 예정이다.

-Windows의 다음 버전인 Vista에 포함예정
-Windows XP SP2와 Windows Server 2003 SP1에는 WinFX 런타임의 일부로 제공될 예정
-Windows Presentation Foundation Everywhere(WPF/e)
  XAML과 Javascript에 기반을 둔 WPF의 mobile version
  3D 기능은 제공되지 않음, 그러나, XPS, vector-based drawing,
  hardware acceleration은 제공

위의 내용을 정리해 보면 WPF는 Vista 부터 본격적으로 지원이 되지만
Windows XP나 Windows 2003에서도 그 기능을 사용할 수 있다. 또한 Web Application과
Windows Application을 공통적으로 개발할 수 있는 기반이 된다.

이 비슷한 기술들이 이미 RIA(Rich Internet Application)라는 이름으로 나와 있는
제품들도 많이 있다. 가장 대표적인 재품은 Adobe사의 Flex가 그 예이다.
하지만 Flex은 현재 몇가지 치명적인 문제점들이 보이는데
디자이너와 개발자의 협업과 성능, 보안 문제들이 존재한다.

디자이너와 개발자의 협업은 보통 일정 규모 이상의 프로젝트에서 사용하는 형상관리
툴인 CVS나 Visual Source safe, Team System 중에서 CVS만 지원하고 있으며 이는
규모 있는 Project의 운영에 치명적인 약점으로 작용한다.

둘째 성능상의 문제는 Flex는 모든 화면 처리를 CPU가 직접 계산하고 있기 때문에
화면 해상도가 높아지고 Control수와 Effect가 많아지면 화면이 끊기고
CPU점유율이 100%를 상위하는 경우를 쉽게 볼 수 있다.
처리 결과를 보여주어야 할 화면이 처리를 못하게 CPU를 점유하는 아이러니가 남게
되는 것이다.
또 아직은 성능과 보안적인 이슈를 않고 있기 때문에 비교적 데이터양이 적은
영화 예약과 같은 곳에 한정적으로 활용되고 있다.
그럼 WPF의 경우는 어떠한가 WPF는 형상관리 툴을 적극적으로 활용할 수 있으며
Microsoft에 제공하는 개발도구들은 모두 Team System과 Visual Source Safe를 활용 할
수 있게 되어 있다. 또한 WPF는 일반적으로 우리가 3D 가속 칩으로 알고 있는 GPU를
활용할 수 있게 되어 있다. 이는 CPU의 부하를 획기적으로 줄여주면서 더 매끄럽고
화려한 효과를 줄 수 있다. (Nvidia 혹은 ATI의 제품들이 소위 말하는 GPU)이다.

아직 보안과 성능에 관련한 이슈에 대한 답은 아직 WPF라도 처리 방법을 지금은 테스트
해보지는 않았으나 나름 방법은 있을 것이라 기대하고 있다.

WPF를 이용하기 위한 개발환경을 구성하기 위해서는 무엇이 필요한가?
WPF는 WinFX의 한 부분이며 따라서 WPF를 설치하고 테스트 해보기 위해서는 WinFX 개발환경을
구성해야 한다. WinFX의 개발환경을 구성하기 위해서는 설치할 것도 많다.
하지만 WinFX가 정식 발표 되었을 때는 개발도구에 모두 통합되어서 간단히 설치 할 수도
있을 것 같다. WinFX를 사용하기 위해서 설치해야 되는 목록과 순서는 아래와 같다.

이 순서는 친절한 성철씨가 3일간 삽질한 결과로 올려 놓은 것이라 한다.
이 자리를 빌어서 감사의 말씀을 드립니다.
http://lovewiz.pe.kr/31

1. Windows XP SP2 or Windows Server 2003 SP1 설치된 깨끗한 컴퓨터
(Windows Vista도 가능)

2. WinFX Runtime Components 다운로드 및 설치
http://msdn.microsoft.com/windowsvista/downloads/getthebetaaspx?FamilyId=AD0CE56E-D 7B6-44BC-910D-E91F3E370477&displaylang=en

3. Visual Studio 2005 설치

4. Windows SDK 다운로드 및 설치
http://www.microsoft.com/downloads/details.aspx?FamilyId=9BE1FC7F-0542-47F1-88DD-61E3EF88C402&displaylang=en

5. Visual Studio Extensions for WinFX 다운로드 및 설치
http://www.microsoft.com/downloads/details.aspx?FamilyId=AD0CE56E-D7B6-44BC-910D-E91F3E370477&displaylang=en

6. Interactive Designer 다운로드 및 설치(Option)
http://www.microsoft.com/downloads/details.aspx?familyid=D0161985-AE53-4794-9860-61A4906587F0&displaylang=en


Windows SDK를 설치하고 나면 C:\Program files\Windows SDKs\ 하위에 Sample code가 있으며
Sample code를 통해서 전체적인 모습을 보실 수 있다.


 

김영욱 Microsoft MVP
blog: blog.naver.com/microsoftMVP

Web: www.winkey.pe.kr

email: iwinkey@Hotmail.com


|

1. Introduction
 


닷넷은 GDI+의 지원으로 더욱더 강력한 웹페이지를 만들어 낼수 있다고 생각한다. 이번 아티글은 동적으로 저장된 데이터를 가지고 바로 Line으로 표현하는 LineChart를 만들어 보고자 한다.


2. Code

Line Chart클래스의 클래스이다. 현재 Current페이지의 ContentType 를 Image/jpeg로 설정한후 바로 브라우저에 그래픽을 뿌려지게 된다. 내부의 코드를 따로 설명하지 않아도 주석을 보면 코드를 충분히 이해 할수 있을것이다.


class LineChart

{


    public Bitmap b;

    public string Title="Default Title";

    public ArrayList chartValues = new ArrayList();//데이터저장

    public float Xorigin=0, Yorigin=0;

    public float ScaleX, ScaleY;

    public float Xdivs=2, Ydivs=2;


    private int Width, Height;

    private Graphics g;


    //데이터 구조체

    struct datapoint

    {

        public float x;

        public float y;

        public bool valid;

    }


    //생성자,초기설정

    public LineChart(int myWidth, int myHeight)

    {

        Width = myWidth; Height = myHeight;

        ScaleX = myWidth; ScaleY = myHeight;

        b = new Bitmap(myWidth, myHeight);

        g = Graphics.FromImage(b);

    }


    public void AddValue(int x, int y) //데이터를 저장한다.

    {

        datapoint myPoint;

        myPoint.x=x;

        myPoint.y=y;

        myPoint.valid=true;

        chartValues.Add(myPoint);

    }


    public void Draw() //그리기

    {

        int i;

        float x, y, x0, y0;

        string myLabel;

        Pen YellowPen = new Pen(Color.Yellow,1);

        Brush YellowBrush = new SolidBrush(Color.Yellow);

        Font axesFont = new Font("arial",10);


        //먼저 이미지 사이즈와 초기화 지역을 잡는다.

        HttpContext.Current.Response.ContentType="image/jpeg";

        g.FillRectangle(new

            SolidBrush(Color.Black),0,0,Width,Height);

        int ChartInset = 50;

        int ChartWidth = Width-(2*ChartInset);

        int ChartHeight = Height-(2*ChartInset);

        g.DrawRectangle(new

            Pen(Color.Yellow,1),ChartInset,ChartInset,ChartWidth,ChartHeight);


        //위에서 설정한 Chart제목을 그린다.

        g.DrawString(Title, new Font("arial",14), YellowBrush,Width/3, 10);


        //X축 좌표 그리기

        for(i=0; i<=Xdivs; i++)

        {

            x=ChartInset+(i*ChartWidth)/Xdivs;

            y=ChartHeight+ChartInset;

            myLabel = (Xorigin + (ScaleX*i/Xdivs)).ToString();

            g.DrawString(myLabel, axesFont, YellowBrush, x-4,

                y+10);

            g.DrawLine(YellowPen, x, y+2, x, y-2);

        }

        //Y축 좌표 그리기

        for(i=0; i<=Ydivs; i++)

        {

            x=ChartInset;

            y=ChartHeight+ChartInset-(i*ChartHeight/Ydivs);

            myLabel = (Yorigin + (ScaleY*i/Ydivs)).ToString();

            g.DrawString(myLabel, axesFont, YellowBrush, 5, y-6);

            g.DrawLine(YellowPen, x+2, y, x-2, y);

        }


        //시작점을 0,0으로 설정한다.

        g.RotateTransform(180);

        g.TranslateTransform(0,-Height);

        g.TranslateTransform(-ChartInset,ChartInset);

        g.ScaleTransform(-1, 1);


        //데이터를 그래프로 표혀한다.

        datapoint prevPoint = new datapoint();

        prevPoint.valid=false;

        foreach(datapoint myPoint in chartValues)

        {

            if(prevPoint.valid==true)

            {

                x0=ChartWidth*(prevPoint.x-Xorigin)/ScaleX;

                y0=ChartHeight*(prevPoint.y-Yorigin)/ScaleY;

                x=ChartWidth*(myPoint.x-Xorigin)/ScaleX;

                y=ChartHeight*(myPoint.y-Yorigin)/ScaleY;

                g.DrawLine(YellowPen,x0,y0,x,y);

                g.FillEllipse(YellowBrush,x0-2,y0-2,4,4);

                g.FillEllipse(YellowBrush,x-2,y-2,4,4);

            }

            prevPoint = myPoint;

        }


        //바지막으로 객체를 저장하여 브라우저에 뿌려준다.

        b.Save(HttpContext.Current.Response.OutputStream, ImageFormat.Jpeg);

    }


    //소멸자

    ~LineChart()

    {

        g.Dispose();

        b.Dispose();

    }

}


아래는 클래스를 생성하여 적용하는 예제이다. Title과 x,y의 Scale을 설정한다. 그리고 데이터를 ArrayList배열에 추가하면 간단한 차트 그래프가 완성된다.

private void Page_Load(object sender, System.EventArgs e)

{

    //객체 생성하기

    LineChart c = new LineChart(640, 480);

   

    //차트의 크기를 설정한다.

    c.Title="Hoons Line Chart (ASP.NET GDI+)";

    c.Xorigin=0; c.ScaleX=500; c.Xdivs=5;

    c.Yorigin=0; c.ScaleY=1000; c.Ydivs=5;

   

    //임의의 데이터를 넣는다.

    c.AddValue(50,50);

    c.AddValue(100,100);

    c.AddValue(200,150);

    c.AddValue(450,450);

   

    //메모리에 그려서 브라우저로 전달한다.

    c.Draw();

}


3. 정리

LineChart가 가장간단히 프로그램 할수 있는 그래프인것 같다. 다음에 기회가되면 원이나 막대 Chart 클래스를 만들어 아티글로 올려 보도록 하겠다.


  작성자 : HOONS(박경훈)
  이메일 : tajopkh@hanmail.net
  홈페이지 : http://www.hoonsbara.com/ 


|
출처 카페 > 플래시,Flash,포토샵,P.. / 플래셔
원본 http://cafe.naver.com/q69/95539
(1) 영한 사전
http://dic.impact.pe.kr/ecmaster-cgi/srch.cgi?kwd=homebody&bool=phrase&word=yes (영어학습사전)

이 곳에서는 숙어(예: come down with) 및 특정 용어(예: 용불용설)도 찾아 볼 수 있습니다.
(Tip: 이 영어 학습 사전에서 Alt + z를 누르면 검색란으로 바로 이동합니다.)

인터넷에 있는 그밖의 영한 사전은 볼 필요가 없습니다.
(단, 영작을 하는 사람에게는
http://kr.engdic.yahoo.com/result.html를 사용하는 것도 좋습니다!)


자신이 가지고 있는 (출판된) 영한 사전을 보거나
한글 97에 있는 한컴 사전 [동아 프라임 영한 사전]이나
정소프트 피시딕 7.0 [금성판 Newace 영한 사전]을 보면 됩니다.

한컴 사전이 동아 프라임 영한 사전이고,
섬성 SW 모음에 있는 정소프트 피시딕 7.0이 금성판 Newace 영한 사전인 것으로 미루어
영한 사전은 시사 엘리트 영한 사전을 구입하는 것이 상호보완적 입장에서 좋은 것 같습니다.


(2) 영영 사전
http://www.allwords.com/
http://www.dict.org/ (<-- 동의어 사전으로 활용해도 좋음)
위의 두 개의 영영 사전을 사용하면 어느 정도 해결되나,

다른 사전에는 거의 나오지 않는 아주 특이한 단어 또는 의미를 찾을 경우에는
http://afen.onelook.com/에서 검색하는 것도 좋습니다.
이 사이트는 찾으려는 단어가 들어 있는 모든 영영 사전을 한 눈에 보여줍니다.

(출판된) 유용한 영영 사전으로는
Collins Cobuild 사전을 권장할 만하지만, 이는 휴대용이라 생각하는 게 좋습니다.
가능하다면 영영 사전은 가장 두꺼운 것으로 구입해 두는 것이 좋습니다.
저는 옥스포드 영영 사전(The New Oxford Dictionary of English; 6만원)을 사용하고 있습니다.


(3) 의학 용어 사전
http://www.kma.org/general/dictionary/dictionary.asp


(4) 영어 속담, 명언
http://hometopia.com/proverb/prov-e1n.html
http://www.clichesite.com/index.asp


(5) 다국어 사전
http://www.freewaresite.com/onldict/fre.html

영어를 입력하여 기타 외국어의 상응하는 단어를 찾거나 vice versa.


(6) 컴퓨터 용어 사전
번역 초보자라면 컴퓨터 용어 사전은 출판된 것으로 하나 구입하는 것도 좋을 것 같습니다 (큰 도움은 안 되지만 있으면 든든합니다).
"컴퓨터 용어 대사전 (펴낸곳: 성안당)"이외에도 많이 나와 있습니다.


텀즈 - 가장 유명한 컴퓨터 용어사전 사이트가 아닐지. 너무 한글화했다는 단점이 있죠
http://www.terms.co.kr/


돌도끼 - 게시판 기능이 있어 묻고 답할 수가 있습니다. 지금은 사람들이 별로 사용을 안해서 게시판에 올라오는 글도 답해주는 글도 많이 안보입니다. 그래도 언젠간 다시 활성화되겠죠
http://dic.doldoki.org/


정보통신용어사전:TTA - 역시 분야별로 세분화되어 있습니다.
http://www.tta.or.kr/word_db/wording_index.html


엔싸이버 - 본문 내 용어검색 가능
http://infocomdic.encyber.com/


정보통신 용어해설
http://keyword.info21.or.kr/


딕포유 - 사전보다 PC Q/A가 쉬엄쉬엄 읽어 둘만 하네요.
http://www.dic4u.com/


딕모아 - 한글(영어) 형식으로 목록이 나열되어 있어 빠르게 번역 용어로 참조할 때 유용합니다.
http://com.dicmoa.com/


HardwareLAB: Dr.Duck Dictionary
http://www.hwlab.com/dic/


Yahoo IT 용어사전 - 전자신문, Terms, 한국정보통신, 딕모아에서 검색합니다.
http://kr.scenter.yahoo.com/cterm/


엠파스정보통신용어사전 - 컴퓨터 뿐만 아니라 기술 분야별로 세분화되어 있습니다.
http://itdic.empas.com/


(7) 경제 용어 사전
경제 용어 사전도 인터넷상에 많이 있지만
권장할 만한 것은 없고
차라리 검색 사이트에서 찾는 게 더 나은 것 같습니다.

추가: 매경 경제용어사전
http://dic.mk.co.kr/dic_index.html


(8) 검색 사이트
구글 (
http://www.google.com/): 컴공과 교수님들이 추천하는, 타의 추종을 불허하는 검색 사이트입니다.

한 때 엠파스(
http://search.empas.com/search/advanced_search.html)를 주로 사용했지만
이 검색 엔진은 구글에 비하면 별로입니다.

물론 다른 검색 사이트도 그 나름대로 특징과 장점이 있지만,
굳이 구글을 추천하는 이유는
이 검색 사이트가 "번역사"에게 유용하기 때문입니다.

야후! 코리아 사이트(www.kr.yahoo.com)는 일반 검색을 위해서는 거의 사용하지 않습니다.
다만, 야후 사전(영한/한영 사전, 백과사전, 국어사전, 경제 용어사전)이 나오는
http://kr.alldic.yahoo.com/는 활용할 만합니다.

구글 검색 엔진에 대한 Tip: 구글 검색시에 큰따옴표를 활용하면 유용합니다.

만약 [질량 보존의 법칙]에 해당하는 영어를 쉽고 빠르게 찾으려면

ㄱ. "질량 보존의 법칙" law (<-- 법칙이 law라는 것을 알 때)
ㄴ. "질량 보존의 법칙" conservation (<-- 보존이 conservation라는 것을 알 때)
등을 검색란에 적고 엔터를 치면 됩니다.

큰따옴표는 그 안에 있는 구를 정확하게 찾아주는 역할을 합니다.
큰따옴표 밖의 단어는 그냥 and 의 역할을 합니다.


(9) 인명 사전
http://100.naver.com/ (네이버 백과 사전)
http://www.biography.com/ (국제 인명 사전)


(10) 단위 변환
http://www.sechang.com/html/outline_units_main/units_main.htm

이곳에서는 길이, 면적, 밀도, 시간, 압력, 중량, 질량, 체적 등을
여러 가지 단위로 변환해줍니다.


(11) 영어권 이름의 우리말 표기
http://home.hanmir.com/~bookdaily/ename2.htm


(12) 한글 명칭의 영문 표기
http://www.englishname.net/
이 곳에서는
행정구역명, 공공기관명, 기업체명, 지명, 시설명의 영문 표기를 볼 수 있습니다.

가령 검색란에 "국가보훈처"를 적고 엔터를 치면
Ministry of Patriots and Veterans Affairs 를 찾아줍니다.

아직까지는 이곳도 자료가 많이 부족하나 그래도 알아두면 좋을 듯합니다.
예컨대, 이곳에서 기업체명에 관한 자료도 나오나 부족하기에,
기업체명에 대한 영문 표기를 보려면
오히려 기업체의 홈페이지를 방문하는 게 빠릅니다.

이곳에서는 또한 국어의 로마자 표기법, 한글명칭 영문표기 기준, 우리말의 표준 발음법, 이름의 로마자표기, 도로표지 영문표기 지침, 도로명의 영문표기 방법, 표기 가능한 영문 약어를 확인할 수 있습니다.


(13) 로마자 변환기 (& 표준 발음 변환기)
1.
http://164.125.164.226/roman/romanweb.dll (로마자 변환기)
2.
http://urimal.cs.pusan.ac.kr/edu_sys_new/new/show/share/board/board.asp?part=MANAGER&GoKEYage=1 (우리말 배움터의 묻고 답하기, 로마자 변환기, 표준 발음 변환기)

로마자 변환기에 한글을 넣으면 로마자로 변환해 줍니다.
가령 [장충2가]를 넣으면 [Jangchung2-ga] 로 변환해주고,
[김야국] 을 넣으면 [Kim Yaguk]으로 변환해줍니다.
이곳이 약간의 문제점이 있지만, 그래도 꽤 쓸만합니다.


(14) 띄어쓰기 사전:
http://www.gugeo.com/

띄어쓰기의 용례를 보여주는 사전입니다.
가령 검색란에 "띄어쓰기"라고 적고 엔터를 치면

띄어 놓다 (띄)
띄어 써라 (띄)
띄어 쓰기 (띄/붙)
띄어 쓰지 마라 (띄)
띄어쓰기하다 (붙)

등이 나옵니다. 괄호안의 "띄"는 띄어 쓴다는 말이고 "붙"은 붙여 쓴다는 말입니다.


(15) 백과사전

britannica
http://www.britannica.com/

한국브리태니커
http://www.britannica.co.kr/


(16) 기타

On-line Glossaries & Dictionaries

AE <-> BE dictionary
http://www.peak.org/~jeremy/dictionary/dict.html
Carsten Kuckuk indicated this American English <-> British English dictionary.

Manon Bergeron's Index of Financial Glossaries
http://mabercom.com
A comprehensive list of financial and business glossaries classified alphabetically by subject matter. The same site also contains an "instruction manual" for searching the Web.

Dictionaries on the Internet
http://pws.prserv.net/esinet.migcc/diccionarios/
Indicated by Miguel Gonzalez. A huge list of on-line dictionaries, glossaries, and encyclopedias. Somewhat tilted toward Spanish-language and Islam-related sites.

Dominik Kreuzer's Translation Terms Glosssary
http://www.trans-k.co.uk
The Glossary of terms related to translation and interpretation is but one feature of this well-designed and content-rich site.

English <-> Spanish Business Glossary
http://www.andymiles.com
Andy D. Miles' searchable English-Spanish and Spanish-English business glossary.


Eurodicautom On-line Dictionary
http://eurodic.ip.lu
Terminology database of the European Communities. Excellent on-line dictionary for the languages of the EC.

Glossary Posts Mailing List
http://www.egroups.com/group/GlossPost
Mailing list for posting on-line glossaries found by members. The Web site features instructions on how to join and a message archieve that's a treasure trove of glossaries in different fields.

Tanya Harvey's Web site
http://www.ticino.com/usr/puffin/findit.htm
This site makes AltaVista and different other search engines find on-line glossaries and dictionaries for you by doing a Boolean search automatically. An original and well-designed site worth bookmarking.

Dominik Kreuzer's Translation Terms Glosssary
http://www.trans-k.co.uk
The Glossary of terms related to translation and interpretation is but one feature of this well-designed and content-rich site.

LOGOS Multilingual Dictionaries
http://www.logos.it/pls/dictionary/new_dictionary.dictio_professional_window?u_name=&u_password=&u_code=4395&code_language
In addition to featuring this multilingual on-line dictionary, the site also offers the Wordfast translation tool for download, free of charge (see also Translators' Tools in this Journal).

Microsoft's Computer Glossaries
ftp://ftp.microsoft.com/developr/msdn/newup/glossary/
Downloadable computer-related glossaries in 29 languages. Each glossary comes as an .exe file, which extracts into several Excel files containing glossaries specific to different Microsoft programs.

Roelof Oostra’s Home Page
http://home.t-online.de/home/Roelof.Oostra
A list of Dutch-German & German-Dutch dictionaries, as well as multilingual dicionaries, all containing both Dutch and German (among other languages). The homepage is in German.

|
파일 다운로드: NET_Dev.zip

국내 개발자들의 .NET 프로젝트를 위하여 마이크로소프트에서 공개하는 .NET 표준개발 가이드와 Microsoft.Framework는 .NET 애플리케이션 개발 프로젝트를 진행 시에 어떻게 계획을 수립하고, 프로젝트를 진행해 나갈 것이며, 실제 구현, 배포, 관리 시에 따라야 하는 지침을 제공하기 위한 것입니다.

각 단계에 대해 .NET 개발 표준 지침을 제공함으로써, 장차 개발될 .NET 프로젝트에 일관성과 규격을 제공하며, 실제 프로젝트에서 활용할 수 있는 공개 개발프레임워크가 포함되어 있습니다.

일정수준의 품질을 보장하는 애플리케이션 개발을 효율적으로 수행하기 위해 필요한 일정수준의 틀을 짜놓은 것을 개발 프레임워크라고 합니다. 개발 프레임워크는 명명규칙, 프로젝트 구조, 배포 구조, 논리적/물리적 계층구조, 코드의 버전관리, 트랜잭션관리, 데이터베이스 연결관리, 에러관리 등을 정의한 표준문서, 클래스 라이브러리, 개발지원도구 등으로 구성됩니다.

애플리케이션을 효율적으로 개발하기 위해서는 단순히 반복되는 구현코드를 매번 작성하는 방식을 사용하면 안 된다는 것은 개발자라면 누구나 알고 있습니다. 또 한 두 명의 개발자만으로 수행할 수 있는 프로젝트인 경우에는 그 때 그 때 필요할 때마다 의견을 조율해가는 방식으로 무난하게 수행할 수 있지만 조금만 더 규모가 커지면 주먹구구식의 개발방식으로는 정해진 기간 내에 일정수준의 품질을 보장하는 애플리케이션을 개발할 수 없다는 사실을 대부분의 개발자들은 경험적으로든 교육을 통해서든 알고 있습니다.

이 개발 프레임워크는 .NET 전문 개발 컨설팅 기업인 닷넷엑스퍼트가 .NET프로젝트를 위하여 개발한 것으로 국내 개발자를 위하여 마이크로소프트와 함께 무료로 공개한 것입니다. 프로젝트 환경에 맞도록 자유롭게 수정하여 사용할 수 있으며, 개발 프레임워크에 대한 사용 설명서는 Sample을 설치하면 사용 설명서가 함께 설치됩니다. 이 프레임워크에 대한 기술지원이 제공되지 않으며 재판매 등의 상업적인 목적으로 사용할 수 없습니다. 12월 6일 MSDN 개발자 세미나에서 개발프레임워크에 대한 내용을 설명합니다.


|

월간 마이크로소프트웨어 2006년 11월호에 기고한 기사입니다.

보통 프레임워크라고 하면 자바 기반의 다양한 프레임워크를 떠올리기 십상이지만, 최근에는 닷넷 버전으로 컨버전 되는 경우도 종종 보게 된다. 프레임워크의 중요도가 높아짐에 따라 MS는 닷넷 프레임워크 3.0도 모습을 거의 갖춘 상태이다. 또, 지난해에는 한국 MS 단독으로 microsoft.Framework를 무료 공개하기도 했다. 어쩌면 머지않아 더 다양한 닷넷 기반 프레임워크들을 만나게 될 지도 모를 일이다.


닷넷 프레임워크의 활용 전략에 대해 알아보기 전에 프레임워크가 무엇인지에 대해 다시 정의해 보자. Gof의 디자인 패턴으로 유명한 랄프 존슨(Ralph Johnson)은 프레임워크를 다음과 같이 정의했다.

“A framework is a set of cooperating classes that make up a reusable design for a specific class of software”
“프레임워크란 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 일련의 협업화된 클래스들의 집합”

랄프 존슨의 정의에서 알 수 있듯이 프레임워크의 핵심은 재사용성에 있다. 재사용 가능하도록 클래스들을 설계해서 만들어야만 프레임워크라 부를 수 있는 것이다. 이러한 재사용성은 추상화를 전제로 한다. 그렇다면 라이브러리와는 어떻게 구별할 수 있을까? 라이브러리는 특정 기능을 구현하는데 중심을 둔 반면에, 프레임워크는 이러한 기능 문제를 해결한 라이브러리를 조합하여 실제 문제 해결에 중심을 두고 만든 것이라고 이해하면 쉬울 것이다.
프레임워크는 보는 관점 따라서 다양한 분류 방법이 있다. 닷넷 프레임워크 같은 것을 보통 벤더 프레임워크(Vendor Frame work)라고 분류한다. MS라는 벤더 사에서 만들었기 때문이다. 잘 사용되지는 않지만 썬마이크로시스템즈에서도 자바 기반의 JATO(Sun One Application Framework)라는 벤더 프레임워크를 만들어 배포하고 있다.
닷넷 프레임워크는 그 자체로 하나의 훌륭한 프레임워크이다. 하지만 이 닷넷 프레임워크만 가지고 애플리케이션을 만드는 경우는 흔치 않다. 대부분 애플리케이션 성격에 맞는 프레임워크를 미리 준비해서 그 프레임워크 위에서 개발을 하게 된다. 따라서 닷넷 프레임워크는 프레임워크의 프레임워크라고도 할 수 있다. 프레임워크는 그 자체로 완성된 작품이 아니며, 업무에 따라 프레임워크 위에 또 다른 프레임워크를 올려서 더욱 추상화된 형태로 사용할 수도 있는 것이다.

<그림1>닷넷 개발 아키텍처



프레임워크가 필요한 이유?



프레임워크가 필요한 이유를 한마디로 요약하자면 바로 생산성이다. 프레임워크 없이 프로젝트를 한다면 같은 기능을 수행하는 서로 다른 버전의 코드가 존재할 것이고, 매번 똑같은 일을 수행하는 코드가 Copy&Paste 방식으로 차용될 것이다. 또, 개발자의 실력에 따라 천차만별로 달라지는 코드를 통해서 유지보수의 어려움도 느낄 것이다. 새로운 환경이나 변화에 따라 코드를 다시 다 뒤집어 업는 경우도 발생할 것이며, 개발자들이 개발한 코드를 정말 잘 만들었는지 검수할 방법조차 막막해 질 것이다. 정형화된 프레임워크를 사용하면 표준화된 코드들을 생산해 낼 수 있으며, 이를 통해서 생산성을 향상 시키고 좋은 품질의 코드를 만들어 낼 수 있는 것이다.



MS와 프레임워크의 역사



기업용 애플리케이션 환경에서 그동안 자바 진영이 두각을 나타내온 만큼 자바 진영에는 수많은 오픈 프레임워크가 존재 한다. 오히려 너무 많아서 무엇을 선택해야 할지 행복한 고민에 빠지기도 한다. 하지만 닷넷 진영에서는 선택할 수 있는 프레임워크가 많지 않다. MS는 과거 클라이언트 기반의 윈도우나 오피스와 같은 패키지 소프트웨어에서 두각을 나타내었지만, 서버 기반의 기업용 애플리케이션은 자바 진영이 두각을 나타내고 있었다. MS는 이러한 기업용 시장에서는 후발 주자였으며, 패턴이니 프레임워크니 하는 용어 자체가 MS내에서는 익숙하지 않은 용어였다. 하지만 근래에 들어 이러한 기업용 시장에 눈을 뜬 MS는 기업용 서버 기반의 애플리케이션을 제작하는데 있어 개발 방법론, 패턴, 개발 프레임워크를 정리하기 시작했다. 그렇게 해서 만든 사이트가 MS의 패턴 앤프렉티스 사이트이다(http://msdn. microsoft.com/practices). 이곳에 가면 아키텍처에서부터 라이브러리까지 상세한 가이드라인을 얻을 수 있다.



프레임워크를 위한 엔터프라이즈 라이브러리



보통 프로젝트를 한다고 하면 개발에 앞서 프레임워크를 준비하게 된다. 회사에서 자체적으로 만들어둔 표준 프레임워크가 있다면 그것을 사용할 것이다. 만약, 자체 프레임워크가 없다면 일단 프레임워크부터 만들어야 프로젝트를 시작할 수 있다. 하지만 프레임워크를 처음부터 만든다는 것은 그리 쉬운 일이 아니다. 프레임워크를 만드는 것은 아주 많은 시간과 노력을 필요로 하는 작업이다. 때문에 대부분의 경우 프레임워크를 처음부터 만드는 대신 다른 프레임워크를 가져다가 그 위에 자사의 고유한 특징들을 추가하여 사용하게 마련이다. 또, 다른 라이브러리들을 조합해서 자사의 프레임워크로 만들어 사용하기도 한다.

MS는 이처럼 복잡한 프레임워크 개발을 돕기 위해 엔터프라이즈 라이브러리(Enterprise Library)라는 프레임워크를 내놓았다. 엔터프리이즈 라이브러리는 프레임워크를 위한 종합 선물 세트 같은 것이다(엔터프라이즈 라이브러리는 이미 본지 2006.7 ~8월호에 소개가 되었으니 자세한 내용은 과월호를 참조하길 바란다). 엔터프라이즈 라이브러리 2.0은 다음과 같이 여섯 개의 블록으로 구성된다.

● 캐싱 애플리케이션 블록(Caching Application Block)- 로컬 캐시 처리를 위한 블록
● 암호 애플리케이션 블록(Cryptography Application Block)- 해시 함수와 동기 암호화를 위한 블록
● 데이터 액세스 애플리케이션 블록(Data Access Application Block)- 표준화된 데이터베이스 액세스 기능을 위한 블록
● 예외 처리 애플리케이션 블록(Exception Handling Application Block)- 아키텍처 레이어 전체를 포함하여 일관된 예외 처리 정책 수립을 위한 블록
● 로깅 애플리케이션 블록(Logging Application Block)- 로깅 정보 처리를 위한 블록
● 보안 애플리케이션 블록(Security Application Block)- 권한 검증과 보안 캐시 처리를 위한 블록

엔터프라이즈 라이브러리의 블록은 많이 사용되는 기능들을 유형별로 구분해 놓은 것이라고 생각하면 된다. 엔터프라이즈 라이브러리는 소스 코드까지 다 제공하기 때문에 개발자들이 자신의 업무나 현장에 맞도록 블록을 재구성하여 새로운 프레임워크로 만들 수도 있다. 즉, 필요 없는 기능은 제거하고 더 필요한 기능은 추가해서 맞춤형 프레임워크를 만들 수 있도록 도와주는 라이브러리인 것이다.

엔터프라이즈 라이브러리의 각 블록들은 사실 하나 하나가 프레임워크라고도 할 수 있다. 로깅 프레임워크, 보안 프레임워크로 불릴 수도 있다. 왜냐하면 이들 블록은 각각, 재사용성을 가지고 있고, 로깅 및 보안과 같은 해당 업무를 총괄하는 기능을 모두 가지고 있는 까닭이다. 따라서 이들을 프레임워크 분류상으로 기능 프레임워크(Fuctional Framework)라고도 부른다. 단위 테스트 도구인 JUNIT의 닷넷 버전인 NUNIT 또한 단위 테스트 프레임워크라고도 부를 수 있다. 하지만 MS에서는 프레임워크라는 용어 대신 좁은 범위로 묶어서 라이브러리라는 용어를 채택하였다. 그 의도를 알 수는 없으나, 향후 이러한 라이브러리를 묶어서 어떤 상위 개념의 프레임워크의 등장을 염두에 두고 한 것이 아닌가라고 개인적으로 추측을 해 보았다.

엔터프라이즈 라이브러리의 가장 큰 특징은 설정 부분을 별도의 외부 파일로 노출하였다는 점이다. 그 덕에 환경이 바뀌더라도 다시 컴파일 할 필요 없이 환경 설정 파일만 변경해 주면 된다. 예를 들어 DB로 SQL Server를 사용하다가 Oracle로 바꾸었다든지, 암호화 방식을 AES방식에서 DES방식으로 변경해야 한다면, 소스 코드를 수정하지 않고 환경 파일의 내용만 변경하면 된다. 또 다른 특징으로는 성능 카운터 측정을 위한 도구를 제공한다는 것이다.

예를 들어 해당 애플리케이션의 반응 속도가 너무 느려졌는데, 어디에서 원인이 있는지 찾아보려고 할 때, 성능 카운터를 돌려서 어느 부분에 부하가 있는지 알아 볼 수 있다. 이처럼 다양한 기능을 가진 라이브러리를 제공하므로 이를 적절히 조합해서 해당 분야에 맞는 프레임워크를 만들 수 있다.



MS코리아의 자체 프레임워크 Microsoft.Framework



지난 12월 MS코리아에서는 닷넷 엑스퍼트라는 회사에서 개발하여 사용해 오던 닷넷 기반의 개발 프레임워크인 DxFrame work를 인수했다. 또, 이 프레임워크를 공개용 버전으로 만들어서 Microsoft.Framework라 이름을 붙이고 MS 개발자 사이트인 MSDN에서 무료로 배포하고 있다.
(http://www.microsoft.com/Korea/MSDN/netframework/technologyinfo/overview/netdevelopmentguid.aspx)
DxFramework은 처음에 반복되는 데이터 액세스 코드 부분을 간소화하기 위해 라이브러리로 묶은 것이었으나 점점 다른 기능들을 추가 하면서 프레임워크 형태로 발전한 것이다. 위 사이트에는 이 개발 프레임워크 외에도 닷넷 기반의 개발 방법론까지 공개하고 있으므로 관심 있는 독자는 한번 다운로드 받아서 보길 바란다.



Microsoft.Framework의 활용



공개된 Microsoft.Framework는 닷넷 1.1 버전의 프레임워크이다. 여기서 소개된 Microsoft.Framework는 닷넷 익스퍼트라는 회사에서 만든 DxFramework의 Lite 버전이다. 하지만 닷넷 익스퍼트에서 현재 상용으로 판매하고 있는 DxFramework와는 전혀 다른 프레임워크임을 알아두자. 다운로드는 앞에서 언급한 URL에서 프레임워크 설치파일을 다운받을 수 있을 것이다. 모두 한글 기반으로 작성된 프레임워크인 덕에 누구나 쉽게 설치하여 사용할 수 있다.



Microsoft.Framework 설치



설치 프로그램을 다운로드 받은 뒤에 ‘Microsoft.Framework Setup.msi’라는 파일을 실행하면 자신이 원하는 폴더에 프레임워크를 설치할 수 있다.

<화면 1> Microsoft.Framework의 설치화면

설치를 하게 되면 해당 폴더에 Bin과 Source라는 폴더가 만들어 진다. Bin 폴더에는 컴파일 된 프레임워크 dll 파일이 생성되고, Source 폴더에는 Microsoft.Framework를 구성하고 있는 소스와 솔루션 파일들이 만들어지게 된다.

<화면 2> Microsoft.Framework의 소스파일

<그림 2>는 Microsoft.Framework의 구조와 주요한 네임 스페이스의 기능을 정리한 것이다. Microsoft.Framework는 크게 네 가지 기능을 가지고 있다. 첫 번째 기능인 Microsoft. Framework. Configuration은 xml 형태를 가진 계층적 구조를 가진 config 파일 내용을 읽어 오기 위해 사용된다. Microsoft. Framework.Data는 SQL 데이터베이스를 연결을 위한 Microsoft.Framework의 핵심 기능이다.
Microsoft.Framework. Diagnostics는 애플리케이션 실행 중 발생하는 에러를 기록할 때와 컴포넌트의 실행시간을 체크하기 위해서 COM+의 JITA 속성과 결합해서 사용되는 기능이다. 마지막 기능인 Microsoft. Framework.Utility는 스트링이나 파일의 조작을 보다 쉽고 편하게 하도록 지원된다.



샘플 프로젝트 설치



Microsoft.Framework는 샘플 프로젝트를 제공하고 있다. 이 프로젝트를 설치하면 3계층 기반의 사이트를 볼 수 있을 것이다. 또한 가장 중요한 프레임워크 매뉴얼도 볼 수 있기 때문에 이 샘플 프로젝트는 반드시 설치하여 확인해 보아야 한다. Microsoft. Framework는 다음과 같은 디자인 목표를 가지고 있다.

<그림 2> Microsoft.Framework의 구조

● 가급적이면 컴포넌트나 컨트롤 형식으로 작성하여 디자인 타임 지원 기능을 가지도록 한다.
● 런타임 시에 필요한 정보는 속성이나 메소드의 매개 변수로 전달받기 보다는 구성 파일이나 스택 정보에서 읽어내도록 하여 사용을 간편하게 한다.
● 초기화 및 정리 작업이 지능적으로 이루어지도록 하여 되도록이면 작성해야 하는 코드 량을 줄일 수 있도록 한다.
● 구성 파일에서 다양한 동작 특성을 지정할 수 있도록 하여 별도의 커스터마이징 작업이 필요하지 않도록 한다.
● 닷넷 프레임워크와 흡사한 네임스페이스 구조를 가지도록 하여 직관적으로 해당 클래스가 어떠한 역할을 하는지 알 수 있도록 한다.

Microsoft.Framework 샘플 소스의 버전은 닷넷 1.1 버전이다. 이 코드를 VS.NET 2005 환경에서 실행하고 싶다면 Visual Studio 변환 마법사를 통해 쉽게 컨버팅 할 수 있다.

<화면 3> Viusal Stuio 변환 마법사

이 샘플은 DB는 SQL2000에 기본으로 들어 있는 Northwind DB 스키마를 사용하며 내용을 한글화 한 것이다. MS 한글 오피스 프로그램의 액세스에도 샘플로 제공된다. 샘플에서 제공하고 있는 데이터베이스의 스키마는 <화면 4>와 같다.
이 샘플의 특징 중 하나는 모든 웹 페이지는 BaseClass/PageBase를 상속 받고 있다는 것이다. PageBase는 OnInit 오버라이딩 메소드에서 자신의 Content를 화면에 나타내기 전에 Table과 함께 Top Control을 먼저 출력시킨다. 나중에 자신의 Content를 지정된 TD 안에 출력시킨다. <리스트 1>은 이와 관련된 예제 코드이다.

<화면 4> Northwind DB스키마


<리스트 1> BaseClass/PageBase 상속 예제

override protected void OnInit(EventArgs e)
{
base.OnInit(e);
if ( HttpContext.Current == null )
{
return
}
foreach ( Control ctl in Controls )
{
if ( ctl is System.Web.UI.HtmlControls.HtmlForm)
{
_form = ctl as System.Web.UI.HtmlControls.HtmlForm;
}
}
_topMenu = (TopMenu)LoadControl("~/Common/Menu/TopMenu.ascx");
_form.Controls.AddAt(0,_topMenu);
}



Microsoft.Framework.Configuration



앞에서도 잠깐 알아본 것처럼 Microsoft.Framework.Con figuration은 XML 형태의 계층적 구조를 가진 Config 내용을 읽어 오기 위한 기능의 네임스페이스이다. 그 기능을 담당하는 클래스는 AppSettingsReader이다. 만약 어떤 특정한 가변적인 정보를 설정하거나 할 때 Config 파일을 활용해서 설정하면 될 것이다. 물론 Web.Config나 App.Config를 이용해서 특정 정보를 관리 할 수도 있다. 그렇다면 여기서 제공하고 Configuration의 특징은 무엇인가? 다음은 기본 Configuration과 차별된 특징을 보여주고 있다.

● 기본 구성 파일이 아닌 사용자 지정 구성 파일을 사용 할 수 있다.
● 다른 AppDomain의 구성 정보 파일을 기본으로 사용하도록 지정할 수 있다. 이 기능은 서버 활성화를 사용하는 COM+ 클래스에서 편리하게 구성 정보에 접근할 수 있도록 한다.
● 계층적으로 구성된 구성 정보를 사용할 수 있다.
● 지정된 키 값에 해당하는 정보가 없을 경우 디폴트값을 사용할 수 있다.
● 디폴트값의 타입에 맞춰 리턴 값의 타입이 정해지므로 별도의 캐스팅이 필요 없다.
● 구성 정보를 읽는 기본 메소드(GetValue())외에 인덱스를 제공함으로써 호출구문이 간단해진다.

<리스트 2>는 구성 파일을 설정할 때의 예이다.


<리스트 2> AppSettingsReader의 구성파일 설정 예

<configuration>
<Microsoft.Framework>
<AppSettingsReader>
<add key="RaiseException" value="true" />
</AppSettingsReader>


<리스트 3>은 구성 파일을 초기화해서 구성 요소를 불러오는 간단한 예제이다.


<리스트 3> AppSessingsReader 사용 예

AppSettingsReader reader = null
reader = newAppSettingsReader("Microsoft.SampleFramework/ExeTimeLog");
lblExeLogName.Text = reader["LogFileName"];
lblExeTimeEnable.Text = reader["Enable"];




Microsoft.Framework.Data



이 네임스페이스는 SQL 데이터베이스를 연결을 위한 Micro soft.Framework의 핵심 기능을 담당하고 있다. 그 안의 클래스들 중에서도 SqlDbAgent라는 클래스가 가장 대표적인 기능을 하고 있다. 이 SqlDbAgent의 메소드와 사용 예제를 다루어 보도록 하겠다.


<리스트 4>는 가장 많이 사용하게 될 Fill 메소드에 대한 사용 예이다. 데이터를 받아와서 데이터셋에 채우기 위해서는 많은 양의 코드가 필요하지만 Fill 메소드를 사용하면 간단하게 작성할 수 있다.


<리스트 4> Fill 메소드 예제

string query = "GetMessage";
SqlParameter[] paramArray
= {
new SqlParameter("@boardNo", boardNo),
new SqlParameter("@messageNo", messageNo),
new SqlParameter("@step", step)
}

DslBoard ds = new DslBoard();
_agent.Fill(
query,
"Message",
ds,
paramArray,
CommandType.StoredProcedure);
return ds;



SqlDbAgent 클래스의 특징은 다음과 같이 요약할 수 있다.

● DataAdapr, Command 클래스의 자주 사용되는 대부분의 메소드 지원
● 구성 파일을 통한 데이터베이스 연결 문자열 지원
● 다중 데이터베이스 연결 문자열 지원
● 데이터베이스 연결 자원 관리
● 데이터베이스 관련 에러 로깅
● 성능카운터 객체 제공
● COM+ 분산 트랜잭션 및 자동 트랜잭션 지원

SqlDbAgent라는 클래스 말고도 쿼리를 쉽게 작성하기 위한 QueryBuilder나 SqlParameter를 보다 쉽게 조작하기 위한 DbParamHelper라는 클래스가 제공되고 있다. <리스트 5>는 DbParamHelper와 QueryBuilder의 예를 보여주고 있다.


<리스트 5> DbParamHelper와 QueryBuilder 예제

SqlParameter[] paramArray = dataPack.ToSqlParameters();
SqlParamHelper.Add(ref paramArray, "@retVal", SqlDbType.Int);[DbParamHelper의 사용 예]

//DataPack 생성
DataPack dataPack = new DataPack();
dataPack.AddProperty("NavCmd", typeof(int));
dataPack["NavCmd"] = 4;
string name = (string)dataPack["Name"]
//Insert 쿼리 자동생성
QueryBuilder.BuildInsertQuery(dataPack, "테이블이름")[Query Builder의 사용 예]




Microsoft.Framework.Diagnostics



애플리케이션 실행 중에 발생하는 에러를 기록할 때와 컴포넌트의 실행 시 체크하기 위해서 COM+의 JITA 속성과 결합해서 사용되는 기능이다. 에러를 기록하기 위한 클래스로는 ErrorLog 클래스가 구현되어 있으며, 컴포넌트의 실행 시간을 기록하기 위한 클래스로는 ExecutionTimeLog가 구현되어 있다. Execution TimeLog 클래스는 메소드를 실행하기 전에 Prepare 메소드를 실행해서 실행 시간을 기억해 두었다가 특정 처리가 끝난 뒤에 MeasureAndWriteLog 메소드를 호출해서 시간을 기록하게 된다. <리스트 6>은 ExecutionTimeLog의 구성 설정의 예를 보여주고 있다.


<리스트 6> ExecutionTimeLog의 구성 설정

<configuration>
<configSections>
< Microsoft.Framework>
< ExecutionTimeLog >
<add key="Enable" value="true" />
<add key="LogFileName" value="C:\ ExecutionTimeLog .txt" />
</ ExecutionTimeLog >
</ Microsoft.Framework>
</configSections>
<configuration>



ErrorLog 클래스는 WriteLogMessage 메소드를 이용해서 각각의 에러로그를 기록할 수 있다. 에러를 기록하기 위한 보편적인 모델은 각각의 계층에서 가장 상위의 계층으로 Throw해서 Application Error 이벤트를 통해서 에러로그를 기록하는 것이다. <리스트 7>은 에러를 처리하는 예를 보여주고 있다.


<리스트 7> 에러 처리 예

try
{
~~~
}
catch(Exception ex)
{
WriteExceptionLog(ex)
}




Microsoft.Framework.Utility



Utility 네임스페이스 문자열과 파일의 조작을 보다 쉽고 편하게 할 수 있도록 지원하기 위해서 구현한 네임스페이스이다. 하지만 Microsoft.Framework에서의 핵심은 데이터를 엑세스하는 부분이라서 그런지 이 부분의 구현은 조금 미흡하다는 생각이 들 것이다. FileHandler 클래스에서는 바이너리와 텍스트를 불러온다거나 저장하는 메소드를 제공하고 있다. 그리고 StringEx 클래스에서는 원본 문자열 중에서 찾는 문자열의 위치를 얻어내는 메소드를 제공하고 있다. <리스트 8>은 FileHadler를 활용한 예이다.


<리스트 8> FileHadler의 활용 예

//Binary 파일 불러오기
byte[] btData =FileHadler.LoadBinFile("C:\HOONS.JPG")
//Text 파일 불러오기
byte[] btData =FileHadler.LoadTextFile ("C:\HOONS.TXT")
//Text 파일 저장하기
FileHadler.WriteTextFile("C:\HOONS.TXT", "YEAH~Let’s Go")
//Binary 파일 저장하기
FileHadler.WriteBinFile("C:\HOONS.JPG",BinaryData)




프레임워크의 활용



프로젝트를 진행할 때 개발 표준 프레임워크는 필수적이다. 프레임워크는 개발 환경이나 해당 애플리케이션의 업무 환경에 맞도록 맞춤 제작을 하게 된다. 앞에서도 이야기 한 것처럼 보통 이 과정에서는 기본 프레임워크에 맞춤 프레임워크를 올리는 작업을 하게 된다. 이때 중요한 것이 바로 확장성이다. 해당 환경이나 업무가 변화함에 따라 프레임워크도 그에 맞춰 쉽게 변경되거나 확장될 수 있어야 한다. 그래야만 살아있는 프레임워크가 된다. 보통은 공통 표준화팀에서 이러한 개발 프레임워크를 전담하게 되며, 이 팀에서 개발 프레임워크를 기초 설계 환경에 맞도록 만든다. 하지만 프로젝트를 진행 하다보면 처음에 예상하지 못했던 공통적인 기능을 추가하거나 새로운 환경이 추가되는 경우가 많이 발생한다. 이때 이러한 기능을 즉각적으로 개발 프레임워크에 추가하여 개발자들에게 재배포를 해야만 한다. 그렇지 않다면 개발자들은 각각 자신만의 클래스를 만들어서 사용하게 될 것이고, 이러한 일이 계속되면 점점 프레임워크에서 멀어져가게 될 것이다. 즉, 처음에는 모든 기능을 프레임워크에서 찾아서 썼지만 나중에는 점점 자신만의 라이브러리를 추가해서 사용하게 되고 결국 프레임워크에 대한 의존도가 떨어져서 프레임워크를 통한 생산성 향상이나 코드 표준화는 이루어지지 못한다. 가끔 공통 표준화팀의 파워가 강해서 일반 비즈니스 개발자의 이러한 요구 사항을 무시하는 경우가 있다. 이런 사태는 막아야만 한다. 개발 프레임워크는 해당 업무 비즈니스 개발자로부터 끊임없는 피드백을 받아서 수정을 해야만 의존도가 높은 프레임워크로 만들어 질 수 있다. 그래야 비로소 프레임워크를 통한 생산성 향상과 코드 품질의 일관성을 얻을 수 있다.



닷넷 기반 프레임워크의 트렌드



자바 기반의 다양한 각종 프레임워크가 최근 닷넷 버전으로 많이 컨버전 되고 있다. 최근 프레임워크의 특징이라면 관점지향 프로그래밍(Aspect-Oriented Programming)과 IOC(Inversion of Control)기능이라고 할 수 있다. AOP는 업무 비즈니스 개발자가 비즈니스의 요구사항에 집중할 수 있도록 부수적인 기능들은 따로 구현하는 기법을 말한다. 핵심 관심사(core concerns)와 부수적인 횡단 관심사(cross-cutting concerns)로 나누어서 이들을 따로 구현한 다음에 나중에 하나로 합쳐주는 위빙(weaving) 과정을 거쳐 하나의 시스템으로 조립하는 기법이다. 닷넷에 보면 클래스나 함수 위에 기능을 설정하는 속성(attribute)을 지정할 수 있는데, 이 방법 또한 AOP의 한 방법이라고 할 수 있다. IOC는 제어의 반전이라고 번역하는데 이 용어 보다는 의존성 삽입(Dependency Injection)이라는 용어가 더 어울릴 것이다. 이것의 핵심은 이용으로부터 설정을 분리한다는 것이다. 클래스의 재사용성을 높이기 위해서 객체를 사용하는 측에서 만들 것이 아니라, 컨테이너가 설정 정보를 통해서 대신 만들어 주겠다는 개념이다. 이러한 개념들이 자바 진영에서 먼저 시작이 되었고, 이를 이용한 스프링(spring) 프레임워크 등이 닷넷 버전인 Spring. NET으로 발표되고 있다.


MS 닷넷 프레임워크 3.0

얼마 전까지 Ajax에 대한 열기 덕에 Atlas(지금은 Microsoft ASP.NET AJAX)가 개발자들 사이의 화두였다면, 요새는 닷넷 프레임워크 3.0이 개발자들 사이의 최대 관심사이다. 이에 맞춰 닷넷 프레임워크 3.0에 대한 아티클도 점차 올라오고 있고, MSDN 세미나도 줄줄이 열리고 있다.
많은 닷넷 개발자들은 MS의 전략을 따라가면서도 ‘닷넷 프레임워크 2.0이 발표된 지 얼마나 되었다고, 벌써부터 3.0이란 말인가?’라는 의문점을 가지고 있다. 그렇다면 MS는 왜 이렇게 발 빠른 행보를 하고 있는 것일까?




경쟁 대응을 위한 MS의 전략


MS의 민첩한 발걸음은 닷넷 개발자들의 요구 탓이 아니다. 자체적인 혁신에 의한 것 또한 아니다. 전적으로 사업적인 이유에서 이처럼 발걸음을 재촉하게 된 것이다. 예전에도 쟁쟁한 경쟁사들이 있어왔지만, 최근에 들어서는 경쟁 회사의 선전에 밀리는 듯한 모습마저 보이고 있다. 최신 사례로는 Microsoft ASP.NET AJAX가 그렇다. Ajax 열풍에 개발자들이 손쉽게 대처할 수 있도록 개발되었다고 생각하시는 사람들도 있으나(물론 이러한 이유도 내포되어 있다), 보다 현실적이고 근원적인 답안은 사업적인 이유이다(Ajax를 가장 많이 활용하고 있는 개발자들은 대개 자바 진영이고, IBM이 제일 열심히 밀어주고 있다). 닷넷 프레임워크 3.0도 이러한 선상에 있다. 그렇다면 MS는 무엇을 내다보고 있으며, 닷넷 프레임워크 3.0을 통해 얻고자 하는 바는 무엇일까?



MS가 보는 소프트웨어 개발 트렌드


최신 자료에 의하면 MS가 내다보는 소프트웨어 개발 트렌드는 다음과 같다(용어는 필자가 번역하였다).

● 차등화 사용자 경험(Differentiated User Experience)
● 서비스 기반 개발(Service-Oriented Development)
● 비즈니스 프로세스 모델링(Business Process Modeling)
● 디지털 정체성 관리(Digital Identity Management)

누차 강조하지만 Ajax 열풍 이면에는 사용자 경험이 자리 잡고 있다. 기술적인 요소를 떠나 사용자 경험을 향상시키기 위한 대책으로 나온 것이 Ajax이다. Ajax 열풍 이후 많은 기업들이 사용자 경험에 중점을 두고 있으며, MS도 관련 자료를 조금씩 내놓고 있다.
서비스 기반 개발은 프로그래밍 형식이 변해감에 따라 나왔고, 단일 애플리케이션의 설계를 서비스 지향 아키텍처(SOA: Service-oriented architec ture)의 개념을 적용한 개발방법론이다.
비즈니스 프로세스 모델링은 기업의 비즈니스 프로세스를 선진화된 표준 규약을 준수하여 설계하도록 함으로써 프로세스에 대한 명세 및 프로세스가 표출하는 데이터와 연계 지점을 명확하게 하여 프로세스 간의 통합이 가능할 수 있도록 하는데 있다. 작업흐름(workflow)을 대체하는 개념이다.


닷넷 프레임워크 3.0의 구성도


닷넷 프레임워크 3.0의 구성도를 간단하게 표현하면 다음 그림과 같다.
닷넷 프레임워크 3.0은 기존 2.0에 WPF(Windows Presentation Foundation)와 WCF(Windows Communication Foundation), WF (Windows Workflow Foundation) 및 카드 스페이스(CardSpace)를 추가한 형태로 구성되어 있다.
WPF는 UI나 문서 및 미디어를 조합하는 차세대 스마트 클라이언트 응용 프로그램 구축을 위한 클래스를 제공한다. WCF는 서비스 지향 응용 프로그램 구축을 위한 통합 프로그래밍 모델 및 런타임을 제공한다. 또, WF는 비즈니스 프로세스를 모델링하는 워크 플로우에 사용 가능한 응용 프로그램 구축을 위한 프로그래밍 모델과 엔진 및 도구를 제공한다. 마지막으로 카드 스페이스는 개인 ID 정보를 이용한 온라인 작업에 대한 보안을 단순화하고 강화하는 기술을 제공한다.
이건 무엇을 뜻할까? 소프트웨어 개발 트렌드와 닷넷 프레임워크 3.0 구성이 무슨 관계일까? 그 답은 닷넷 프레임워크 3.0이 바로 이러한 트렌드에 맞추어져 있다는 것이다. 정리해보면 구성요소 각각은 다음과 같이 대칭 한다.

● WPF => 차등화 사용자 경험
● WCF => 서비스기반 개발
● WF => 비즈니스 프로세스 모델
● 카드스페이스 => 디지털 정체성 관리


트렌드를 읽는 개발자


개발자도 트렌드를 읽을 줄 알아야 한다. 소프트웨어 개발 트렌드가 어떻게 흐르고 있는지 알아야 다가오는 미래에 대비할 수 있고, 하기에 따라 앞서갈 수도 있다. 현재 주어진 업무에 치여 트렌드를 읽을 수 없다면, 당분간은 별 문제가 없겠지만 패러다임이 변화되었을 때에는 여러 어려움을 겪게 된다. 다행히도 MS에서는 이러한 트렌드를 분명하게 인지하게 해주기 때문에 의미하는 바가 무엇인지 알아야 한다.


트렌드에 대비하는 개발자


닷넷 프레임워크 3.0을 보고 ‘이게 뭐야?’하며 다소 실망하시는 사람들도 있지만, 대부분은 ‘어떻게 대비해야 할까?’를 고민하고 있다. 개인적으로도 명확하게 답해 주고 싶지만, 아쉽게도 아직까지는 그럴 수 없다. 필자 자신도 각 사항에 대해서 고민해보는 시간들을 가져야 한다. 그럼에도, 긍정적으로 권면할 수 있는 것은 닷넷 프레임워크 3.0은 소프트웨어 개발 트렌드를 반영하여 바람직한 방향으로 나아가고 있다는 점이다. MSDN과 세미나 등 다양한 방법을 통해 자료들이 나오고 있기 때문이다. 아직은 대비할 시간이 충분하다. 심적으로 부담스러워하지 말고, 조금씩 하지만 꾸준히 닷넷 프레임워크 3.0의 세계로 나아가보자.
그럼 여기에서 Microsoft ASP.NET AJAX(“Atlas”)는 어떻게 되냐고? ASP.NET 2.0에 통합되므로, 닷넷 프레임워크 3.0에서는 추가적인 설치 없이도 사용 가능하다는 것이 답이다.

이광수 webwings@gmail.com|FOA(Foundations of Atlas) 번역을 끝내고, 그간 즐기지 못한 여유를 즐기는 중이다. 최근 영화 ‘라디오 스타’와 ‘타짜’를 보고 프로의 세계에 대해 다시 생각해보고 있다. 당분간은 Microsoft ASP.NET AJAX에 대해 더 고민해보고, 점차적으로 닷넷프레임워크 3.0으로 범위를 넓힐 계획을 가지고 있다.


출처 : Tong - 김굽다불낸뇬님의 DotNET Framework/SDK통


|

Microsoft .NET Remoting Framework 소개

Paddy Srinivasan
Microsoft Corporation

요약: 본 기사에서는 Microsoft .NET Remoting Framework의 기본 내용을 설명합니다. .NET Remoting Framework의 주요 구성 요소를 설명하며 아울러 .NET Remoting을 통해 배포된 개체와 통신할 수 있는 여러 상황을 소개합니다(11페이지/인쇄 페이지 기준).

목차

소개
.NET Remoting 개체
.NET Remoting 개체 호스트
.NET Remoting 메타데이터 구성 파일
.NET Remoting 시나리오
결론

소개

Microsoft? .NET Remoting은 다양한 AppDomains, 프로세스, 컴퓨터에 있는 개체들이 서로 문제 없이 통신할 수 있도록 풍부하고 확장 가능한 프레임워크를 제공합니다. .NET Remoting은 매우 강력하면서도 간단한 프로그래밍 모델 및 런타임 지원을 제공함으로써 이런 환경에사 작업을 보다 쉽게 합니다. 이 기사에서는 Remoting 구조의 일부를 살펴 보고 .NET Remoting을 레버리지할 수 있는 일반적인 시나리오를 살펴 보겠습니다. .NET Remoting 개체는 웹 서비스로 사용될 수 있습니다.

 

.NET Remoting 개체

.NET 원격 개체로 사용하도록 구성할 수 있는 개체 종류가 세 가지 있습니다. 응용 프로그램 요구 사항에 따라서 개체 종류를 선택할 수 있습니다. 이런 개체를 자세하게 설명해 보겠습니다.

"Single Call" 개체는 하나의 클라이언트에만 사용할 수 있고 한 개의 요청에만 응답합니다. 단일 호출 개체는 한정된 작업 양을 처리해야 하고 상태 정보를 저장할 필요가 없는 경우에 유용합니다. Single Call(단일 호출) 개체는 로드 균형 조정된 방식으로 구성할 수 있으며 메서드를 호출하는 사이에 상태 정보를 유지할 수 없습니다.

Singleton Objects는 여러 클라이언트에 사용할 수 있으므로 클라이언트 호출 사이에 상태를 공유함으로써 데이터를 공유하는 개체입니다. 클라이언트 사이에 데이터를 명시적으로 공유해야 하는 경우나 개체를 작성하고 유지하는 작업이 많은 경우에 유용합니다.

CAO(Client Activated Objects)는 서버 개체로 클라이언트에서 요청하면 활성화됩니다. 이런식으로 서버 개체를 활성화하는 방법은 기존의 COM coclass 활성화와 유사합니다. 클라이언트에서 "새로운" 연산자를 사용하는 서버 개체를 요청하는 경우에 활성화 요청 메시지는 원격 응용 프로그램으로 전송됩니다. 그런 다음 서버에서 요청한 클래스의 인스턴스를 만들어서 호출한 클라이언트 응용 프로그램으로 ObjRef를 돌려 줍니다. 클라이언트에서 ObjRef를 사용하여 프록시를 만듭니다. 클라이언트 메서드 호출이 프록시에서 실행됩니다. CAO(Client Activated Objects)는 특정 클라이언트용 메서드 호출 사이에 상태 정보를 저장할 수 있습니다. 이때 서로 다른 클라이언트 개체에 대한 호출인 경우에는 저장할 수 없습니다. "새로운" 연산자를 호출할 때마다 서버 종류의 독립적인 인스턴스로 프록시를 반환합니다.

.NET Remoting을 사용하여 개체 전달

.NET Remoting에서 다음과 같은 방법으로 개체를 응용 프로그램 사이에서 전달할 수 있습니다.

  1. 메서드 호출에서 매개 변수로

: public int myRemoteMethod (MyRemoteObject myObj)

  1. 메서드 호출의 반환 값

: public MyRemoteObject myRemoteMethod(String myString)

  1. .NET 구성 요소의 속성 또는 필드 액세스 결과 값

: myObj.myNestedObject

Marshal By Value (MBV) 개체의 경우에 개체를 다른 응용 프로그램으로 전달하면 개체의 복사본이 만들어집니다.

Marshal By Reference (MBR) 개체의 경우에 다른 응용 프로그램을 전달할 때 개체의 참조가 만들어집니다. 개체 참조(ObjRef)가 원격 응용 프로그램에 도착할 때 이 참조는 원래 개체에 대한 "프록시"로 전환됩니다.

 

간단한 .NET Remoting 서버 개체용 예제 코드

using System;

using System.Runtime.Remoting;

namespace myRemoteService

{

    // Well Known Web Service object

    public class myRemoteObject : MarshalByRefObject

    {

        // Method myRemoteMethod

        public String myRemoteMethod(String s)

        {

         return "Hello World";

        }

    }

}

이 개체를 액세스할 수 있는 예제 클라이언트 코드

using System;

using System.Runtime.Remoting;

using myRemoteService;

public class Client

{

    public static int Main(string[] args)

    {

        ChannelServices.RegisterChannel(new HTTPChannel(7055));

      // Create an instance of a myRemoteObject class

   myRemoteObject myObj = ( myRemoteObject)Activator.GetObject(typeof(myRemoteObject),

            "http://myHost:7021/host/myRemoteObject.soap");

      myObj. myRemoteMethod ("Hello World");

        return 0;

    }

}

임대 기반 수명

응용 프로그램 밖으로 전송된 개체 참조가 있는 개체의 경우에 임대가 만들어집니다. 임대에는 임대 시간이 있습니다. 임대가 0에 이르면 임대는 만기가 되고 개체의 연결이 .NET Remoting Framework에서 끊어집니다. AppDomain 내에서 개체에 대한 모든 참조가 제거되면 다음 GC가 발생할 때 개체가 수집됩니다. 임대는 개체의 수명을 제어합니다.

개체는 기본 임대 기간을 가지고 있으며 클라이언트가 같은 서버 개체에서 상태를 유지하려는 경우에 개체를 살려 두기 위해서 임대 기간을 연장하는 방법이 여러 개 있습니다.

  1. 서버 개체에서 임대 시간을 무한으로 설정하면 잘못된 컬렉션 주기 동안 이를 수집하지 않도록 Remoting에게 지시됩니다.
  2. 클라이언트는 RemotingServices.GetLifetimeService 메소드를 호출하여 AppDomain의 임대 관리자로부터 서버 개체의 임대를 가져올 수 있습니다. 또한 Lease 개체로부터 Lease.Renew 메소드를 호출하여 임대를 연장할 수 있습니다.
  3. 클라이언트는 AppDomain의 임대 관리자와의 특정 임대용으로 스폰서를 등록할 수 있습니다. 원격 개체의 임대가 만기되면 임대 관리자는 스폰서를 다시 호출하여 임대 갱신을 요청할 수 있습니다.
  4. ILease::RenewOnCallTime 속성이 설정되면 원격 개체에 대한 각 호출이 RenewOnCallTime 속성에서 지정한 시간 만큼 임대를 갱신합니다.

 

 

Single Call/Singleton Objects

CAO(Client Activated Objects)

클라이언트 측 활성화 코드 (클라이언트에서 활성화한 코드)

자세한 내용은 구성 파일에 대한 부분을 참고하십시오.

a) Activator.GetObject()

b) CFG 파일에서 new()

클라이언트의 CFG 파일에서 다음 URL을 참조합니다.

Foo= http://localhost:80/ObjectZone/Foo.soap

a) Activator.CreateInstance()

b) CFG 파일에서 new()

클라이언트의 CFG 파일에서 서버 라이브러리 및 서버 응용 프로그램의 URL을 참조하며 개체의 URL을 제공합니다. 다음 라이브러리를 참조하여 클라이언트를 구축합니다.

Assembly#MyObjectLibrary#ObjectZone#
  MyObjectLibrary.Baz

RemoteApplication#ObjectZone#
  HTTP://localhost:80/ObjectZone

서버 개체의 활성화

첫 번째 메서드 호출이 이뤄질 때까지 활성화 메시지를 네트워크를 통해 전송하지 않습니다.

클라이언트에서 개체를 작성하고 클라이언트에 프록시가 작성될 때 활성화 메시지가 서버로 전송됩니다. 매개 변수가 포함된 생성자가 지원됩니다.

서버 개체의 수명

서버의 구성에서 수명을 결정합니다. SingleCall이나 Singleton입니다.

다음과 같은 경우에 수명이 짧아집니다.

a) 임대 만기

b) 클라이언트가 서버 개체에 대한 참조를 잃는 경우

서버측 등록

a) 구성 파일을 사용하여 종류(SingleCall 또는 Singleton)를 지정합니다.

b) RegisterWellKnownType() api로 종류 등록

구성 파일을 사용하여 CAO(Client Activated object)를 가져옵니다.

자세한 내용은 구성 파일에 대한 부분을 참고하십시오.

모델의 장점

a) 서버 구성 요소의 기본 클래스나 인터페이스 정의인 Common Language Runtime 메타데이터에 대해서 클라이언트를 컴파일할 수 있습니다.

b) 서버에서 한정된 작업을 수행하는데 유용합니다.

c) Single Call 개체는 상태를 유지하지 않기 때문에 로드 균형 조정된 시스템에서 쉽게 배포할 수 있습니다.

d) Singleton Objects는 클라이언트 개체 사이에 상태 정보를 유지할 수 있습니다.

a) 서버 개체의 호출과 같은 기존 COM "coclass"

b) 서버 개체의 수명을 관리하기 위해서 클라이언트에 유연성을 부여합니다.

c) 클라이언트가 만들어진 개체로 생성자 매개 변수를 전달할 수 있습니다.

d) 서버 개체가 메소드 호출 사이에 특정 클라이언트용 상태를 유지할 수 있습니다.

 

 

.NET Remoting 개체 호스트

다음과 같이 .NET Remoting 개체를 호스트할 수 있습니다.

  1. 관리되는 실행 파일 .NET Remoting 개체를 일반 .NET  EXE 또는 관리되는 서비스로 호스트할 수 있습니다.
  2. IIS Remoting 개체를 Internet Information Server (IIS)에서 호스트할 수 있습니다. 기본적으로 IIS에서 호스트하는 Remoting 개체는 HTTP 채널을 통해 메시지를 받습니다. IIS 하에서 Remoting 개체를 호스트하려면 가상 루트를 만들고 "remoting.cfg" 파일을 이 루트에 복사해야 합니다. 원격 개체가 포함된 실행 파일이나 DLL IIS 루트가 가리키는 디렉터리 아래에 있는 빈 디렉터리에 놓아야 합니다. IIS 루트 이름이 구성 파일에 지정된 응용 프로그램 이름과 동일해야 하므로 주의하십시오. 첫 번째 메시지가 응용 프로그램에 도착할 때 Remoting 구성 파일이 자동으로 로드됩니다. 이렇게 하면 .NET Remoting 개체가 웹 서비스로 표시될 수 있습니다.

예제 Remoting.cfg 파일:

Name#HelloService

WellKnownObject#HelloService.Hello#HelloService#HelloService/

   Hello.soap#SingleCall

 

설명:

Name#[응용 프로그램 이름]

WellKnownObject#[종류이름]#[어셈블리이름]#[개체URI]#[개체모드]

  1. .NET 구성 요소 서비스 .NET Remoting 개체를 .NET 구성 요소 서비스 인프라에서 호스트하면 Transactions, JIT, 개체 풀링 등과 같은 다양한 COM+ 서비스의 장점을 이용할 수 있습니다.

채널 서비스(System.Runtime.Remoting.Channels)

.NET 응용 프로그램과 AppDomains는 메시지를 사용하여 서로 통신합니다. .NET 채널 서비스는 이 통신의 기본 전송 메커니즘을 제공합니다.

.NET 프레임워크는 HTTP, TCP SMTP 채널을 제공하며 제 3업체가 직접 작성하여 자신의 채널로 플러그인할 수 있습니다. HTTP SMTP 채널은 기본적으로 SOAP를 사용하여 통신하는 반면 TCP 채널은 바이너리 페이로드를 사용합니다.

채널 서비스는 다른 유형의 응용 프로그램을 통합하기 위해서 작성할 수 있는 사용자 정의 채널을 사용하여 플러그 가능합니다(IChannel 사용).

채널 서비스를 로드하는 예제 코드

public class myRemotingObj

{

    HTTPChannel httpChannel;

    TCPChannel    tcpChannel;

    public void myRemotingMethod()

    {

httpChannel =  new HTTPChannel();

tcpChannel  =  new TCPChannel();

        ChannelServices.RegisterChannel(httpChannel);// Register the HTTP Channel

        ChannelServices.RegisterChannel(tcpChannel);// Register the TCP Channel 

 

 

    }

}

 

순서화 형식 지정자(System.Runtime.Serialization.Formatters)

.NET 순서화 형식 지정자는 .NET 응용 프로그램과 AppDomains 사이에서 메시지를 인코드 및 디코드합니다. .NET 런타임은 두 가지 원시 형식 지정자를 가지는 데, Binary(System.Runtime.Serialization.Formatters.Binary) SOAP(System.Runtime.Serialization.Formatters.Soap)이 이에 해당합니다.

순서화 형식 지정자는 IRemotingFormatter 인터페이스를 구현하고 위에서 설명한 채널에 플러그함으로써 플러그가 가능합니다. 따라서 사용하는 응용 프로그램에 알맞은 채널과 형식 지정자의 배합을 선택할 수 있습니다. 아래 부분에서 보다 자세하게 설명하겠습니다.

: 바이너리 데이터를 순서화하는 바이너리 형식 지정자를 사용하는 HTTP 채널과 SOAP 형식 지정자를 사용하는 TCP 채널을 가질 수 있습니다.

Remoting 컨텍스트

컨텍스트는 공통적인 런타임 속성을 공유하는 개체가 포함된 범위를 말합니다. 컨텍스트 속성의 일부 예는 동기화 및 스레드 선호도입니다. .NET 개체가 활성화될 때 현재 컨텍스트가 호환 가능한지 런타임에서 확인하며 호환되지 않는 경우에 새로운 컨텍스트가 만들어집니다. 컨텍스트는 동시에 여러 개체를 실행할 수 있으며 하나의 AppDomain은 여러 컨텍스트를 가질 수 있습니다.

한 컨텍스트의 개체에서 다른 컨텍스트의 개체로 호출하면 컨텍스트 프록시를 통과하며 결합된 컨텍스트 속성이 실시하는 정책의 영향을 받습니다. 새 개체의 컨텍스트는 클래스의 메타데이터 속성을 기준으로 보통 선택됩니다.

한 컨텍스트로 연결된 클래스는 컨텍스트 연결 클래스라고 합니다. 컨텍스트 연결 클래스에 컨텍스트 속성으로 알려진 특별한 사용자 정의 속성을 지정할 수 있습니다. 컨텍스트 속성은 확장 가능하며 이런 속성을 만들어서 클래스에 첨부할 수 있습니다. 한 컨텍스트에 연결된 개체는 System.ContextBoundObject에서 파생됩니다.

 

.NET Remoting 메타데이터 및 구성 파일

.NET 프레임워크에서 메타데이터와 어셈블리를 사용하여 구성 요소에 대한 정보를 저장하며 언어에 관계없는 프로그래밍을 가능하게 합니다. .NET Remoting은 메타데이터를 사용하여 프록시 개체를 역동적으로 만듭니다. 클라이언트 측에서 만들어진 프록시 개체는 같은 멤버를 원래 클래스로 가집니다. 그러나 프록시 개체를 구현하면 .NET Remoting 런타임의 모든 요청을 원래 개체로 포워드만합니다. 순서화 형식 지정자는 메타데이터를 사용하여 메소드 요청을 페이로드 스트림으로 변환합니다.

클라이언트는 원격 개체를 액세스하는 데 필요한 메타데이터 정보를 다음과 같은 방법으로 확보할 수 있습니다.

  1. 서버 개체의 .NET 어셈블리 - 서버 개체는 메타데이터 어셉블리를 만들어서 클라이언트에 배포할 수 있습니다. 클라이언트 개체는 클라이언트 개체를 컴파일하는 반면 어셈블리를 참조할 수 있습니다. 클라이언트와 서버가 관리 구성 요소인 폐쇄된 시나리오에서 매우 유용합니다.
  2. Remoting 개체는 개체와 메소드를 설명하는 WSDL("WSDL(Web Services Description Language) 1.1" 참조) 파일을 제공할 수 있습니다. WSDL 파일에 일치하는 SOAP 요청을 읽고 생성할 수 있는 클라이언트는 이 개체를 호출하고 SOAP를 사용하여 개체와 통신할 수 있습니다. .NET Remoting Server 개체는 .NET SDK와 함께 제공되는 SOAPSUDS.EXE 툴을 사용하여 메타데이터로 사용할 수 있는 WSDL 파일을 생성할 수 있습니다. 한 조직에서 클라이언트가 액세스하고 사용할 수 있는 공공 서비스를 제공하려고 할 때 유용합니다.
  3. .NET 클라이언트는 메타데이터만 포함되고 코드는 없는 소스 파일이나 어셈블리를 생성하기 위해서 SOAPSUDS 유틸리티를 사용하여 서버에서 XML 스키마(서버에서 생성됨)를 다운로드할 수 있습니다. 소스 파일은 한 계층의 개체가 다른 계층의 원격 개체를 액세스하는 다중 계층 응용 프로그램에서 유용합니다.

구성 파일(.CFG 파일)은 지정된 개체에 대한 다양한 Remoting 특정 정보를 지정하는 데 사용됩니다. CFG 파일을 사용하면 위치 정확성이 향상됩니다. CFG 파일에 지정된 세부 사항을 프로그래밍할 수 있습니다. 이 파일을 사용하는 장점은 클라이언트 코드에 해당되는 구성 정보를 분리할 수 있으므로 나중에 내용을 변경할 때 소스 파일을 편집하고 다시 컴파일할 필요 없이 CFG 파일만 변경하면 됩니다. .NET Remoting 클라이언트와 서버 개체에서 모두 구성 파일을 사용합니다.

CFG 파일에는 다음 내용이 포함됩니다.

  1. 호스트 응용 프로그램 정보
  2. 개체 이름
  3. 개체 URI
  4. 등록된 채널(동시에 여러 채널을 등록할 수 있습니다.)
  5. 서버 개체용 임대 시간 정보

예제 구성 파일(나중 릴리스에서 현재 포맷이 XML로 변경될 수 있으니 참고하십시오.):

Name#MyRemoteApp

myRemoteObj = HTTP://myCompany:80/MyRemoteApp/myRemoteObj.soap

Channel#System.Runtime.Remoting#System.Runtime.Remoting.Channels.TCP.TCPChannel

Channel#System.Runtime.Remoting#System.Runtime.Remoting.Channels.HTTP.HTTPChannel

 

.NET Remoting 시나리오

.NET Remoting의 기본 사용법을 이해했으면 이제 다양한 시나리오를 살펴보고 시나리오에 따라 .NET Remoting을 최적으로 사용하는 방법을 알아보기로 하겠습니다. 다음 표는 기본으로 사용하는 프로토콜과 페이로드 및 사용 가능한 클라이언트-서버 배합을 목록으로 보여 줍니다. .NET Remoting 프레임워크는 확장 가능하며 원하는 통신 채널 및 순서화 형식 지정자를 직접 작성할 수 있습니다.

클라이언트

서버

페이로드

프로토콜

.NET 구성 요소

.NET 구성 요소

SOAP/XML

http

.NET 구성 요소

.NET 구성 요소

바이너리

TCP

관리/비관리

.NET 웹 서비스

SOAP/XML

http

.NET 구성 요소

관리되지 않는 기존 COM 구성 요소

NDR (Network Data Representation)

DCOM

관리되지 않는 기존 COM 구성 요소

.NET 구성 요소

NDR

DCOM

 

 

모든 클라이언트 <-> HTTP-SOAP을 사용하는 .NET

웹 서비스는 URL로 표시 가능한 리소스로 정보를 원하는 클라이언트에게 반환하도록 프로그래밍되어 있습니다. 클라이언트는 구현 방법에 대해 걱정하지 않고 웹 서비스를 사용할 수 있습니다. 웹 서비스는 계약이라고 하는 잘 정의된 인터페이스를 사용합니다. 계약서는 WSDL(Web Services Description Language) 파일을 사용하여 설명됩니다. WSDL에 대한 자세한 내용은 "WSDL(Web Services Description Language) 1.1"을 참고하십시오.

.NET Remoting 개체는 IIS에서 호스트함으로써 웹 서비스로 표시될 수 있습니다. WSDL 파일을 소비할 수 있는 클라이언트라면 WSDL 파일에 저정된 계약대로 원격 개체에 대한 SOAP 호출을 할 수 있습니다. IIS ISAPI 확장을 사용하여 요청을 알맞은 개체로 보냅니다. 따라서 Remoting 개체는 웹 서비스 개체처럼 작동될 수 있으며 풍부한 .NET Framework 인프라를 레버리지할 수 있습니다. 이 구성은 다른 플랫폼/환경의 프로그램에서 여러분의 개체를 액세스할 수 있도록 허용할 때 유용합니다.

그림 1. 클라이언트가 HTTP-SOAP를 통해 Remoting 개체의 웹 서비스를 호출한 예

.NET<-> SOAP-HTTP 채널을 사용한 .NET

HTTP 채널은 SOAP 형식 지정자를 기본으로 사용하므로 클라이언트가 인터넷 상에서 개체를 액세스하는 경우에 사용할 수 있습니다. 이 과정에서 HTTP를 사용하기 때문에 이 구성을 사용하여 방화벽을 통해 .NET 개체를 원격으로 액세스할 수 있습니다. 이렇게 노출된 개체는 위에서 설명한대로 IIS에서 호스트하면 웹 서비스 개체로 쉽게 구성할 수 있습니다. 그런 다음 개체의 WSDL 파일을 읽으면 SOAP를 사용하여 Remote 개체와 통신할 수 있습니다.

.NET<->TCP 채널을 사용하는 .NET

TCP 채널은 바이너리 형식 지정자를 기본으로 사용합니다. 이 형식 지정자는 데이터를 바이너리 형태로 순서화해서 원시 소켓을 사용하여 데이터를 네트워크를 통해 전송합니다. 이 방식은 개체가 방화벽이 있는 폐쇄된 환경에서 배포될 때 이상적입니다. 이 접근법은 개체 사이에서 소켓을 사용하여 바이너리 데이터를 통신할 때 더욱 최적화됩니다. TCP 채널을 사용하여 개체를 표시하면 폐쇄된 환경에서 오버헤드가 낮아지는 장점이 있습니다. 방화벽 및 구성 문제 때문에 인터넷 상에서는 이 방법을 사용할 수 없습니다.

그림 2. 클라이언트가 TCP 채널을 통해 컴퓨터 경계에서 Remoting 개체를 호출한 예

.NET <-> 관리되지 않은 COM 구성 요소 <-> .NET

COM Interop Services를 통해 관리되지 않은 기존 COM 구성 요소를 호출할 수 있습니다. .NET Remoting 클라이언트 개체에서 COM 개체의 인스턴스를 만들 때 개체는 관리되지 않은 실제 개체의 프록시처럼 작동하는 RCW(Runtime Callable Wrapper)를 통해 표시됩니다. 이런 래퍼는 .NET 클라이언트에 대한 관리되는 다른 클래스처럼 보입니다. 그러나 실제로는 관리된(.NET) 코드와 비관리(COM) 코드 사이에서 호출을 마샬링합니다.

비슷한 방법으로 .NET Remoting 서버 개체를 기존 COM 클라이언트로 노출할 수 있습니다. COM 클라이언트가 .NET 개체의 인스턴스를 만들 때 개체는 관리되는 실제 개체의 프록시처럼 작동하는 CCW(COM Callable Wrapper)를 통해 노출됩니다.

이 두 가지 시나리오 모두 DCOM을 사용하여 통신합니다. 서로 다른 기존 COM .NET 구성 요소가 함께 사용되는 경우에 이런 상호 운영성이 더욱 유용해집니다.

 

결론

Microsoft .NET Framework는 강력하고 확장 가능하며 언어에 관계 없는 프레임워크를 제공하므로 믿을 수 있고 융통성 있는 배포 시스템을 개발할 수 있습니다. .NET Remoting Framework는 시스템 요구 사항에 따라 강력한 원격 상호 작용을 가능하게 해 주는 여러 방법을 제공합니다. .NET Remoting은 웹 서비스와 자연스럽게 통합되며 여러 플랫폼에서 액세스할 수 있도록 .NET 개체를 노출하는 방법을 제공합니다.

 


|

사용자 컨트롤 및 사용자 지정 웹 파트로 포털 개인 설정




이 기사는 ASP.NET 2.0 시험판 버전을 기준으로 합니다. 여기에 포함된 모든 정보는 변경될 수 있습니다.

이 기사에서는 다음 내용에 대해 설명합니다.
  • 웹 파트를 사용하여 모듈식 웹 포털 응용 프로그램 만들기
  • 개인 설정 및 사용자 지정 기능
  • 사용자 지정 사용자 컨트롤을 웹 파트로 사용
  • 개인 설정 공급자 만들기
이 기사에서 사용하는 기술:
ASP.NET 2.0


코드 다운로드 위치:
WebParts.exe(619KB)

포털 응용 프로그램은 현재 매우 널리 사용되고 있으며, 뛰어난 포털 응용 프로그램에는 몇 가지 공통점이 있습니다. 실용적인 포털에서는 모듈식의 일관성 있고 탐색이 용이한 사용자 인터페이스를 통해 다양한 콘텐츠가 제공됩니다. 보다 복잡한 포털에서는 사이트 구성원이 콘텐츠를 직접 작성하고 문서를 업로드하며 포털 페이지를 개인 설정할 수도 있습니다.

Microsoft에서는 Windows SharePoint Services를 출시하면서 Windows Server™ 2003 플랫폼에 확장 가능한 포털 프레임워크를 추가했습니다. SharePoint Services에서는 사이트 멤버십 지원, 콘텐츠 및 문서 관리, 웹 파트 사용을 통한 모듈식 데이터 표시 등을 포함하여 포털 프레임워크에 필요한 기본 요소를 제공합니다.

웹 파트는 사용자 지정 및 개인 설정을 수행하기 위한 기초가 됩니다. 또한 사용자는 사이트 구성에 따라 웹 파트를 추가, 재구성 및 제거하여 Windows SharePoint Services의 페이지를 손쉽게 개인 설정하거나 사용자 지정할 수 있습니다. 사용자 지정 웹 파트를 개발하면 Windows SharePoint Services를 기반으로 하여 사이트를 간편하고도 효과적으로 확장할 수 있습니다. 사용자 지정 및 개인 설정을 지원하는 사용자 지정 웹 파트를 만들려면 사용자 웹 파트 클래스에 속성을 추가하고 몇 가지 특수한 특성을 적용하면 됩니다. Windows SharePoint Services의 웹 파트 인프라에서는 사이트 사용자 지정 및 구성원 개인 설정에 관련된 번거로운 데이터 serialize, 저장 및 검색 작업을 모두 수행합니다.

ASP.NET 2.0에 새롭게 도입된 웹 파트 컨트롤 집합은 데이터 사용자 지정 및 개인 설정의 serialization, 저장 및 검색을 백그라운드로 처리하도록 만들어졌다는 점에서 Windows SharePoint Services의 웹 파트 컨트롤과 비슷합니다. 그러나 ASP.NET의 웹 파트 컨트롤은 SQL Server™ 또는 Active Directory에 밀접하게 결합되어 있지 않다는 점에서 차이를 보일 뿐 아니라 융통성이 뛰어난 이점이 있습니다. 이는 폼 기반 인증을 사용하여 포털 응용 프로그램을 빌드하거나 특정 데이터베이스 솔루션에 얽매이지 않으려는 업체에게 매우 유용한 특성입니다.

그림 1. 모듈식 웹 파트 디자인을 보여 주는 샘플 포털
그림 1. 모듈식 웹 파트 디자인을 보여 주는 샘플 포털

이 기사에서는 ASP.NET 2.0의 웹 파트를 사용하여 작성한 샘플 응용 프로그램을 살펴봅니다. 이 기사의 주된 목적은 포털 응용 프로그램에 사용할 웹 파트를 개발할 때 발생할 수 있는 중요한 디자인 문제를 설명하는 것입니다. 먼저 ASP.NET 2.0의 새 웹 파트 컨트롤 집합을 사용하는 것과 관련된 기본 개념 및 컨트롤 유형에 대해 알아보겠습니다. 포털의 예는 그림 1을 참조하십시오.


웹 파트 입문
그림 2. 웹 파트 페이지의 일반적인 레이아웃
그림 2. 웹 파트 페이지의 일반적인 레이아웃

웹 파트를 호스트하는 페이지를 웹 파트 페이지라고 합니다. 웹 파트 페이지에는 그림 2와 같이 정확히 하나의 WebPartManager 컨트롤 인스턴스와 하나 이상의 WebPartZone 컨트롤이 있어야 합니다. 또한 선택적으로 EditorZone 또는 CatalogZone 컨트롤을 포함할 수 있습니다. WebPartManager 컨트롤의 태그는 .aspx 파일에서 웹 파트 인프라와 연관된 WebPartZone, EditorZone 및 CatalogZone 같은 다른 컨트롤 태그보다 앞에 놓여야 합니다. 웹 파트 페이지의 레이아웃과 모양을 보다 효과적으로 제어하기 위해 HTML 테이블을 사용하여 .aspx 파일 내에 다른 영역을 배열할 수도 있습니다.

다음과 같은 WebPartManager 및 WebPartZone 컨트롤이 포함된 간단한 웹 파트 페이지 예제를 살펴봅시다.

<asp:WebPartManager ID=" WebPartManager1" runat="server" />

<asp:WebPartZone ID="WebPartZone1" runat="server" HeaderText="Zone 1">
  <ZoneTemplate>
       <!-- time to add a Web Part -->
     </ZoneTemplate>
   </asp:WebPartZone>

WebPartZone이 있으면 웹 파트 정의를 사용하여 웹 파트 인스턴스를 만들 수 있습니다. 웹 파트 정의는 다음과 같은 두 가지 방식으로 만듭니다. 첫 번째는 WebPart 클래스에서 상속되는 사용자 지정 클래스를 만드는 것이고, 두 번째는 사용자 컨트롤을 만드는 것입니다. 이러한 두 가지 방법의 장단점은 이 기사의 뒷부분에서는 좀 더 자세히 살펴보겠습니다. 지금은 일단 WebPart에서 파생되는 간단한 클래스를 작성해 봅니다(그림 3 참조).

각 웹 파트 인스턴스는 특정 인덱스에 있는 특정 WebPartZone 내의 특정 페이지에 있습니다. 하나의 WebPartZone에는 여러 개의 웹 파트가 포함될 수 있습니다. 예를 들어 그림 4에는 WebPartZone1이라는 영역 내에 두 개 웹 파트가 있습니다.

그림 4. 특정 영역의 웹 파트
그림 4. 특정 영역의 웹 파트

웹 파트는 프로그래밍 방식으로 또는 선언적으로 영역에 추가할 수 있습니다. 잠시 후 파트 카탈로그에 웹 파트를 추가하는 기법에 대해서도 살펴보겠습니다. CatalogPart를 만들고 나면 사용자가 런타임에 WebPartZone에 새 웹 파트를 추가할 수 있습니다.

코드를 사용하여 WebPartZone에 웹 파트를 추가하는 방법은 사용하는 웹 파트 유형에 따라 달라집니다. WebPart에서 상속되는 클래스가 있는 경우 프로그래밍 방식으로 클래스 인스턴스를 만들고 WebPartManager 클래스의 AddWebPart 메서드를 호출하면 됩니다. AddWebPart를 호출하려면 웹 파트 인스턴스, 대상 WebPartZone, 그리고 웹 파트가 대상 영역에서 표시될 인덱스를 지정하는 매개 변수를 전달해야 합니다.

// WebPart 파생 클래스에서 웹 파트 인스턴스를 만듭니다.
WebPart wp1 = new WingtipWebParts.HelloWorld();
WebPartManager1.AddWebPart(wp1, WebPartZone1, 0);(참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.)

이와 같이 프로그래밍 방식으로 WebPartZone에 웹 파트를 추가할 수 있습니다. 선언적 방식에서는 웹 파트 페이지의 .aspx 파일 내에 컨트롤 태그를 사용합니다. 사용자가 페이지를 처음 검색할 때 특정 WebPartZone에 웹 파트가 표시되도록 하려면 WebPartZone에 ZoneTemplate을 추가합니다.

<%@ Register Assembly="WingtipWebParts" Namespace="WingtipWebParts"
TagPrefix="Wingtip" %>

<asp:WebPartManager ID=" WebPartManager1" runat="server" />

<asp:WebPartZone ID="WebPartZone1" runat="server" HeaderText="Zone 1">
  <ZoneTemplate>
    <Wingtip:HelloWorld runat="server" id="HelloWorld" />
  </ZoneTemplate>
</asp:WebPartZone>

이 때 몇 가지 내용을 추가하지 않으면 웹 파트 페이지의 웹 파트가 너무 건조해 보일 것입니다. 인트라넷 포털 응용 프로그램에서 일반적으로 요구되는 기능은 사이트에 "스킨"을 적용하여 사용자의 취향에 따라 모양을 바꾸는 기능입니다. 예전에는 이를 위해 직접 인프라를 빌드하여 컨트롤 렌더링 변경을 지원해야 했으며, 여기에는 많은 작업이 수반되었습니다. ASP.NET 2.0에는 "테마"라는 개념이 도입되었습니다. 테마란 개별 컨트롤, 전체 페이지 또는 전역 응용 프로그램 수준까지 적용할 수 있는 스타일 및 컨트롤 특성 모음입니다.

포털 응용 프로그램을 보다 세련되고 전문적으로 만들려면 WebPartZone, EditorZone 및 CatalogZone 컨트롤의 모양을 모두 사용자 지정합니다. 웹 파트, 편집기 파트 및 카탈로그 파트의 본문, 제목 표시줄 및 동적 메뉴가 표시되는 모양에 스킨을 지정하고 사용자의 고유한 특성을 적용해야 하기 때문에 이 작업은 처음에 매우 지루할 수 있습니다. 다행히도 ASP.NET 2.0의 새 테마 기능을 사용하면 .aspx의 시각 효과 작업을 고려하여 다시 사용 가능한 .skin 및 .css 파일에 적용할 수 있습니다. 이 기사의 샘플 포털 응용 프로그램은 스킨 및 테마를 사용하여 웹 파트 모양을 사용자 지정하며, MSDN? Magazine 웹 사이트에서 이를 사용할 수 있습니다.


모드 및 페이지 범위 표시

하나의 WebPartManager 컨트롤 인스턴스가 각 웹 파트 페이지에서 실행되며, 웹 파트 인스턴스 및 해당 인스턴스가 WebPartZone 컨트롤에 관련되는 방식을 관리합니다. 또한 WebPartManager 컨트롤에서 제공하는 프로그래밍 방식 인터페이스를 사용하여 찾아보기, 디자인 및 편집 디스플레이 모드 사이에서 웹 파트 페이지를 전환할 수 있습니다. 예를 들어 프로그래밍 방식으로 현재 페이지를 디자인 모드로 전환하려면 다음과 같이 DisplayMode 속성을 DesignDisplayMode로 설정하는 이벤트 처리기가 있는 링크 컨트롤을 추가하면 됩니다.

WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode;

또한 웹 파트 페이지의 각 디스플레이 모드별 차이점을 이해해야 합니다. 기본적으로 웹 파트 페이지는 찾아보기 모드에서 작동하며, 이 모드에서 사용자는 웹 파트를 변경할 수 없습니다. 웹 파트 페이지를 디자인 모드로 전환하면 사용자는 WebPartZone 내에서 또는 영역 간에 웹 파트를 이동할 수 있습니다. 그림 5에는 사용 가능한 디스플레이 모드가 나와 있습니다.

ASP.NET 2.0 웹 파트 컨트롤은 필요한 DHTML 및 JavaScript를 백그라운드로 생성하여 브라우저 내에서 끌어서 놓는 작업을 수행할 수 있도록 합니다. 필요한 DHTML 및 JavaSript 기능을 지원하지 않는 브라우저에서도 끌어서 놓기 편집 기능을 제외한 모든 기능을 사용할 수 있습니다. 그렇기 때문에 모든 클라이언트에서 Microsoft Internet Explorer 5.0 이상을 사용하지 않아도 됩니다. ASP.NET 2.0 웹 파트 컨트롤은 또한 개인 설정 데이터의 저장 및 검색 작업을 관리하여 사용자가 이전 세션에서 웹 파트를 배치한 위치를 기억합니다.

WebPartManager에서는 디스플레이 모드 간에 코드를 전환할 수 있는 기능 외에도 사용자 범위 및 공유 범위 간에 웹 파트 페이지를 변경하는 방법을 제공합니다. 페이지 범위에 따라 웹 파트 변경 내용이 사용자 지정인지 개인 설정인지 여부가 결정됩니다. 사용자 지정 변경 내용은 모든 사용자에게 표시되지만, 개인 설정 변경 내용은 해당 변경 작업을 수행한 사용자에게만 표시됩니다. 웹 파트 변경 작업은 다음과 같이 WebPartManager 컨트롤의 ToggleScope 메서드를 호출하여 수행됩니다.

WebPartManager1.Personalization.ToggleScope();

기본 범위는 사용자 범위이며 여기서 웹 파트 변경 내용은 현재 사용자에게만 표시되는 개인 설정으로 기록됩니다. ToggleScope 메서드를 제대로 호출하면 웹 파트 페이지가 공유 범위에 배치되며, 변경 사항이 사용자 지정으로 기록됩니다. 공유 범위의 용도는 관리자나 사이트 디자이너가 모든 사용자에게 표시되는 웹 파트 페이지에서 웹 파트에 대해 사용자 지정 변경 작업을 일괄적으로 수행할 수 있도록 하는 것입니다. 사용자가 수행한 모든 개인 설정 변경 내용이 전역 사용자 지정과 중복되는 경우에는 개인 설정 변경 내용이 항상 우선합니다.

현재 사용자가 항상 공유 범위로 들어갈 수 있는 것은 아닙니다. 기본적으로 공유 범위로 들어가는 데 필요한 권한을 가진 사용자는 없습니다. 공유 범위로 들어가려면 Web.config 파일에서 해당 권한을 부여 받아야 합니다. 다음은 admin 또는 site_designer 역할로 모든 사용자에 대해 공유 범위로 들어가 전역 사용자 지정을 수정할 수 있는 권한을 부여하는 예제입니다.

<webParts>
  <personalization>
    <authorization>
      <allow roles="admin, site_designer" verbs="enterSharedScope" />
    </authorization>
  </personalization>
</webParts>

속성 및 개인 설정

각 웹 파트 개체에는 사용자 지정 또는 개인 설정할 수 있는 표준 속성 집합이 있습니다. 예를 들어 각 웹 파트에는 WebPartZone에 추가한 후 사용자 지정할 수 있는 Title 속성이 있습니다. EditorZone 컨트롤 및 다양한 편집기 파트를 사용하면 사용자가 웹 파트 속성을 변경할 수 있습니다.

사용자가 웹 파트 페이지를 EditDisplayMode로 설정하면 웹 파트 메뉴에 Edit 명령이 제공됩니다. 특정 웹 파트에서 Edit 명령을 호출하면 해당 영역에 배치한 편집기 파트와 함께 EditorZone이 표시됩니다. ASP.NET 2.0에는 표준 웹 파트 모양, 동작 및 레이아웃을 수정하기 위한 여러 개의 편집기 파트가 기본적으로 제공됩니다.

웹 파트 개인 설정 스키마는 개인 설정 가능한 사용자 지정 속성을 추가하여 간편하게 확장할 수 있습니다. 웹 파트 클래스 정의에 속성을 추가하고 Personalizable, WebBrowsable 및 WebDisplayName 같은 특성을 적용하면 됩니다. 이 작업을 완료하고 나면 웹 파트 컨트롤에서 사용자 지정 또는 개인 설정된 속성 값을 저장 및 검색합니다.

사용자 지정 속성을 만들 때는 보통 다음과 같이 개인 필드를 정의합니다.

private bool _HR = true;

[Personalizable(PersonalizationScope.User), 
 WebBrowsable, WebDisplayName("HR 뉴스 표시"),
 WebDescription("이 속성을 사용하여 HR 뉴스 표시/숨김")]
public bool HR 
{
  get { return _HR; } set { _HR = value; }
}

사용자가 이와 같이 속성을 개인 설정할 수 있도록 하려면 PropertyGridEditorPart를 현재 페이지의 EditorZone에 추가하면 됩니다. 그림 6은 이 작업을 수행할 때 사용자에게 표시되는 화면을 보여줍니다.

그림 6. 사용자가 웹 파트를 개인 설정할 수 있는 편집기 파트
그림 6. 사용자가 웹 파트를 개인 설정할 수 있는 편집기 파트

문자열 또는 숫자 형식을 기반으로 웹 파트 속성을 정의하는 경우 PropertyGridEditorPart에서는 사용자가 값을 변경하도록 입력란을 제공합니다. 부울 값을 기반으로 웹 파트 속성을 정의하는 경우에는 PropertyGridEditorPart에서 그림 6과 같은 확인란을 제공합니다.

그림 7에는 Windows SharePoint Services를 사용한 웹 파트 개발에서 사용할 수 있는 유용한 프로그래밍 기법이 나와 있어, 해당 유형을 열거 유형을 기반으로 하는 개인 설정 속성을 정의할 수 있습니다.

열거를 기반으로 하는 개인 설정 속성인 WebBrowsable을 만들면 그림 7에서 Timeframe 속성에 대해 표시한 것처럼 PropertyGridEditorPart에서 사용자가 사용 가능한 속성 설정의 드롭다운 목록을 생성하므로 매우 유용합니다. 그러므로 사용자는 편리하게 작업을 수행하고 올바른 속성 값을 선택할 수 있습니다.

Timeframe 속성 정의에 대해서 알아두어야 할 사항이 한 가지 더 있습니다. 이 속성 정의는 PersonalizationScope.Shared 설정이 있는 Personalizable 특성으로 정의되었습니다. 이러한 방식을 사용하여 공유 속성으로 정의된 속성은 사용자 지정할 수 있지만 개인 설정할 수는 없습니다. 공유 속성은 개인 설정에 사용할 수 없으므로 현재 웹 파트 페이지가 사용자 범위에 있으면 해당 속성은 PropertyGridEditorPart에 표시되지 않으며, 페이지가 공유 범위에 있을 때만 표시됩니다.


웹 파트 카탈로그

지금까지 웹 파트를 WebPartZone으로 채우는 웹 파트 페이지를 살펴보았습니다. 이 기법은 사용자가 런타임에 새 웹 파트를 추가하도록 하는 다른 방식을 통해 보다 수준 높게 활용할 수 있습니다. 이러한 작업은 PageCatalogPart 및 DeclarativeCatalogPart 같은 CatalogZone 및 CatalogPart를 사용하여 수행할 수 있습니다(그림 8 참조).

이와 같은 방식으로 CatalogZone 및 CatalogPart를 추가하고 나면 사용자는 그림 9와 같은 사용자 인터페이스를 통해 런타임에 동적으로 웹 파트를 추가할 수 있습니다.

그림 9. 사용자가 동적으로 웹 파트를 추가할 수 있도록 하는 CatalogZone
그림 9. 사용자가 동적으로 웹 파트를 추가할 수 있도록 하는 CatalogZone

먼저 PageCatalogPart의 용도를 이해해야 합니다. 디자인 디스플레이 모드 또는 편집 디스플레이 모드에서 사용자는 웹 파트에 대해 Close 명령을 호출할 수 있습니다. 사용자가 웹 파트를 닫으면 나중에 사용자가 해당 WebPart를 다시 추가할 수 있도록 웹 파트 및 개인 설정 또는 사용자 지정 설정이 보존됩니다. 그러므로 PageCatalogPart에는 닫혀 있으며 페이지에 추가할 수 있는 모든 웹 파트 목록이 표시됩니다.

Close 명령은 Delete 명령과는 다릅니다. Delete 명령은 편집 디스플레이 모드에서만 사용할 수 있습니다. 사용자가 웹 파트를 삭제하면 사용자 지정 및 개인 설정 데이터를 포함하여 웹 파트의 존재에 관한 모든 정보가 저장소에서 삭제됩니다.

웹 파트를 사용하여 DeclarativeCatalogPart를 선언적으로 채울 수 있습니다. 그림 8의 코드에서는 사용자 지정 이름의 WeatherWebPart로 이 카탈로그를 채우는 방법을 보여 줍니다. 이 방법을 사용하면 사용자가 모든 종류의 웹 파트를 사용하도록 할 수 있습니다.

이 기사의 내용을 보충하고 웹 파트 페이지 빌드에 대해 보다 자세히 알아보려면 Stephen Walther의 기사인 "Introducing the ASP.NET 2.0 Web Parts Framework"(영문)를 참조하십시오. 이 기사에는 EditorZone 및 CatalogZone을 사용한 웹 파트 페이지 빌드에 대한 보다 자세한 내용과 실제 예제가 나와 있습니다. 또한 Verbs, Connections, 웹 파트 가져오기/내보내기 등 보다 수준 높은 주제에 대해서도 설명하고 있습니다.


ASP.NET 2.0 포털 개발

ASP.NET 2.0에는 WebPart 인프라 자체 외에도 인트라넷 포털 사이트 개발에 필요한 여러 가지 유용한 새 기능이 있습니다. 이 기사 앞부분에서 언급했듯이 테마 및 스킨이 도입되어 포털 페이지에서 스타일 속성을 구분하기가 매우 간편해졌으며, 개별 페이지를 변경하지 않고도 일괄적으로 스타일 변경 사항을 적용할 수 있게 되었습니다. 그러나 보다 맘에 드는 것은 마스터 페이지의 도입입니다. 마스터 페이지를 사용하면 모든 WebPartZone 및 전체 WebPartManager 컨트롤을 단일 템플릿 페이지로 분리할 수 있습니다. 이 템플릿 페이지에서 개별 페이지는 기본 모양 및 기능을 상속합니다. 이 기사의 샘플 포털에서는 마스터 페이지에 있는 각 WebPartZone의 ZoneTemplate 내에 ContentPlaceholder를 추가하는 흥미로운 기법을 사용합니다. 이 방법을 사용하면 해당 마스터 페이지를 사용하는 콘텐츠 페이지는 각각의 ContentPlaceHolder 컨트롤로 매핑되는 Content 컨트롤을 사용하여 자체 웹 파트를 추가할 수 있습니다.

포털 사이트용 마스터 페이지를 디자인할 때 결정해야 하는 사항 중 하나는 사용자가 사용자 지정 기능을 사용할 수 있도록 하는 방법입니다. 앞서 살펴본 것처럼 페이지에 추가하는 영역 유형에 따라 사용자는 다양한 사용자 지정 모드를 선택하여 페이지를 변경할 수 있습니다.

사용자에게 사용자 지정 옵션이 표시되도록 하는 한 가지 옵션은 WebPartManager 컨트롤 및 단추 컬렉션(보통 LinkButton)을 모두 사용자 컨트롤에 래핑하는 것입니다. 그러면 마스터 페이지에 해당 사용자 컨트롤이 추가되어 사이트의 모든 페이지에 대해 사용자 지정 옵션을 제공합니다. 웹 사이트에 마스터 페이지를 두 개 이상 만들려는 경우에는 이러한 컨트롤을 사용자 컨트롤(여기서는 WebPartManagerPanel이라고 함)에 캡슐화하는 방법도 유용합니다. 그러면 페이지의 일부 하위 집합에 대해 대체 레이아웃이 제공됩니다. 앞서 그림 1에서 살펴보았던 응용 프로그램의 메뉴 모음에는 WebPartManager의 현재 모드 및 범위를 표시하는 샘플 사용자 컨트롤이 표시되어 있습니다. 이 샘플 컨트롤에는 또한 페이지 모드를 WebPartManager에서 지원하는 편집 모드 중 하나로 변경하는 LinkButton도 제공됩니다(이것은 샘플 포털 응용 프로그램에서 사용하는 컨트롤임).

WebPartManagerPanel은 현재 사용자 및 페이지를 기준으로 사용 가능한 디스플레이 모드를 동적으로 표시하거나 숨기는 등의 다른 유용한 기능도 제공합니다. WebPartManager의 SupportedDisplayModes 컬렉션을 확인하고 이 정보를 사용하여 해당 모드를 표시하는 메뉴 항목을 설정하거나 해제함으로써 지원되는 디스플레이 모드를 쿼리할 수 있습니다. 예를 들어 현재 페이지에서 CatalogDisplayMode를 지원하는지 여부를 확인하려면 다음을 수행하십시오.

if (WebPartManager1.SupportedDisplayModes.Contains(
    WebPartManager.CatalogDisplayMode)) {
  //여기에 카탈로그 디스플레이 모드 LinkButton 표시
}

또한 적절한 권한이 없는 사용자 컨텍스트 내에서 실행하는 경우 ToggleScope 호출은 실패합니다. WebPartManager 컨트롤의 Personalization 속성이 제공하는 CanEnterSharedScope 속성을 쿼리하는 코드를 제공하여 사용자가 공유 범위로 들어올 수 있도록 하는 사용자 인터페이스 요소를 숨길 것인지 또는 표시할 것인지 여부를 결정하는 것이 좋습니다.

if (WebPartManager1.Personalization.CanEnterSharedScope)  {
  // 사용자가 공유 범위로 들어오도록 하는 UI 요소를 표시합니다.
}

이 기사에 나와 있는 샘플의 WebPartManagerPanel 사용자 컨트롤에는 현재 사용자 및 페이지 기능을 기반으로 디스플레이를 동적으로 조정하는 완전한 패널 구현이 포함되어 있습니다.


웹 파트로서의 사용자 컨트롤

Windows SharePoint Services를 사용하여 웹 파트를 빌드하는 과정에서 혼란을 야기하는 사항 중 하나는, 디자이너 기능은 전혀 활용하지 못하는 상태로 컨트롤의 전체 사용자 인터페이스를 프로그래밍 방식으로 만들어야 한다는 점입니다. 웹 파트는 대부분 상호 작용하는 서버측 컨트롤 컬렉션이기 때문에 웹 파트를 만들 때 Visual Studio 디자이너 기능을 사용하지 못하는 것은 상당히 아쉬운 점입니다. 이 문제를 확실하게 해결하는 방법은 개발자가 ASP.NET 사용자 컨트롤을 만들어 웹 파트로 사용하도록 하는 것입니다. SmartPart라는 타사 도구를 사용하면 사용자 컨트롤을 Windows SharePoint Services의 웹 파트로 적용할 수 있습니다.

ASP.NET 2.0 웹 파트를 사용하면 모든 컨트롤을 수정하거나 래핑할 필요없이 직접 웹 파트로 사용할 수 있으므로 이 문제가 해결됩니다. 이 방법은 사용자 컨트롤을 웹 파트 컬렉션에 통합하는 데 유용할 뿐 아니라, 이를 통해 현재 ASP.NET 페이지용으로 빌드한 사용자 컨트롤을 손쉽게 통합할 수 있습니다.

이 방법은 표준 컨트롤(비웹 파트)이 WebPartZone에 추가되면 WebPartManager.CreateWebPart가 암시적으로 호출되고, GenericWebPart 클래스 인스턴스가 할당되며 추가된 컨트롤을 사용하여 해당 컨트롤을 초기화하는 방식으로 내부적으로 작동합니다. GenericWebPart 클래스는 WebPart 기본 클래스에서 파생되며 핵심 웹 파트 속성 구현을 제공합니다. GenericWebPart가 구성되면 초기화에 사용된 컨트롤이 자식 컨트롤로 추가됩니다. 렌더링을 수행하는 동안 GenericWebPart는 응답 버퍼 자체로는 아무것도 렌더링하지 않으며 대부분의 복합 컨트롤이 그러하듯이 자식 컨트롤에 렌더링을 위임합니다. 그러면 최종적으로 페이지의 WebPartZone에 원하는 컨트롤을 모두 추가할 수 있으며 페이지는 제대로 작동합니다. 예를 들어 다음 페이지에서는 사용자 컨트롤과 표준 Calendar 컨트롤이 있는 WebPartZone을 정의합니다. 사용자 컨트롤과 Calendar 컨트롤은 모두 만들어질 때 GenericWebPart 클래스에 의해 암시적으로 래핑됩니다.

<%@ Register Src="webparts/CustomerList.ascx" 
    TagName="CustomerList" TagPrefix="Wingtip" %>

<asp:WebPartManager ID=" WebPartManager1" runat="server" />

<asp:WebPartZone ID="WebPartZone1" runat="server" HeaderText="Zone 1">
  <ZoneTemplate>
    <Wingtip:CustomerList runat="server" id="CustomerList" />
    <asp:Calendar runat="server" id="CustomerCalendar" />
  </ZoneTemplate>
</asp:WebPartZone>

표준 웹 파트와 마찬가지로, GenericWebPart에 의해 래핑된 컨트롤을 동적으로 만들 수 있습니다. 이 컨트롤이 사용자 컨트롤인 경우에는 Page.LoadControl을 호출하여 사용자 컨트롤 인스턴스를 동적으로 로드하고 만들어야 하며, 그런 다음에는 컨트롤에 고유한 ID를 명시적으로 지정해야 합니다. 그리고 나서 WebPartManager 개체의 CreateWebPart 메서드를 호출하여 GenericWebPart 클래스 인스턴스를 만들어야 합니다. 이 인스턴스는 사용자 컨트롤 인스턴스 주위의 래퍼 역할을 합니다. 마지막으로 CreateWebPart를 호출하여 반환된 GenericWebPart 참조를 가져와 AddWebPart 호출로 전달하여 추가될 WebPartZone을 지정해야 합니다.

// 사용자 컨트롤 파일에서 웹 파트 인스턴스를 만듭니다.
Control uc = this.LoadControl(@"webparts\CompanyNews.ascx");
uc.ID = "wp2";
GenericWebPart wp2 = WebPartManager1.CreateWebPart(uc);
WebPartManager1.AddWebPart(wp2, WebPartZone1, 1);
그림 10. GenericWebPart
그림 10. GenericWebPart

이 기술을 사용할 때의 단점은 GenericWebPart 클래스가 컨트롤이 아닌 WebPart에서 상속되는 클래스이기 때문에 컨트롤의 웹 파트 관련 기능을 제어할 수 없다는 것뿐입니다. GenericWebPart에 의해 래핑된 컨트롤이 있는 페이지를 실행해 보면 이 단점을 확실하게 파악할 수 있습니다. 이러한 페이지의 기본 제목은 제목 없음이며 대부분이 웹 파트처럼 아이콘이나 연결된 설명이 없기 때문입니다. 그림 10은 GenericWebPart에 의해 래핑되었으며 기본 제목(제목 없음) 및 아이콘이 지정되어 있는 샘플 사용자 컨트롤을 보여줍니다.

이 문제를 해결할 수 있는 방법은 사용자 컨트롤의 Init 이벤트에 대한 처리기를 추가하는 것입니다. 컨트롤이 GenericWebPart에 의해 래핑된 경우(Parent 속성 유형을 쿼리하여 확인할 수 있음) GenericWebPart 클래스 특성을 다음과 같이 설정해야 합니다.

void Page_Init(object src, EventArgs e) {
  GenericWebPart gwp = Parent as GenericWebPart;
  if (gwp != null)  {
    gwp.Title = "내 사용자 지정 사용자 컨트롤";
    gwp.TitleIconImageUrl = @"~\img\ALLUSR.GIF";
    gwp.CatalogIconImageUrl = @"~\img\ALLUSR.GIF";
  }
}

사용자 컨트롤이 GenericWebPart에 의해 래핑되는 경우 해당 페이지를 다시 실행하면 GenericWebPart 상위 속성에 대해 수행된 변경이 컨트롤이 포함된 웹 파트 렌더링에 반영됩니다. 그림 11은 특성이 새롭게 지정된 사용자 컨트롤을 보여줍니다. 제목과 아이콘을 살펴보십시오.

그림 11. 제목 및 아이콘
그림 11. 제목 및 아이콘

또 다른 유용한 해결 방법은 사용자 컨트롤 클래스에서 직접 IWebPart 인터페이스를 구현하는 것입니다. GenericWebPart 클래스에서 세부 작업을 처리하기 때문에 사용자 컨트롤은 웹 파트 속성에 대해 직접 쿼리되지 않아 이 방법은 별로 도움이 되지 않는다고 생각될 수도 있습니다. 다행히도 GenericWebPart 클래스 디자이너들은 이러한 요구 사항을 예상하고 래핑된 컨트롤이 IWebPart 인터페이스를 구현하는 경우 자동으로 해당 컨트롤로 위임되도록 GenericWebPart 클래스의 속성을 구현했습니다.

따라서 사용자 컨트롤의 웹 파트 기능을 사용자 지정하려면 IWebPart 인터페이스를 구현하고 해당 인터페이스가 정의하는 7가지 속성을 채우면 됩니다. 그림 12의 코드에서는 GenericWebPart 속성을 동적으로 변경하여 이전에 수행했던 작업과 같은 결과를 얻을 수 있는 사용자 컨트롤에 대한 코드 숨김 클래스의 예제를 보여 줍니다.

사용자 컨트롤에 대해 대체 기본 클래스를 만들 수도 있습니다. 이 클래스는 UserControl에서 파생되고 IWebPart를 구현하며, 포털의 모든 사용자 컨트롤에서 이 클래스를 상속할 수 있습니다. 이 기사의 샘플 포털 솔루션에서는 이 작업을 수행합니다. 이 솔루션을 사용하면 사용자 컨트롤은 생성자에서 처리되는 속성을 초기화할 수 있으며 나머지는 자체적으로 처리됩니다. 그림 13은 IWebPart를 구현하는 사용자 컨트롤의 대체 기본 클래스와 해당 클래스를 사용하여 제목 및 아이콘 속성을 설정하는 사용자 컨트롤의 해당 코드 숨김 클래스를 보여줍니다.

이와 같이 사용자 컨트롤에 융통성이 높기 때문에 디자이너에서 사용자 컨트롤을 지원하고 WebPart 기능을 사용자 지정할 수 있는데 사용자 지정 컨트롤을 만들 필요가 있느냐는 의문이 생길 수도 있습니다. 실제로 여기에는 여러 가지 이유가 있습니다. 우선, 사용자 컨트롤에는 사용자 지정 verbs를 추가할 수 없습니다. verbs를 추가하려면 WebPart에서 직접 파생시켜 Verbs 속성을 다시 정의해야 합니다. 컨트롤에서 IWebEditable을 구현하는 방법도 고려해 볼 수 있습니다.

또 다른 이유는 사용자 컨트롤의 범위가 기본적으로 응용 프로그램 디렉터리 내라는 점입니다. .ascx 파일을 여러 프로젝트에 실제로 복사하지 않고는 여러 웹 응용 프로그램에서 사용자 컨트롤 구현을 공유할 수 없습니다. 반면 WebPart 클래스에서 파생되는 사용자 지정 웹 파트는 다시 사용 가능한 DLL로 컴파일하여 GAC(전역 어셈블리 캐시)에서 전역으로 배포할 수 있습니다. 또한 사용자 지정 웹 파트를 사용하면 컨트롤에 대해 사용자 지정 디자이너를 작성하여 Visual Studio 내에서 컨트롤의 기본 모양을 변경할 수 있으며, 도구 상자 위로 끌었을 때 웹 파트와 연결될 아이콘을 만들 수 있습니다. 그림 14는 사용자 지정 웹 파트 및 사용자 컨트롤 중에서 선택하는 데 도움이 되는 기능 비교을 보여 줍니다.


웹 파트 및 개인 설정 공급자

공급자는 ASP.NET 2.0의 새로운 기능으로, 이번 릴리스에서 완전한 기능을 갖춰 코드 작성 및 실행 작업이 거의 또는 전혀 필요하지 않은 다양한 컨트롤을 사용할 수 있도록 해줍니다. 공급자의 기본 개념은 특정 기능에 대해 일반적인 데이터 관련 작업 집합을 정의하고 해당 작업을 일반 ProviderBase 클래스에서 상속되는 추상 클래스 선언으로 묶는 것입니다. 이 기사에서는 개인 설정 기능에서 반드시 사용해야 하는 다음 데이터 관련 작업을 살펴봅니다.

  • 특정 페이지 및 사용자에 대한 웹 파트 속성 및 레이아웃 저장
  • 특정 페이지 및 사용자에 대한 웹 파트 속성 및 레이아웃 로드
  • 특정 페이지에 대한 일반 웹 파트 속성 및 레이아웃(일반 사용자 지정의 경우) 저장
  • 특정 페이지에 대한 일반 웹 파트 속성 및 레이아웃(일반 사용자 지정의 경우) 로드
  • 특정 페이지 및 사용자에 대한 웹 파트 속성 및 레이아웃을 기본값으로 다시 설정
  • 특정 페이지에 대한 웹 파트 속성 및 레이아웃(일반 사용자 지정의 경우)을 기본값으로 다시 설정

개인 설정 인프라의 일부이며 지속적으로 필요한 일부 다른 부가 기능도 있지만, 기본적으로는 위의 여섯 가지 기능으로 요약할 수 있습니다. 이러한 여섯 가지 작업을 수행할 수 있으며 데이터를 성공적으로 저장 및 복원할 수 있는 클래스가 있다면, 각 페이지의 WebPartManager는 해당 클래스를 사용하여 사이트가 실행되는 동안 모든 개인 설정 및 사용자 지정 데이터를 저장 및 복원할 수 있습니다. 이러한 메서드를 정의하는 추상 클래스는 PersonalizationProvider이며, 기본적으로 사용되는 이 클래스의 구체적 파생 클래스는 SqlPersonalizationProvider입니다. 앞서 확인한 여섯 가지 기능을 나타내는 세 가지 메서드는 그림 15에 나와 있습니다. 각 메서드는 들어오는 userName 매개 변수가 null인지 여부에 따라 사용자 개인 설정 또는 공유 사용자 지정을 수행할 수 있습니다.

그림 16. 상호 작용
그림 16. 상호 작용

모든 개인 설정 데이터는 단순 이진 데이터(byte[])로 저장되며, 기본 SqlPersonalizationProvider에서 데이터베이스의 이미지 필드에 기록됩니다. ASP.NET 2.0은 이러한 메서드를 제공하는 클래스가 있음을 인지하기 때문에 과거보다 훨씬 많은 논리를 기본 컨트롤 집합으로 빌드할 수 있습니다. 이 기사에서 웹 파트를 사용하는 각 페이지의 WebPartManager는 현재 PersonalizationProvider 클래스를 올바르게 호출하여 각 페이지의 개인 설정 관련 설정을 serialize 및 복원하는 작업을 담당합니다. 그림 16의 다이어그램에서는 EditorZone 컨트롤과 기본 SqlPersonalizationProvider 간의 상호 작용을 보여줍니다.

ASP.NET 2.0을 많이 사용할수록 이러한 공급자 아키텍처의 예제를 많이 확인할 수 있습니다. 구성원, 역할 관리, 사이트 맵 데이터, 상태 모니터링 등 여러 항목에 대한 공급자가 있으며, 이들은 모두 서로 상호 작용할 컨트롤에 대해 비슷한 핵심 메서드 집합을 정의합니다.


개인 설정 데이터 저장소 변경

ASP.NET 2.0에서 제공되는 대부분의 공급자와 마찬가지로, 기본 개인 설정 공급자는 SQL Server 백 엔드를 대상으로 하도록 구현됩니다. 구성 파일을 변경하지 않으면 기본 SqlPersonalizationProvider는 로컬 파일 기반 데이터베이스를 지원하는 SQL Server 2005 Express Edition 연결 문자열을 사용합니다. 이 연결 문자열은 다음과 같습니다.

data source=.\SQLEXPRESS; Integrated Security=SSPI; 
AttachDBFilename=|DataDirectory|aspnetdb.mdf; User Instance=true

SQL Server 2005 Express Edition 파일 기반 데이터베이스를 사용하는 이점은 사용자의 추가적인 설치 작업 없이도 즉시 만들 수 있다는 것입니다. 따라서 새 사이트를 만든 후 데이터베이스를 설치하지 않고 바로 개인 설정 기능을 사용할 수 있습니다. 사이트와 처음으로 상호 작용하면 사이트의 App_Data 디렉터리에 새 aspnetdb.mdf 파일이 만들어지며, 해당 파일은 모든 기본 공급자를 지원하는 데 필요한 테이블 및 저장 프로시저를 사용하여 초기화됩니다.

이는 확장하거나 다수의 동시 사용자를 지원할 필요가 없는 소규모 사이트에는 매우 효과적이지만, 엔터프라이즈 시스템의 경우에는 전체적으로 관리되는 전용 데이터베이스 서버에 데이터를 저장해야 합니다. 다행히도 SqlPersonalizationProvider에서 사용하는 데이터베이스를 변경하는 작업은 간단합니다. SqlPersonalizationProvider 구성은 연결 문자열을 LocalSqlServer로 초기화합니다. 즉, 구성 파일의 <connectionStrings> 섹션에서 이름이 LocalSqlServer인 항목을 찾아 관련된 연결 문자열을 사용하여 데이터베이스에 대한 연결을 엽니다. 기본적으로 이 문자열은 앞서 살펴보았던 연결 문자열, 즉 로컬 SQL Server 2005 Express Edition의 .mdf 파일에 기록되는 문자열입니다. 이 문자열을 변경하려면 먼저 LocalSqlServer 연결 문자열 컬렉션을 지운 다음 Web.congif 파일에 새 연결 문자열 값을 다시 지정합니다. 또는 컴퓨터 차원의 Machine.config 파일에서 이를 변경하여 해당 컴퓨터의 모든 사이트에 적용되도록 할 수도 있습니다. 다음은 공급자 데이터베이스가 로컬 SQL Server 2000 인스턴스를 가리키도록 변경하는 예제 Web.config 파일입니다.

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/
   V.2.0">
  <connectionStrings>
    <clear />
    <add name="LocalSqlServer" connectionString=
        "server=.;integrated security=sspi;database=aspnetdb"/>
  </connectionStrings>
  ...
</configuration>

이와 같은 변경 사항이 적용되도록 하려면 이름이 aspnetdb이며 SqlPersonalizationProvider에 필요한 테이블 및 저장 프로시저가 갖춰진 데이터베이스가 로컬 서버에 있어야 합니다. 이 데이터베이스를 만들려면 ASP.NET 2.0과 함께 제공되는 aspnet_regsql.exe라는 유틸리티를 사용합니다. 이 유틸리티를 기본 설정으로 실행하면 모든 공급자에게 필요한 테이블이 들어 있는 aspnetdb라는 데이터베이스가 로컬에 만들어집니다. 또는 기존 데이터베이스에 테이블 및 저장 프로시저를 설치할 수도 있습니다. 기존 테이블과 충돌하지 않도록 테이블 및 저장 프로시저 이름 앞에는 모두 "aspnet"이라는 접두사가 붙습니다.

ASP.NET 2.0의 모든 공급자와 마찬가지로, 이러한 간접 작업을 수행하면 포함된 페이지 또는 웹 파트를 수정하지 않아도 백 엔드 데이터 저장소를 완전하게 변경할 수 있는 매우 융통성 있는 아키텍처를 만들 수 있습니다.


고유한 개인 설정 공급자 만들기

개인 설정 공급자의 연결 문자열을 변경하는 기능을 사용하면 작업을 융통성 있게 수행할 수 있지만, SqlPersonalizationProvider는 System.Data.Sql.Client 네임스페이스를 사용하여 해당 데이터 검색을 수행합니다. 즉, 이 작업은 SqlServer 데이터베이스로 제한됩니다. 개인 설정을 다른 데이터베이스 또는 완전히 다른 데이터 저장소에 저장해야 하는 경우에는 다음 단계를 수행하여 직접 사용자 지정 개인 설정 공급자를 빌드해야 합니다. 다행히도 힘든 작업은 대부분 완료되었으므로 이를 간편하게 활용할 수 있습니다. 개인 설정 데이터를 다른 데이터 저장소에 기록하는 작업의 예로, 이 기사에 나오는 샘플 포털 사이트에서는 응용 프로그램의 App_Data 디렉터리에 있는 로컬 이진 파일에 모든 개인 설정 및 사용자 지정 데이터를 보관하는 FileBasedPersonalizationProvider라는 사용자 지정 개인 설정 공급자를 완전하게 구현합니다. 이진 파일 이름은 각 사용자 및 경로에 대해 고유하게 생성되며 일반 사용자 설정에 대해 고유한 경로마다 파일이 하나씩 있습니다.

사용자 지정 개인 설정 공급자를 빌드하려면 먼저 PersonalizationProvider 기본 클래스에서 상속을 받는 새 클래스를 만든 다음 기본 클래스에서 상속된 모든 추상 메서드를 다시 정의해야 합니다. 그림 17에 나와 있는 클래스 선언을 통해 이 작업을 수행하는 방법을 확인할 수 있습니다.

개인 설정 공급자가 작동하도록 하기 위해서는 두 가지 중요한 메서드, 즉 LoadPersonalizationBlobs 및 SavePersonalizationBlob만 구현하면 됩니다. 이 두 메서드는 이진 serialization 및 개인 설정 데이터를 나타내며, 개인 설정 인프라에 의해 호출되어 페이지 로드 시 데이터를 검색하고 웹 파트가 있는 페이지에서 데이터가 편집, 카탈로그 또는 디자인 보기에서 변경될 때 보통 특정 사용자를 대신하여 데이터를 다시 씁니다.

다운로드한 샘플 코드의 SavePersonalizationBlob 구현은 전달된 userName 및 경로를 기반으로 만들어진 고유한 이름의 파일에 dataBlob 매개 변수를 기록합니다. 마찬가지로 LoadPersonalizationBlobs 구현은 동일한 명명 스키마를 사용하여 파일을 검색해 사용자 데이터 blob 또는 공유 데이터 blob를 반환합니다. 이러한 두 메서드는 들어오는 userName 매개 변수가 null인 경우 기본적으로 공유 데이터를 저장 또는 로드하며, 그렇지 않은 경우에는 사용자 데이터를 저장 또는 로드합니다. 그림 18은 샘플 FileBasedPersonalizationProvider에서의 이 두 메서드 구현과 함께, 사용자 이름 및 경로 정보를 기반으로 고유한 파일 이름을 생성하기 위한 도우미 메서드 쌍을 보여줍니다.

공급자를 완전히 구현하고 나면 개인 설정 구성 섹션의 공급자 섹션을 사용하여 해당 공급자를 등록된 개인 설정 공급자로 추가할 수 있습니다. 실제로 공급자를 사용하려면 Web.config 파일에서 이를 개인 설정에 대한 기본 공급자로 지정해야 합니다. 다음은 사용자 지정 파일 기반 공급자를 응용 프로그램의 기본 공급자로 지정하는 예제입니다.

<webParts>
  <personalization defaultProvider="FileBasedPersonalizationProvider">
    <providers>
      <add name="FileBasedPersonalizationProvider"
           type="Wingtip.Providers.FileBasedPersonalizationProvider" />
    </providers>
  </personalization>
</webParts>

사이트를 다시 실행하면 모든 개인 설정 데이터가 로컬 이진 파일에 저장되어 있습니다. 이 기사의 샘플이 가장 확장이 용이한 솔루션이라고 할 수는 없지만, 이 샘플을 통해 원하는 백 엔드에서 사용자의 고유한 개인 설정 공급자를 구현하는 방법에 대해 파악할 수 있습니다. 그림 19에서는 전체 웹 파트 인프라에 연결된 새로운 공급자를 보여줍니다.

그림 19. FileBasedPersonalizationProvider 사용
그림 19. FileBasedPersonalizationProvider 사용

추가 정보

지금까지 ASP.NET 2.0 및 여기에 포함된 새로운 웹 파트 컨트롤 집합을 사용하여 사용자 지정 및 개인 설정을 지원하는 유용한 포털 응용 프로그램을 비교적 쉽게 만드는 방법을 알아보았습니다. 이 인프라의 가장 중요한 기능은 연결성일 것입니다. 공급자 인프라를 사용하면 특정 serialization 구현 및 데이터 저장소에 제한되는 대신 사용자 사이트에 적합한 백 엔드 데이터 저장소에 개인 설정 데이터를 비교적 쉽게 쓸 수 있습니다. 이제 ASP.NET 2.0 웹 파트를 사용하여 사용자 지정 가능한 사이트를 만들어 보십시오.

이 기사가 유용했다면 ASP.NET 2.0 포털 응용 프로그램에서 웹 파트를 사용한 빌드에 관한 더욱 자세한 정보를 살펴보실 수 있습니다. MSDN Magazine 웹 사이트에서 함께 제공하는 샘플을 꼭 다운로드하시기 바랍니다. ASP.NET 2.0 QuickStart 자습서 (영문)에는 작업에 사용할 수 있는 샘플이 다수 마련되어 있습니다. 또한 ASP.NET 2.0의 웹 파트 사용과 관련된 여러 가지 흥미로운 예제를 확인할 수 있는 Fredrik Normen의 블로그 (영문)도 방문해 보시기 바랍니다


|

No7Do's Blog is powered by Daum & tistory