지난번에는 jQuery Mobile의 필요성과 사용을 위한 준비 방법을 살펴보았다. 그리고 오늘은 jQuery Mobile을 이용하여 실제로 페이지를 만들 때 주의할 사항들과 대망의 첫 예제 Hello, World!를 만들어보려고 한다.

개발 환경의 선택

계속하기에 앞서 한 가지 언급하고 넘어가도록 하겠다. 웹 개발을 할 때 웹 서버와 함께 좋은 IDE를 반드시 하나 이상 활용하기 바란다. 파일 시스템에서 웹 페이지를 불러와 테스트하는 방법은 요즈음 웹 환경에서는 그다지 좋은 방법이 아니다. 만약 마땅히 테스트 베드로 삼을만한 웹 플랫폼이 없다면, 여러분이 선택할 수 있는 테스트 베드는 두 가지 종류가 있다. 하나는 Visual Web Developer 2010 Express를 사용하는 것이고, 또 다른 하나는 Microsoft WebMatrix를 이용하는 방법이다. 만약 여러분이 ASP.NET에 별로 친숙하지 않다면 ASP나 PHP 개발을 WebMatrix에서 쉽게 진행할 수 있으므로 일반적인 텍스트 에디터만 사용하기보다는 WebMatrix를 병행할 것을 권한다.

Visual Web Developer 2010 Express를 사용하면 서버 사이드 프로그래밍에 필요한 디버거와 웹 응용프로그램 서버를 기본으로 획득한 상태에서 프로젝트 단위로 고급 프로그래밍 기법을 시도해볼 수 있다. 만약 순수하게 자바스크립트를 테스트해볼 수 있는 테스트 베드가 필요하다면 WebMatrix를 사용해도 된다. 양쪽 모두 무료 도구이며 둘 다 설치해서 여러분의 기호에 맞는 도구를 먼저 테스트해볼 수도 있다. 양쪽 도구 모두 http://www.microsoft.com/web 에서 제공하는 Web Platform Installer를 이용하여 손쉽게 설치할 수 있다.

HTML5 제대로 쓰기

다시 본론으로 돌아와서, jQuery Mobile은 이전 시간에 마무리하면서 이야기하기를, HTML5의 사양이 필요하다고 하였다. 기본적으로 우리가 아는 HTML은 HTML4 혹은 XHTML 1.1의 사양이다. 그리고 이를 계승하는 것이 HTML5와 XHTML5가 된다. 버전 4를 계승하여 버전 5가 나온 것이므로 양쪽의 차이점은 사실 그다지 크지 않다. 하지만 jQuery Mobile이 기대는 부분 중에서 굉장히 중요한 부분이 하나 있는데 바로 Custom Attribute의 사용이다. HTML4나 XHTML1.1에서는 Custom Attribute를 사용하는데 제약이 따르게 된다. 그러나 HTML5와 XHTML5에서는 이러한 설정을 공식적으로 지원한다.

웹 브라우저의 입장에서는 HTML4와 HTML5를 구분할 수 있는 방법이 필요한데, 별다른 언급 없이 웹 페이지를 써내려가기 시작하면 브라우저의 선호도에 따라 페이지의 버전이 달리 선택되므로 웹 페이지가 브라우저의 종류나 버전에 따라 일관성없는 결과를 낼 가능성이 크다. 이를 바로잡기 위하여 DOCTYPE을 정확히 지정해야 하며, 그 중에서도 HTML5의 DOCTYPE을 정확히 지정해야 한다. HTML5의 DOCTYPE은 페이지의 제일 첫 줄에 아래와 같이 작성하는것만으로 끝난다.

<!doctype html>

HTML4나 XHTML1.1의 DOCTYPE을 기억하는 이들이라면 위의 DOCTYPE이 정말 전부인지 당황스럽게 느껴질 것이다. 실제로 그렇다. 위와 같이 서술하면 HTML5를 제대로 지원하는 브라우저에서는 HTML5 상태로 페이지를 해석하고 렌더링하게 될 것이고, 그렇지 않은 브라우저들은 HTML4를 기반으로 해석을 시작할 것이다.

그리고 주의할 점이 하나 더 있는데, DOCTYPE 앞에는 어떤 추가적인 요소도 등장해서는 안된다. 즉, DOCTYPE이 공백 문자들을 제외하고 웹 페이지안에서는 절대적으로 최우선이어야만 한다는 뜻이다. 이를 위반하면 페이지가 의도하지 않은 모습으로 표시될 가능성이 커진다.

Hello, World! in jQuery Mobile

드디어 모든 프로그래밍 과제의 첫 번째 예제인 Hello, World!를 jQuery Mobile 스타일로 만들어 볼 차례이다. 여러분의 웹 개발 IDE에서 새 프로젝트를 각자 만들고, 첫 index 페이지를 만들어 아래와 같이 코드를 작성한다.

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.css" media="all" />
    <script src="http://code.jquery.com/jquery-1.6.4.min.js" type="text/javascript"></script>
    <script src="http://code.jquery.com/mobile/1.0/jquery.mobile-1.0.min.js" type="text/javascript"></script>
    <title>오늘의 뉴스</title>
</head>
<body>
    <div data-role="page" id="home">
        <div data-role="header">
            <h1>페이지 제목</h1>
        </div>
        <div data-role="content">
            <p>Hello, World!</p>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque tempus vehicula libero a fringilla. Nunc volutpat adipiscing felis, non iaculis arcu consectetur vitae. Aliquam tincidunt ultricies dui sed laoreet. Integer ligula tellus, porttitor in ornare vel, eleifend a eros. Ut lacinia porttitor sagittis. Integer interdum metus ligula, in lacinia leo. Cras scelerisque porttitor sagittis. Praesent eget orci eu est sollicitudin faucibus. Duis euismod neque quis nunc malesuada nec tincidunt mi varius. Duis at feugiat odio.</p>...
        </div>
        <div data-role="footer">
            <h1>아무개가 만든 페이지</h1>
        </div>
    </div>
</body>
</html>

jQuery Mobile을 사용한 페이지이지만 어쩐지 자바스크립트 코드가 단 한줄도 보이지 않는다. 어떻게 된 것일까? 의문을 풀기 위하여 실제로 웹 서버에 올려 웹 페이지를 살펴보면 아래와 같이 재미있는 결과가 나오는 것을 볼 수 있다.

특별한 자바스크립트 코드나 CSS 클래스 설정을 하지 않고 단번에 모바일 웹 페이지의 UI가 완성된 모습이 보인다. 첫 시작치고 굉장히 많은 것을 가져다주고 있는 것이다. jQuery Mobile이 기본적으로 하는 일은 바로 이런 일이다. 여러 모바일 브라우저에서 이 페이지에 접근하면 모두 이와 같은 모습으로 페이지를 렌더링해주는 것은 물론, 모바일 브라우저의 해상도와 뷰 포트에 알맞게 와이드 스크린을 지원하는 모바일 장치에서는 지금 여러분이 보는 것과 비슷한 화면으로 웹 페이지가 나타날 것이고, 스마트폰 계열 스크린에서도 약간의 뷰포트 조정을 통해서 적당한 화면을 얻을 수도 있다.

참고로 위의 예제 코드에서 라틴어로 주절주절 써놓은 것은 데모용 웹 페이지에서 흔히 잘 쓰이는 Lorem Ipsum (이하 Lipsum) 텍스트이다. http://www.lipsum.com/ 에서 원하는 분량만큼 만들 수 있으며 여러분의 모바일 디자인을 테스트하기 위하여 양껏 만들어 위와 같이 사용하면 된다.

jQuery Mobile의 UI 구조

다음 시간에 좀 더 구체적으로 살펴보겠지만 jQuery Mobile의 UI 구조는 WML의 카드 레이아웃과 비슷한 점이 많다. 여러분이 어떻게 구현하는가에 따라서 달라질 가능성은 충분히 있지만 페이지를 한 번만 다운로드해서 필요한 모든 UI를 제공할 수 있도록 기능을 만들어주는 것이 jQuery Mobile의 UI 설계 방향이다. 페이지의 구조가 복잡하게 그려질 가능성이 없진 않으나, 정확한 이해와 활용을 전제로 한다면 곧 익숙해질 것이다.

여러분이 위의 스크린 샷에서 본 화면은 페이지의 화면이 아니라 제일 처음 등장하는, 페이지로서의 역할을 수행하도록 설정된 <DIV> 태그의 화면이다. 보통의 <DIV> 태그와 구분되는 점은, HTML5의 Custom Attribute를 이용하여 이 <DIV> 태그가 jQuery Mobile에 의하여 특별하게 취급될 수 있도록 되어야함을 지시할 수 있다는 것인데, 바로 그 Attribute가 data-role Attribute이다. jQuery Mobile 세계 안에서 가장 키포인트가 되는 Attribute가 바로 이 data-role Attribute이므로 잘 봐두길 바란다.

data-role이 page로 지정된 <DIV> 태그 안에는 Header, Content, Footer 순서로 <DIV> 태그가 배치되어야 한다. 시각적으로 일관성있고 이해하기 쉬운 모바일 레이아웃을 만들기 위하여 Header는 사용하는 것이 필요하고, Content야 두 말할 필요 없이 본문에 해당되는 내용이다. 그리고 Footer는 옵션이다. 세 가지 섹션 모두 <DIV> 태그로 구성되지만 당연히 data-role Attribute를 사용하여 각자의 역할을 jQuery Mobile에게 알려주어야 한다. 그러면 jQuery Mobile은 이 부분에 대한 처리를 수행하여 여러분이 보고 있는 화면과 같이 디자인을 마무리해주게 된다.

기존에는 <BODY> 태그 아래에 여러분이 필요한 내용을 직접 써내려가면 그만이었지만 jQuery Mobile 환경 아래에서 모바일 페이지를 프로그래밍하는 것은 이와 같이 약간의 규칙이 따른다. 다음 강좌에서는 지금 보여준 페이지 UI를 하나의 HTML 페이지 안에서 여러 개를 포함하고 전환할 수 있는 방법을 본격적으로 소개하도록 하겠다.

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

HTML 5는 계속 발전 중인 기술이며, 하루가 다르게 발전하고 있습니다. 그리고 이제 여기에 한층 더 성숙한 기술을 추가하는 모습이 보입니다. 바로, WebSocket이 그 주인공입니다. 이제까지 우리는 AJAX 기술을 통하여 정형화된 HTML 및 XML을 다루는 것에 익숙해져 있지만, WebSocket은 HTML 5를 더 이상 UI 전용 마크업 언어가 아닌 하나의 소프트웨어 개발 도구로 이해할 수 있도록 도와줍니다.

noVNC가 사용하는 WebSocket의 클라이언트 측 구현은 아직까지 DRAFT 단계에 있으며, 주요 웹 브라우저들은 아직 이 기술을 정확하게 지원하지 않습니다. 실제 소스 코드를 분석해보면 WebSocket의 기능을 대리로 구현하는 Rich Internet Application 모듈이 들어있고 Adobe Flash 기반인 것을 확인할 수 있습니다. 이 모듈은 Hiroshi Ichikawa (http://gimite.net/en/)에 의하여 작성된 프로토타입 버전의 모듈로 관심있으신 분들께서는 한 번 분석해보시는 것도 괜찮을 것입니다.

또한 서버의 경우, W3C의 DRAFT를 따라 기본적인 요구 사항을 구현하도록 WebSocket 전용 서버 코드를 작성하였고 noVNC는 이 서버를 경유하여 실제 VNC 서버와 상호 작용하는 것으로 되어있습니다. 즉, WebSocket은 일반 TCP/IP 소켓과는 달리, 별도의 중개 서버가 추가로 필요함을 의미합니다. noVNC에 포함된 소스 코드는 Python으로 구동되고, 성능을 내어야 할 필요가 있는 부분을 C 언어로 작성하였습니다.

아래의 42초 분량의 Demonstration 동영상은 noVNC의 동작 모습을 촬영한 것입니다.

noVNC는 현재 Google Chrome Browser에 최적화되어 있습니다만, 다른 HTML 5 지원 브라우저에서도 조만간 사용 가능해질 것으로 보입니다. noVNC는 github에 호스팅되어있고, 자세한 내용은 http://kanaka.github.com/noVNC 에서 확인 가능합니다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

작년에 Windows Internet Explorer 8이 나왔을 때에는, Internet Explorer도 다른 브라우저들과 마찬가지로 "조금씩 더 좋아지는 행보"를 이어나갔었습니다. 그럼에도 불구하고, 어떤 맥락에서는 Internet Explorer 6 이후로 별다를 것 없이, 아키텍처에 관한 향상만을 논하는 정도에 그쳤던 것도 사실입니다. 그러나 이번에 발표될 Internet Explorer 9은 "Game Changer"임에 틀림이 없습니다. :-)

Windows Internet Explorer 9 (이하 IE9)은 현재 표준안 작업 중에 있는 HTML 5의 최신 사양을 지원하며, CSS v3.0을 정확히 처리하고, JavaScript의 성능 향상을 위하여 별도로 제작된 고성능 엔진인 Chakra Engine을 도입하였으며, 모든 렌더링이 이전의 GDI 기반이 아닌, DirectX 기반의 렌더링으로 대체된 것이 특징입니다. 이에 따라, HTML 5에서 가장 많이 주목받는 부분인 2.5D 그래픽이나 3D 그래픽의 구현이 Silverlight나 Adobe Flash, Unity 3D와 같은 써드 파티 기술에의 의존도를 최소화하고 단독으로도 구현하는 것을 고려해볼 수 있게 된 것입니다.

IE9은 지금까지 Platform Preview로 총 4번 공개되었으며, 이번에는 실제로 여러분의 데스크톱 컴퓨터의 Major Browser를 IE9으로 변경할 수 있도록 완전히 완성된 Beta 버전이 발표되었습니다. Beta 버전을 다운로드하려면, http://www.ie9html5.com/ 에 접속하여 다운로드하시면 됩니다. IE9부터는 Windows XP, Windows Server 2003을 더 이상 지원하지 않으며, 따라서 이들 운영 체제에서 택할 수 있는 최신 브라우저는 IE8으로 한정됨을 유의하셔야 하겠습니다.

다운로드 바로가기: http://msdn.microsoft.com/ko-kr/ie/aa740473.aspx

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

ASP.NET AJAX와 더불어서 ASP.NET MVC를 비롯하여 거의 모든 웹 사이트와 웹 개발 프레임워크들이 채택하는 jQuery에 대한 세미나가 오는 2010년 7월 10일에 열립니다. 이번 세미나에서는 jQuery에 대한 고급 기법을 다루고, jQuery를 어떤 방법으로 확장할 수 있는지에 대한 다양한 테크닉을 "실전! jQuery CookBook"의 역자 분들께서 꼼꼼히 짚어주실 것입니다. 많은 참여 부탁드립니다. :-)

주의 사항: 세미나 참석 등록을 아래의 주소에서 제공하는 댓글 달기 기능을 이용하여 등록해 주십시오. 아래는 세미나 소개 글을 발췌해 온 것입니다.

세미나 등록하러 가기: http://taeyo.net/Forum/Content.aspx?TBL=NOTICE&SEQ=383&PGN=1

7월 10일 기다리던 jQuery 세미나가 시작됩니다.
실전! jQuery CookBook의 역자들이 모두 모여서 jQuery 고급기법에 관한 세미나를 진행합니다.
경품으로 신간 "실전! jQuery CookBook"도 드리니 많이 참석하셔서 즐겨주세요.

이번 세미나는 닷넷 개발자이던, 자바 개발자이던 무관하게 누구나 참석이 가능합니다.
현장등록도 가능하지만, 사전 준비를 위해서 반드시 리플로 참석 등록을 해주시기 바랍니다.
미리 참석등록을 한 분에 한해서 경품 추첨에 참여하실 수 있습니다.
(난 좀 샤이한 사람이다 하시는 분은 등록없이 그냥 오셔도 됩니다만, 그 경우 경품추첨에서 배제됩니다)

장소 : 한국 마이크로소프트 세미나실(선릉 포스코빌딩 서관 5층)
일시 : 2010년 7월 10일 토요일 오후 1시 (접수는 1시, 시작은 2시)


등록방법 : http://taeyo.net/Forum/Content.aspx?TBL=NOTICE&SEQ=383&PGN=1 에 리플로 참석여부와 이름, 개발분야를 남겨주시면 됩니다.

세션1 : jQuery의 Event 다루기

  • 시간 : 2:00 - 3:00
  • 발표자 : 김경균
  • 내용 :
    jQuery가 지원하는 이벤트에 대한 효과적인 사용방법과 고급 이벤트 기법에 대해서 다룹니다.
    이미 jQuery가 제공하고 있는 이벤트를 사용하는 방법 뿐만 아니라,
    자체적인 이벤트를 작성 및 사용하는 방법 및 이벤트 통지를 받는 방법에 대해서까지 심도 있게 이야기합니다.

세션2 : jQuery와 QUnit을 이용한 단위 테스트

  • 시간 : 3:15 - 4:15
  • 발표자 : 최지훈
  • 내용 :
    jQuery로 작성한 코드에 대해 단위 테스트하는 방법을 소개합니다.
    Qunit 프레임워크를 사용하여 결과를 어설션하고, 동기/비동기 콜백을 테스트하는 방법을 설명합니다.
    또한, 다양한 테스트를 그룹으로 묶어서 처리하는 방법에 대해서도 다룹니다.

세션3 : jQuery 확장 플러그인 만들기

  • 시간 : 4:30 - 5:30
  • 발표자 : 김태영
  • 내용 : jQuery를 확장하기 위한 방법들을 설명하고 그를 기반으로 플러그인을 제작해 봅니다.
    기본적인 플러그인 개발 규칙에 대해 다룬 후, 좀 더 완성된 형태의 플러그인 제작을 위해 필요한
    Option Hash 기법 및 $.extend()을 이용한 매개변수 초기화 방법 그리고 클로저 기법을 설명합니다.
    그리고, 그들을 모두 혼합하여 보편적인 형태의 플러그인을 직접 제작하고 활용하는 방법에 대해 이야기합니다.

경품 : BJ퍼블릭 협찬 - 실전! jQuery CookBook 5권
- 원하시면 역자들이 사인을 해드립니다.

* 세션 주제는 좀 더 나은 세미나를 위해 통지없이 변경될 수 있습니다.

tweet : @taeyo

세미나 등록하러 가기: http://taeyo.net/Forum/Content.aspx?TBL=NOTICE&SEQ=383&PGN=1

저작자 표시 비영리 동일 조건 변경 허락
이 장소를 Daum지도에서 확인해보세요.
서울특별시 강남구 대치4동 | 포스코센터
도움말 Daum 지도
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)
지난번에 올렸던 Internet Explorer 9에 대한 인터뷰 기사에 이어서, 실질적인 IE 9.0의 모습을 살펴볼 수 있는 동영상도 같이 올려봅니다. 이 동영상은 IE 9 개발 팀이 진행하는 인터뷰이며, 전체적으로 Windows Live Mail과 GMail과 같이 자바스크립트 엔진을 극적으로 활용하는 웹 어플리케이션에서의 성능 향상이 얼마나 이루어지고 있는지를 보여줍니다.

IE 9부터는 인터넷 환경에 최적화된 자바스크립트 엔진을 직접 고안하고 개발하여 자바스크립트 기반의 웹 사이트에서 문제가 되는 속도 문제를 획기적으로 개선하고자 하는 것이 주된 취지입니다. 이 부분 만으로도, Internet Explorer로 보다 쾌적한 웹 검색 경험을 얻을 수 있을 것입니다. 그리고, 더 나아가서는 Direct 2D 엔진을 통하여 Windows Vista나 Windows 7에서 지원하는 Aero 엔진과 함께 고해상도 기반의 웹 브라우징도 경험이 가능할 것으로 보입니다.

아래 동영상을 감상하기 위해서는 Silverlight 플러그인이 필요합니다. 아래 동영상이 보이지 않을 경우, Silverlight 플러그인을 http://www.microsoft.com/silverlight 에서 설치하시거나, 브라우저 보안 설정을 확인하여 Silverlight 플러그인이 동작할 수 있도록 설정하여 주십시오. (원본 페이지: http://channel9.msdn.com/posts/Charles/IE-9-First-look-at-the-new-JS-Engine/)


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

Stackoverflow.com
Stackoverflow.com은 우리에게 "조엘 온 소프트웨어"로 잘 알려져있는 "조엘 스폴스키"와 "코딩 호러"로 잘 알려져있는 "제프 앳우드"가 함께 만든 웹 사이트로, Experts-Exchange 웹 사이트에 대한 Alternative Website로 많은 인기를 얻고 있습니다. 구글 검색 결과를 자주 접하시는 분들은 모두 동감하시겠지만, Experts-Exchange 웹 사이트의 검색 결과는 항상 "비용 지불"을 요구합니다.

 

Stackoverflow.com에는 실로 유용한 질문과 답변들이 가득한데, 정말 어려운 문제에 봉착했을 때 시원한 답변을 얻을 수 있는 경우가 많습니다. 이번에 제가 맡았던 씨티은행 외국환업무시스템의 닷넷 기반 프로젝트에서도 많은 도움을 얻을 수 있었습니다.

 

Stackoverflow.com은 2010년 2월 현재 약 13만 5천여명의 회원과 함께 약 51만 5천개의 Q&A 목록을 보유하고 있으며, C#, 자바, 닷넷, ASP.NET, PHP, 자바스크립트, C++, jQuery, 파이썬 및 아이폰에 대한 내용을 토론하는 스레드들로 채워져있으며 지금 이 시간에도 다양한 질문과 답변이 오고 가고 있습니다. Windows Azure에 대한 내용도 자주 회자되곤 합니다. (위키피디아 설명 인용 - http://en.wikipedia.com/wiki/Stackoverflow)

 

구글 검색 결과를 살펴보실 때, 사이트 주소에 Stackoverflow.com에서 검색한 결과가 있다면 놓치지 말고 꼭 살펴보시기를 권합니다. :-)

 

http://www.stackoverflow.com/

 

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

Visual Studio 2010 베타 2가 이 글을 쓰는 현 시점에 Express Edition과 함께 새롭게 공개되었습니다. .NET Framework 4.0과 더불어서 C# 4.0, Visual Basic .NET 10.0 등 언어들의 기능도 새롭게 향상되었으며, 특히 이목을 끄는 것은 Dynamic Language Runtime과 연동되는 Dynamic Programming에 관한 것입니다.

 

Dynamic Programming에 대해서, 철수네 소프트웨어 세상 블로그 (http://blogs.msdn.com/bkchung/)에 소개된 내용을 오래 전에 처음 포스팅을 했었지만 최근까지도 dynamic 키워드의 실용적인 사례를 찾지 못하고 있었습니다만, 최근 dynamic 키워드의 새로운 활용 가능성을 새롭게 발견하였습니다. 여러 시나리오가 있을 수 있겠지만 제가 오늘 이 포스트를 통해서 조명해보고자 하는 것은 Windows Forms가 제공하는 Web Browser와의 연동에 관한 것입니다.

 

Windows Forms가 버전 2.0에 들어서면서부터 매우 실용적인 컴포넌트를 새롭게 추가하였는데 바로 웹 브라우저 컨트롤이 그것이었습니다. 웹 브라우저 컨트롤은 단순히 브라우저로서도 활용할 수 있지만 잘 활용한다면 사용자 인터페이스를 웹 기반으로 업그레이드하는 것 또한 가능합니다.

 

하지만 COM Interop 프로그래밍에 기댈 수 밖에 없는 부분은 여전히 많았고, 당시의 C# 언어 사양만으로 COM Interop을 다루는데에는 비효율적이고 생산성이 떨어지는 부분이 많았습니다. 그런 이유로, 예전의 브라우저 컨트롤보다는 "조금 뛰어난" 수준으로 인지되는데에 그쳤습니다. 하지만 이번에 새로 소개되는 Dynamic Programming과 결합하면 매우 매력적인 프레임워크로 다시 거듭나게 됩니다.

 

Dynamic Programming을 시험해볼 좋은 자바스크립트 예제를 찾던 중, http://www.javascriptfreecode.com/34.htm 의 소스 코드를 발췌하여 Dynamic Programming 버전으로 만들어보았습니다.

 

본디 이 스크립트가 하는 일은 Internet Explorer가 고유하게 제공하는 웨이브 필터를 활용해서 텍스트를 화려하게 보일 수 있도록 치장하는 것입니다. 그러나 이 기능을, 여러 브라우저가 보는 페이지로서가 아닌, 온전히 Windows Forms 응용프로그램만을 위한 고유한 기능으로 바꾸어보도록 하겠습니다.

 

  1. 폼에 웹 브라우저 컨트롤을 새로 추가합니다.
  2. 웹 브라우저 컨트롤이 처음 보일 페이지를 about:blank 로 설정합니다. 빈 문서를 준비시키도록 하는데에 도움이 됩니다.
  3. 기본 이벤트인 DocumentCompleted 이벤트 핸들러를 새로 추가합니다.
  4. 아래의 코드를 작성합니다.

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    dynamic document = this.webBrowser.Document.DomDocument;
    dynamic window = this.webBrowser.Document.Window.DomWindow;

    document.write(String.Format(@"
<!-- Original Source: http://www.javascriptfreecode.com/34.htm -->
<div id=""Zittertext"" style=""font-weight: bold; font-size: 25pt; filter: Wave(freq=5, light=0, phase=8, strength=1); width: 100%; color: orange;"">
<div style=""background-color: #FFFF00; text-align: center; color: black; display: inline;"">
{0}
</div>
</div>
", window.prompt("Please type a message to display: ", "Hello World!")));

    Action DynWave = () =>
    {
        dynamic filter = document.getElementById("Zittertext").filters[0];
        if (filter.freq > 130)
            filter.freq = 15;
        filter.freq++;
        if (filter.phase > 50)
            filter.phase = 1;
        filter.phase++;
        if (filter.strength > 1)
            filter.strength = .1;
        filter.strength++;
    };

    Timer timer = new Timer();
    timer.Tick += (a, b) => DynWave();
    timer.Interval = 50;
    timer.Enabled = true;
}

 

위의 코드에서 우리가 관심있게 봐두어야 할 부분은 dynamic으로 선언한 변수 뒤에 나타나는 표현식들입니다. 컴파일러 기반의 언어들은 늘 그렇듯 문법의 정확성을 언제나 따지게 됩니다. C#도 분명히 그런 언어였습니다. 하지만 Dynamic Programming을 통하여 위와 같이 컴파일 시점에는 존재하지 않는 내용을 런타임 때에 유추해낼 수 있게 되었습니다.

 

여기서 의문점이 드는 것이 있는데, 그렇다면 이를 유추해내기 위해서 어떤 식으로 구현을 제공하는가에 대한 부분입니다. 이 부분에 대한 답은 바로 .NET Framework가 런타임 과정에서 정확한 객체 정보를 확인하기 위해서 사용하는 ObjectBinder에 있습니다. regasm 유틸리티로 등록해두었던 COM Interop Assembly나 Primary Interop Assembly에 대한 내용을 런타임 차원에서 관리하고, 이를 자동으로 연결하고 있는 것입니다. 직접 프로젝트에서 참조를 하지 않았다고 할지라도 그러합니다.

 

그리고 이러한 기능 위에 DLR과 더불어서 이미 LINQ에서 소개된 적이 있는 Expression Tree 해석 엔진에 의하여 C# 기준으로 작성된 코드를 Object Binder가 가지고 있는 정보와 일치시켜 정확한 기능을 하는 실제 코드를 컴파일 과정에서 작성하게 되는 것입니다. 이것은 형식 정보를 읽어서 매번 같은 컬렉션을 여러번 반복하면서 조회하는 Reflection 기반의 프로그래밍보다 훨씬 빠르게 동작하고, 훨씬 정확도가 높습니다.

 

위의 코드를 실행한 결과는 아래와 같습니다. 중간에 어떤 메시지를 표시할 것인지를 묻는 브라우저의 프롬프트 창에 원하는 메시지를 넣어보는 것도 괜찮을 것입니다.

 

 

Dynamic Programming에 대한 자세한 내용은 http://msdn.microsoft.com/en-us/library/dd264736(VS.100).aspx 의 내용을 참고하시면 도움이 될 것입니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

근래에 들어서 ASP.NET AJAX도 나왔고 본격적으로 Visual Studio 2008이나 Visual Web Developer 2008을 통해서 Java Script 인텔리센스도 사용할 수 있게 되면서 참 좋아졌습니다. 하지만 JavaScript에서도 OOP가 가능하다는 사실을 모르는 분들도 많고 알고 난 뒤의 당황스러움 또한 말로 표현하기 어려우실 겁니다. :-)

JavaScript의 OOP는 기존의 OOP 프로그래밍 언어에서 최소한의 내용만을 가져왔고 복합적인 형태를 띕니다. 아래의 연속된 박스들을 보면서 어떻게 OOP가 완성되는지 살펴보도록 하겠습니다.

function myClass()
{
    // 보통은 이곳에 함수의 내용을 프로그래밍하는 것으로 알고 있고 그렇게 합니다.
}
function myClass()
{
    // 그러나, this라는 키워드가 있습니다. 그리고 this라는 키워드에 임의의 변수를 새로 정의하는 것이 가능합니다.
    this.something = 'Hello World!';
}
function myClass()
{
    // 한걸음 더 나아가서, something의 내용을 브라우저의 메시지 박스로 띄워주는 함수도 만들어볼까요?
    this.something = 'Hello World!';
    this.showSomething = function() {
        alert(this.something);
    }
}
var test = new myClass();
test.showSomething();

위의 연속된 박스들을 보면서 몇 가지 특징을 한꺼번에 설명해보겠습니다.

우선 myClass라는 함수이자 클래스는 보통의 함수로 사용되면 의미가 없습니다. 반드시 new 연산자에 의해 생성될 필요가 있습니다. 이 때, myClass 안에 들어있는 선언부 외의 모든 일반적인 코드들은 myClass의 생성자와 같은 일을 합니다.

그리고 따로 선언한 적이 없는 변수나 함수가 this 키워드에 이름을 지정하는 것 만으로 생성이 되는 것을 알 수 있는데, 이렇게 생성된 변수나 함수 모두 액세스 한정자가 public인 멤버로 볼 수 있습니다. 만약 로컬 변수를 사용하고 싶어서 var 키워드를 써서 변수를 정의했다면 로컬 변수로도 취급됩니다. var 키워드의 경우 브라우저의 해석 방법에 따라서는 private 액세스 한정자 멤버로 취급될 수 있는것도 같습니다만 정확한 것은 아닙니다.

이와 같이 JavaScript OOP를 이용하여 새로운 형식을 만든다는 것은 어려울 것이 없는 단순명료한 작업입니다. 여기에 기존의 브라우저들이 제공해왔던 다양한 형태의 API와 XMLHttpRequest와 같은 서비스를 결합시킨다면 유용할 것입니다. ASP.NET AJAX를 비롯하여 여러 JavaScript 고급 서비스들은 JSON (Java Script Object Notation)을 통하여 직렬화와 역직렬화 서비스를 구현하고 있으며 이를 통하여 클래스에 영속성을 부여하기도 합니다.

JavaScript OOP를 성공적으로 활용하는 사례는 도처에 널려있습니다. ASP.NET AJAX의 XML 웹 서비스 연동 기능, 자바스크립트 객체 영속성을 위한 JSON, 자바스크립트 코드 검증 및 분석 도구인 JSLINT 등이 있습니다.

ASP.NET AJAX를 통하여 새로운 기능을 배우는 것도 좋지만 JavaScript의 OOP 능력도 시험해보고 좀 더 낳은 코드를 제작할 수 있도록 아이디어를 찾아보는 시도 또한 중요할듯 싶습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

개인적인 호기심에 Java Script 기반의 암호화 알고리즘 구현이 있을까 검색해보게 되었다. 혹시가 역시였는데 매우 다양한 버전의 Java Script 기반의 암호화 알고리즘을 찾을 수 있었다. 클라이언트에서 데이터를 암호화한 후 이것을 서버로 전송하고 이것을 서버에서 같은 비밀 키를 사용하여 해독한다는 개념은 이제는 너무 일반적인 것이라 굳이 언급하지 않아도 될 정도다. 하지만 놀랍게도 이런 구현 절차를 ActiveX에 너무 많이 기대고 있다는 것 또한 사실이다.

ActiveX 없이 다중 브라우저를 지원하면서도 일정 수준 이상의 보안을 충족하는 암호화 시스템을 어쩌면 간단히 구현해볼 수도 있지 않을까라는 호기심이 생겨서 몇 번 코드를 끄적여보았을 뿐인데 개인적으로나 일반적인 커뮤니티에 적용하기에는 딱 좋은 수준의 암호화 시스템이 나와서 글을 써본다. Security Critical한 서비스에서는 HTTPS, SSL, IP/sec 등을 사용하는 것이 100배 안전하지만 이것은 어디까지나 일상적인 암호화만을 다루는 것이다.

기본적인 원리는 간단하다. 같은 Java Script Source Code를 가지고 하나는 Internet Browser용 Java Script Code로 사용하고 또 하나는 JScript .NET 컴파일러용으로 패키징하여 ASP.NET에 통합하는 것이다. 이 글에서는 AES (Advanced Encryption Standard) 알고리즘을 채택하였다.

Java Script AES Implementation: http://www.movable-type.co.uk/scripts/aes.html

위의 사이트에서 핵심적인 AES 구현을 먼저 가져왔다. AES 알고리즘과 비밀 키를 통하여 평문을 암호문으로, 암호문을 평문으로 바꾸는 것이 정확하게 작동한다는 것을 테스트하였다. 하지만 암호문을 평문으로 바꾸는 과정에 있어서 암호문이 바이트의 배열로 출력된다는 점이 걸린다. 인코딩에 따라서는 완전히 다른 내용으로 읽혀져 손상될 가능성이 있기 때문이다. 그래서 BASE64 알고리즘을 다시 찾게 되었다.

Java Script BASE64 Implementation: http://rumkin.com/tools/compression/base64.php

AES 암호문을 BASE64로 보호하고, BASE64 디코딩으로 얻어낸 AES 암호문을 평문으로 바꾸는 것 또한 정확히 동작함을 확인하였다. 그리고 이번엔 정말 실용성이 있는지 확인해보고 싶어서 2바이트 문자열을 가지고 암호화 복호화를 시험해보았다. 하지만 이번엔 정확히 복원해내지 못한다는 것을 확인할 수 있었다. 다행히 2바이트 문자열에 대해서는 자바스크립트 내장 함수인 encodeURI와 decodeURI를 통하여 처리할 수 있었다. 평문에 관한 문제는 해결이 되었지만 비밀 키의 경우에는 이 방법도 의미가 없었다. 비밀 키는 1바이트 문자열 수준에서 해결해야 하는듯 보였다.

이러쿵 저러쿵하여 만든 JavaScript 코드와 바이너리를 ZIP 파일로 묶어서 올려본다. 여러 메서드가 있지만 이 글의 내용을 반영하여 만든 실질적인 메서드는 다음과 같다.

// JavaScript
AesEncrypt128(plainText, password);
AesEncrypt192(plainText, password);
AesEncrypt256(plainText, password):
AesDecrypt128(cipherText, password);
AesDecrypt192(cipherText, password);
AesDecrypt256(cipherText, password):

// C# (Need JScript.NET Runtime Assembly)
SecurityManaged.ComplexAes aesModule = new SecurityManaged.ComplexAes();
aesModule.AesEncrypt128(plainText, password);
aesModule.AesEncrypt192(plainText, password);
aesModule.AesEncrypt256(plainText, password);
aesModule.AesDecrypt128(cipherText, password);
aesModule.AesDecrypt192(cipherText, password);
aesModule.AesDecrypt256(cipherText, password);

클라이언트 측에서는 AesEncrypt로 보호할 내용을 암호화한 후 서버에 전송하고, ASP.NET - 또는 - 이를 받아들일 소켓 서버 등에서는 SecurityManaged.dll 파일을 레퍼런스로 참조하고 SecurityManaged.ComplexAes 클래스의 인스턴스를 만들어 위의 AesDecrypt로 내용을 복구하면 되겠다. 참고로 128/192/256은 키의 길이에 해당된다.

첨부된 파일 안의 .Managed.js 파일은 JScript.NET 문법에 맞게 재배치한 것으로 DLL로 컴파일하는 것을 가능하게 해준다. 안의 내용이나 코드 문법은 오리지널 Java Script과 전혀 차이가 없지만 닷넷 어셈블리로 만들기 위해서 package 구문과 class 구문을 추가하였을 뿐이다. 또한, 가능성만을 타진해보기 위함이었으므로 JScript.NET에서만 가능한 명시적인 형식 지정 또한 누락되어있다. 만약 좀 더 최적화를 원한다면 코드를 수정해서 사용할 것을 권하며 필요한 경우 어트리뷰트 지정을 통하여 지연된 서명을 추가해볼수도 있겠다.

닷넷 프레임워크 2.0을 설치하였다면 명령 프롬프트에서 다음과 같이 입력하면 원하는 어셈블리를 직접 얻을 수 있다. (이 작업을 위해서 Visual Studio 2005나 2008은 필요하지 않다.)

%windir%\microsoft.net\framework\v2.0.50727\jsc.exe /target:library AesImpl.managed.js

이제 우리들만의 일상적이고도 간단한 AES 암호화 알고리즘 시스템을 얻을 수 있게 되었다. 그 다음 활용 방안은 다시 고민해봐야 하겠다. 자바스크립트 기반에 닷넷까지 지원되니 ASP.NET AJAX와 Silverlight에도 잘 어울릴듯 하다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)

오늘은 자투리 시간을 이용하여 Visual Web Developer 2008을 설치해서 가장 써보고 싶었던 기능인 JavaScript 편집 기능을 활용해 보았다. 평소에 JavaScript 에디터 중에 무료로 사용할 수 있으면서도 완벽한 기능을 보여주는 에디터가 없는게 큰 불만이었던터라 무척 반가웠다.

Visual Web Developer 2008의 자바스크립트 기능이 특별한 이유는 바로 JavaScript OOP를 지원하기 때문이며 부수적으로 HTML DOM을 완벽하게 해석하기 때문에 정확한 코딩을 할 수 있어서 좋다. 만약 JavaScript를 분석할 일이 있지만 까탈스러운 문법때문에 고민중이라면 당장이라도 Visual Web Developer 2008만은 다운로드받아서 활용해보길 바란다. 덤으로 테스트용 웹 서버까지 따라오므로 IIS도 필요없다.

본업인 닷넷 프레임워크 기반 개발 환경에 대해서도 당연히 관심이 있기에 ASP.NET AJAX가 2005때보다 얼마나 더 개발하기 편리해졌는지, 그리고 WCF (Windows Communication Foundation) 프레임워크 기반의 서비스 개발의 능력도 체크해 볼 생각이다.

Visual Web Developer 2008은 이 글을 쓰는 현 시점에서 아직까지 영문판 전용이지만 곧 한글판도 나올 것으로 보인다. http://msdn.microsoft.com/express 에서 받을 수 있다.

아래는 기념으로 만든 예제 코드이다. 요즈음은 어떤 환경이던간에 Hello World를 못할리가 없으므로 나는 예제 코드로 좌항과 우항을 더해서 결과값을 반환하는 사칙 연산 로직을 앞으로의 새로운 프로그래밍 언어에 대한 시험 코드로 써볼 생각이다.

[CODE]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <script type="text/javascript">
    function exception(content) {
        this.message = content.toString();
       
        this.alert = function() {
            alert(this.message);
        }
       
        this.toString = function() {
            return this.message;
        }
    }

    function calc(leftVal, rightVal) {
        this.left = parseInt(leftVal.toString(), 10);
        this.right = parseInt(rightVal.toString(), 10);
       
        if (isNaN(this.left)) {
            throw new exception('left is NaN!');
        }
       
        if (isNaN(this.right)) {
            throw new exception('right is NaN!');
        }
       
        this.add = function() {
            return this.left + this.right;
        }
       
        this.sub = function() {
            return this.left - this.right;
        }
       
        this.multi = function() {
            return this.left * this.right;
        }
       
        this.div = function() {
            if (this.right == 0) {
                throw new exception('div/0!');
            }
            return this.left / this.right;
        }
       
        this.mod = function() {
            return this.left % this.right;
        }
       
        this.pow = function() {
            return Math.pow(this.left, this.right);
        }
    }
    </script>
</head>
<body>
    <div id="Test"></div>
    <script type="text/javascript">
    var test = new calc(3, 4);
    alert(test.add());
    alert(test.sub());
    alert(test.multi());
    alert(test.div());
    alert(test.mod());
    alert(test.pow());
    </script>
</body>
</html>


[/CODE]
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Windows Azure MVP 남정현 (rkttu.com)