'Ajax'에 해당되는 글 24건

  1. 2011/03/29 CORS(Cross-Origin Resource Sharing)을 활용한 크로스도메인 Ajax (4)
  2. 2009/12/08 JavaScript Common Mistakes (1) - Async! Async! Async! (10)
  3. 2008/10/24 전문가다운 Ajax 애플리케이션 개발, Part 3: DWR, 자바, Dojo 툴킷을 사용하여 자바와 자바스크립트 통합하기
  4. 2008/10/08 Dojo Toolkit 1.2 버전 릴리즈 (1)
  5. 2008/10/05 Ajax로 사이트 전면 개편, Part 4: 기존 사이트를 jQuery와 Ajax forms를 사용하여 개선하기
  6. 2008/09/23 Ajax로 사이트 전면 개편, Part 3: jQuery, Ajax 탭, 회전식 슬라이드쇼로 기존 사이트 개선하기 (2)
  7. 2008/08/20 dojo by example(7) - object system
  8. 2008/08/10 dojo by example(6) - 이벤트 시스템 (2)
  9. 2008/08/06 전문가다운 Ajax 응용 프로그램 개발, Part 1: Prototype 자바스크립트 라이브러리와 script.aculo.us 사용하기
  10. 2008/08/02 dojo by example(5) - 애니메이션/효과
  11. 2008/07/30 Ajax 성능 도구
  12. 2008/07/29 dojo by example(4) - 유틸리티 함수
  13. 2008/07/24 dojo by example(3) - 유틸리티 함수 (2)
  14. 2008/07/19 dojo by example(2) - 유틸리티 함수 (2)
  15. 2008/07/13 dojo by example(1) - 유틸리티 함수
  16. 2008/07/08 파이어버그를 이용한 신속한 웹 애플리케이션 디버깅과 튜닝
  17. 2008/06/18 Ajax 오버홀, Part 2: jQuery, Ajax, 툴팁, 라이트박스로 기존 사이트 개선하기
  18. 2008/06/05 Firebug와 YSlow!를 이용한 Ajax 성능 분석
  19. 2008/04/12 Ajax 오버홀, Part 1: Ajax와 jQuery로 기존 사이트 개선하기
  20. 2008/04/12 Ajax와 XML: Ajax로 table 다루기 (1)
  21. 2007/10/15 2007 Ajaxian.com Reader Survey 결과
  22. 2007/09/22 RIA 전성 시대? AJAX 독주 체제! (2)
  23. 2007/09/17 dojo 1.0을 위한 grid 위젯은 TurboGrid
  24. 2006/11/07 AJAX이전에 AJAX가 있었으니...
hacking/web2011/03/29 23:18
크리에이티브 커먼즈 라이선스
Creative Commons License
지난 포스트에서는 CORS에 대해서 (아직 지원하지 않는 브라우져가 많다고 지레 짐작하고) 용어만 언급하고 넘어갔다.
최근에 올라온 "Methods of communication"이라는 글에 걸린 링크를 통해 지금 당장이라도 쓸 수 있음을 확인하고, 몇 자 적어보려고 한다.

Ajax에는 Same Origin Policy라는 원칙이 있다. 말 그대로, 현재 브라우져에 보여지고 있는 HTML을 내려준 웹서버(Origin)에게만 Ajax 요청을 보낼 수 있다.

MS가 XMLHttpRequest를 처음 만들 때만 해도 이런 제약은 당연한 것처럼 보였지만, 지금에 와서는 OpenAPI를 통한 매시업(Mashup)이 활성화되는 데 가장 큰 장애물이 되었다. 매시업이 아니더라도 여러 개의 도메인을 사용해야 하는 대규모 사이트를 개발할 때도 골치거리였다. Same Origin Policy를 우회하는 방법으로 JSONP, IFRAME IO, CrossDomain Proxy 등이 고안되었지만, 보안성이 취약하다거나, 동기 호출이 안되거나, 주고 받는 데이터 형식이 제한되거나, 직관적이지 못하거나(dirty hack), ... 등의 문제점 때문에 표준화되기엔 무리가 있었다.

(중략) 한 참 뒤에야 W3C는 (MS의 IE가 제공하는 방식을 수용하여) 크로스도메인간에도 Ajax요청을 주고 받을 수 있는 방법을 표준화 했는데, 그것이 바로 CORS다.

CORS를 한 마디로 요약하면, "요청을 받은 웹서버가 허락하면 크로스도메인이라도 Ajax로 통신할 수 있다"라는 정책이다. 기술적으로는 크로스도메인에 위치한 웹서버가 응답에 적절한 Access-Control-Allow-류의 헤더를 보냄으로써 크로스도메인 Ajax를 허용 수 있다.

말이 뺑뺑도는 느낌인데, 예를 들어 보자(코드를 줄이기 위해  jQuery를 사용했지만 XMLHttpRequest를 직접 사용해도 마찬가지다). Ajax 요청을 보내는 one.html을 내려 준 a.com이 오리진 웹서버다. 이 요청을 받는 b.com이 크로스도메인 웹서버다. a.com에서 b.com으로... 그래서 크로스-도메인이다.

대충 그려보면 이런 식인데, b.com은 크로스도메인이므로 Ajax 통신이 불가능하지만, CORS를 적용하면 가능하다:



http://a.com/one.html
...
$.get('http://b.com/another.php', function(data) {
  alert(data);
})

http://b.com/another.php
...
<?php header('Access-Control-Allow-Origin:*'); ?>
...


보다시피, Ajax 클라이언트 측에는 추가적으로 할 일이 없고, 서버 측에서 할 일도 많지 않다. 웹서버(b.com)이 응답에 Access-Control-Allow-Origin헤더를 통해 모든 Origin(*)에서 오는 요청을 허락했으므로 다른 도메인(요청을 보낸 one.html을 내려 준 a.com)과 Ajax로 통신을 할 수 있다. 플래시에 익숙한 개발자라면 crossdomain.xml 을 떠오를 것이다. 맞다. 사실상 똑같다.

CORS는 FF 3.5+, 사파리 4+, 크롬 등의 대부분의 현대적인 브라우져에서 지원한다. IE의 경우엔 IE8부터 지원하는데, XMLHttpRequest대신 XDomainRequest객체를 사용해야 한다. 즉, 거의 다 된다! IE6,7만 무시하면... oTL

CORS 표준에 따르면 Origin외에도 HTTP 인증 여부, HTTP 메소드(GET, POST, ...), 특정 헤더 존재 유무 등의 다양한 기준으로 접근을 허용(preflight request)할 수 있는데, IE8은 이 스펙을 지원하지 않는다. -_-; CORS가 IE의 비표준 확장에 근거해서 만들어졌다는 점을 생각해보면.. 개그도 이런 개그가... -_-; IE9은... 아직 확인해보지 못했다. 

클라이언트 대신 서버 측에서 뭔가를 해야 한다는 것은 장점인 동시에 단점인데, 기존의 수많은 OpenAPI들을 활용하고 싶어도 제공자들이 CORS를 적용하기 전까지는 무용지물... -_- OpenAPI를 제공하고 있거나, 제공할 계획이라면 JSONP 뿐 아니라 CORS도 고려해야 할 듯...

처음 언급된지 십년이 다 된 "Web as a Platform"이 실감나는 요즘이다. 팀 버너스 리가 원하던 원치않던... 웹은 점점 플랫폼으로 진화(혹은 변신)하고 있다. 별것 아닌 CORS도 이런 관점에서 보면 조금은 다르게 보일지도...


저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2009/12/08 17:21
크리에이티브 커먼즈 라이선스
Creative Commons License
내 스스로와의 약속(하루에 한개씩 블로그를 쓰겠다는)을 지키면서, 또 다른 약속(지난 번 dW Live!의 페차쿠차 발표에 대한 보충 수업을 하겠다는)을 지키기 위해 여러 번에 나눠 쓰기로 했다 :p

천덕꾸러기 취급 받던 자바스크립트가 다시 각광을 받게된 것은 웹2.0 열풍에 실려 날아온 AJAX 때문이다. AJAX의 A가 Asynchronous라는 것은 자바스크립트 개발자라면 누구나 아는 사실임에 종종 이를 망각하는 경우가 있다.

가장 쉬운 예를 보자:
function get_result() {
  var result1, result2;
  $.ajax({ ..., success: function(data) { result1 = data; });
  $.ajax({ ..., success: function(data) { result2 = data; });
  return result1 + result2;
}

이게 뭐가 문제냐~고 하시면 대략 난감~ 정말 곤란~하시다.

설마 저렇게야 하겠어라고 생각하신다면, 좀 더 그럴듯한 예를 들어보자:
function get_image_size(image_src) {
  var img = new Image();
  img.src = image_src;
  return { w: img.width, h: img.height; };
}

이미지를 자바스크립트로 동적으로 이미지를 로딩하고 크기를 구해서 어떤 짓을 하려나 본데...
뭐가 문제냐고? 없으면 말고~=3=3=33

좀 더 고급스런(?) 예제로 마무리하자:
<script src="http://www.google.com/jsapi"></script>
<script>
google.load("jquery", "1");
$(document).ready(function() { ... });
</script>

좀 더 나은(정답은 없다) 방법은... 스스로 생각해 보시길...=3=3=33

i'll be back~

i'll be back~



저작자 표시 동일 조건 변경 허락
Posted by iolo
hacking/web2008/10/24 17:08
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Develop AJAX applications like the pros, Part 3: Use DWR, Java, and the Dojo Toolkit to integrate Java and JavaScript
번역: 전문가다운 Ajax 애플리케이션 개발, Part 3: DWR, 자바, Dojo 툴킷을 사용하여 자바와 자바스크립트 통합하기

전형적인 디벨로퍼웍스 스타일의 제목... 원츄! -.-)b~

제목과는 달리 dojo 얘기는 없다.
대신, 자바 개발자들을 위한 거져 먹는 Ajax! DWR이 있다.
정말~ 쉽고! 정말~ 편하다!
장담하건데... 기존에 자바로 구축된 웹 사이트에 간단한 Ajax를 추가하는 거라면 이 보다 더 좋은 솔루션은 없다.

百問而不如一見~

Posted by iolo
hacking/web2008/10/08 00:39
크리에이티브 커먼즈 라이선스
Creative Commons License
아싸~ 아기다리고기다러던~~ (이런 개그하지 말랬지~ +-.-)==@ (*..*) 퍼퍽!)

*경* Dojo Toolkit 1.2 정식 버전 릴리즈~~ *축*

Alex Russell의 뒤를 이어 Pete Higgins가 메인테이너를 맡은 뒤 첫 릴리즈다.
아무튼, 뭐가 달라졌나 볼까나~.~

새로운 데이터스토어들
  • dojox.data.JsonRestStore
  • dojox.data.CouchDBRestStore
  • dojox.data.GoogleFeedStor
  • dojox.data.GoogleSearchStore
  • dojox.data.PersevereStore - Perservere... 쓰는 사람이 있구나... -.-;
  • dojox.data.S3Store
JsonRestStore는 어디에나 써먹을 수 있을 정도고, 나머지도 나름대로 유용할 듯.

dojox.analytics.Urchin
구글 애널리틱스 스크립트 지연 로딩하는 모듈.
몇 바이트 되지도 않는 자바스크립트 때문에 가끔 먹통되는 상황을 경험해 본 개발자라면 유용하겠다.
내가 다니는 회사에서는 loginside라는 솔루션을 쓰는데, 이 녀석 조금 고치면 될 듯^^;

audio/video/object/embed 지원 모듈들
  • dojox.av.FLVideo
  • dojox.av.widget.Player
  • dojox.embed
  • dojox.embed.Flash
  • dojox.embed.Flash.proxy
  • dojox.embed.Quicktime
  • dojox.embed.Object
뭐~ 보시는 대로... dijit 위젯으로 만들어져서 일관성도 있고, 쓰기도 편해졌다.

엽기적인 크로스도메인 Ajax. 보면... 왜 엽기적이라고 하는 지 알 수 있다. -.-;
세삼 확인하는 사실...
세상은 넓고 꼴통은 많다...

dojox.io.xhrPlugins
dojo.xhr을 여러가지 방법으로 확장할 수 있는 방법을 제공한다.
예를 들면 크로스도메인일 경우엔만  IE8의 XDomainRequest나 서버측 프록시를 사용한다거나... Loading 메시지를 표시한다거나...
개인적으론, 1.2에 추가된 최고의 기능이 아닐까 한다.

dojo 0.x 시절에도 있었던 AOP 기능을 깔끔하게 새로 만들었다. 이런 거 보면 dojo가 너무 많이 앞서 갔다. -.-;

dojox.lang.observable
객체의 속성을 읽거나, 쓰거나, 메소드를 호출하는 것을 (비동기로) 감시하는 멋진 기능인데... IE에서 문제가 쪼금~ 있다는...-.-;

보안 관련 모듈들
  • dojox.secure.capability: 자바스크립트 코드를 검증한다. 그래도 eval은 여전히 evil~
  • dojox.secure.DOM: DOM 노드의 접근을 제한한다. 쉬운 말로... 자바스크립트로 DOM API의 래퍼를 다 만들었다는... -.-;;
  • dojox.secure.sandbox: 위의 모듈들을 사용하여 XHR을 통해 다른 도메인에서 로드된 HTML, JSON, 자바스크립트들의 접근을 제한한다. 옥상옥이라는게 이런건가...-.-;;;

덤으로...(알만한 사람들은 이미 알고 있겠지만)
기존에 AOL에서 제공하던 CDN 외에 구글에서 제공하는 CDN을 통해서 다운로드/설치 없이 바로 쓸 수 있다.

더 자세한 얘기는 공식 릴리즈 노트에~~

덧. 1.2 릴리즈 소식을 듣고 다운받으러 갔다가 무심결에 맨 위에 있는 링크를 눌렀더니... dojo.js -.-;;;;
prototypejquery 덕분에(?) 크기에 대한 압박이 심했나 보다. 아무튼 prototype.js나 jquery.js 대용이라면 dojo.js 파일 하나면 충분하고... dijit을 포함한 dojo 모든 것을 맛보려면 역시 풀버전~ ^^; 그 전에 눈요기가 필요하다면 Dojo Feature Explorer~ =3=333


Posted by iolo
hacking/web2008/10/05 23:14
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Ajax overhaul, Part 4: Retrofit existing sites with jQuery and Ajax forms
번역: Ajax로 사이트 전면 개편, Part 4: 기존 사이트를 jQuery와 Ajax forms를 사용하여 개선하기

열화와같은 독자들의 성원에 힘입어 연장 방영 중인 Ajax 오버홀 시리즈~

4부에서는 앞에서 한번 써 먹었던 jQuery Tabs UIjQuery Forms를 사용하여, 예제 애플리케이션인 Customize Me Now의 구매 과정을 마법사 스타일의 UI로 개선한다.

百問而不如一見~

Posted by iolo
hacking/web2008/09/23 21:14
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Ajax overhaul, Part 3: Retrofit existing sites with jQuery, Ajax tabs, and photo carousels
번역: Ajax로 사이트 전면 개편, Part 3: jQuery, Ajax 탭, 회전식 슬라이드쇼로 기존 사이트 개선하기

Ajax 오버홀, Part 1: Ajax와 jQuery로 기존 사이트 개선하기Ajax 오버홀, Part 2: jQuery, Ajax, 툴팁, 라이트박스로 기존 사이트 개선하기로 마무리된 줄 알았던 오버홀 시리즈...
열화와같은 독자들의 성원에 힘입어 연장~~?!

하긴.. 그렇게 끝나면 열라 허무했을 거다.
지금 4부까지 번역했는데... 분위기로 봐선 5부도 조만간 나올 듯...

3부에서는 jCarousel 플러그인을 이용한 회전식 슬라이드쇼와 jQuery Tabs UI 플러그인을 이용해서 탭 UI를 만든다.
百問而不如一見:


확실히 jQuery 가 좋은 것 같은데... 하지만...
나는 dojo 빠~=3=3=333

덧1. 이번 글을 번역할 때 애먹은 단어는 carousel이다. 회전 목마... -.-;;;; 저게 뭘로 봐서 회전 목마냐고...
궁여지책으로 회전식 슬라이드쇼라고 번역했지만, 찝찝하다.
편집자께서 알아서 고쳐주시겠지 했는데... 그대로다.
뾰족한 대안이 없었나 보다. 좋은 단어 추천 요망~.~/

덧2. 연재 1~2부를 번역할 때 overhaul을 어떻게 번역할 지를 고민하다가, 그냥 한글로 "오버홀"이라고 해다.
이번에는 편집자께서 제안해주신 "분해 수리"로 바꿨는데, 오늘 올라온 기사에는 "전면 개편"이라고 바뀌었다.
흠... 그런데... 뭔가... 좀...
이 연재에서 거듭 강조하는 핵심 중의 하나는 "전면" 개편이 아니라 "점진적" 개편이라는...
웃거나 말거나...=3=3=33

Posted by iolo
hacking/web2008/08/20 23:06
크리에이티브 커먼즈 라이선스
Creative Commons License
여름 휴가도 있고... 밥먹고 사는 일도 있고 해서... 한참 쉬었으니 다시 시작해보자.

dojo의 객체 시스템의 핵심은 dojo.declare다:
  • dojo.declare(className, superClass, { members... }) : 주어진 이름을 가진 클래스를 정의한다. 클래스 이름은 문자열로, 수퍼클래스는 클래스 객체로 지정해야 한다. 수퍼클래스가 없으면 null 또는 [ ] (빈 배열)을 지정하면 된다. 하나 이상의 수퍼클래스(정확히는 하나의 수퍼클래스와 여러 개의 믹스인을 배열로 지정할 수도 있다.
먼저, 단순한 클래스를 정의하는 예를 보면:
dojo.declare('Point', null, {
    x: 0,
    y: 0,
    constructor: function(x, y) {
        this.x = x || 0;
        this.y = y || 0;
    },
    moveTo: function(x, y) {
      this.x = x;
      this.y = y;
   },
    equals: function(point) {
      return (this.x == point.x) && (this.y == point.y);
    }
});

위의 예는 Point라는 이름의 클래스를 정의한다. 이 클래스는 수퍼클래스가 없으며, 하나의 생성자(constructor)와 x, y 두 개의 속성(멤버 변수)을 가지며, moveTo, equals 세 개의 메소드(멤버함수)를 가진다.
키워드는 declare(선언)이지만, 실제로 하는 일은 선언이 아니라 정의(define)다. 오히려 dojo.provide가 선언에 가깝다. 이 글의 주제에서 벗어나는 얘기니 궁금하면 구글신께 물어보시라... 나중에 시간나면 따로 쓰기로 하자~

이 클래스를 사용하는 예를 보면:
var p1 = new Point(1, 2);
var p2 = new Point();
p2.moveTo(3, 4);
alert(p1.equals(p2)); // false

보다시피 자바 등의 다른 언어와 별 차이가 없다.

계속해서, 상속의 예를 보면:
dojo.declare('Rect', [ Point ], {
    w: 0,
    h: 0,
    constuctor: function(x, y, w, h) {
       this.w = w || 0;
       this.h = h || 0;
    },
    getRight: function() {
      return x + w;
    },
    getBottom: function() {
      return y + h;
    },
    resize: function(w, h) {
      this.w = w;
      this.h = h;
    },
    equals: function(rect) {
      return this.inherited(arguments) && (this.w == w) && (this.h == h);
    }
});


위의 예는 Rect라는 이름의 클래스를 정의한다. 이 클래스는 Point를 상속받으며(x, y 두 개의 속성과 moveTo, equals 두 개의 메소드), 추가로 w, h 두 개의 속성과 getRight, getBottom, resize 세개의 메소드를 정의하며, equals를 오버라이딩(재정의)하고 있다.
equals에서 this.inherited(arguments)라는 생소한 구문이 보이는데 부모클래스에서 정의한 메소드를 호출하는 것이다. 자바로치면 super(rect)와 비슷하다고 보면 되겠다.
생성자에서 super를 호출하지 않는다는 점도 주의해야한다. 아무말 안해도 무조건 super를 호출한다. 자바스크립트는 함수 오버로딩(중복정의)을 지원하지 않기 때문에 생성자를 하나밖에 가질 수 없다.

객체 관련 유틸리티 함수들이 여러가지 있지만, 개인적으로 한 번이라도 써 본적이 있는 녀석들만 간단히 알아보면:
  • dojo.delegate(obj, { members...}) : 주어진 객체를 상속받은 객체를 만든다. dojo.declare와 달리, 클래스가 아니라 인스턴스 객체를 만든다. 간단하게 몇 가지 속성이나 메소드만 재정의한 객체를 만들때 편리하다.
  • dojo.clone(obj) : 주어진 객체의 deep-copy 객체를 만든다.
dojo는 하나 이상의 클래스를 하나의 .js 파일에 넣어두고, 이를 동적으로 로딩하는 기능을 제공하는데, dijit 설명할 때 자세히 알아보기로 하고... 여기서는 dojo 관련 소스들을 보다가 자주 보게될 함수 몇가지만 알아보자:
  • dojo.require(className) :  현재 모듈(나중에 설명한다)에서 주어진 이름의 클래스를 참조(사용)한다. 자바의 import와 비슷하지만, 자바와 달리 와일드카드(*)를 사용할 수 없다(dojo 0.4.x 쓰시던 분들도 주의!). 일반적으로 dojo.require('dijit.form.TextBox')라고 하면 dojo디렉토리/dijit/form/TextBox.js를 로딩한다고 이해해도 무방하다.
  • dojo.provide(className) : 주어진 이름의 클래스를 선언한다. 즉, 현재 모듈(나중에 설명한다)에서 주어진 이름의 클래스를 정의할 것임을 미리 알린다. 실제로는 빈 객체를 정의하기 때문에 네임스페이스 선언을 위해서 사용한다.
위의 두 함수는 dojo custom build에서도 매우 중요한 역할은 한다.

오늘은 여기까지~

다음에는 아기다리고기다리던 dijit(dojo widget)이다.

덧. 자바스크립트로 진지한 코딩을 해 본 개발자라면 IE의 trailing comma error의 공포를 알고 있을 것이다. dojo.delcare도 조심해서 쓰지 않으면 좌절을 맛보게 된다. 조만간 동의하실 것이라개인적으로 즐겨쓰는 방법은:
  1. 무조건! jslint로 검사한다. 예전에 썼던 웹 프로젝트에서 jslint로 자바스크립트 검증하기: maven 또는 ant 를 참조하시라~
  2. 무조건! 각 멤버 변수/함수를 쉼표로 끝내고, 불필요한 comma를 넣는 실수를 방지하기 위해 더미로 속성을 하나 더 넣는다. 예를 들면:
dojo.declare('Circle', [ Point ], {
    attr1: 'test',
    attr2: null,
    func1: function() {
        ...
    },
    func2: function() {
        ....
    },
    _dummy: null
});


Posted by iolo
hacking/web2008/08/10 17:13
크리에이티브 커먼즈 라이선스
Creative Commons License
자바스크립트로 코딩 좀 했다는 분들도 IE(참고자료)와 불여우, 그리고 W3C의 표준 DOM 이벤트 모델간의 차이에 대해서 제대로 이해하기보다는 까이꺼~ 대충~ 통밥으로~ 처리하는 경우를 많이 본다. 누가 좋으냐 나쁘냐는 논쟁은 끝이 없으니... 넘어가기로 하고... 골치아픈 브라우져간의 차이점을 신경쓰지 않고 개발할 수 있는 dojo의 이벤트 시스템을 알아보자.
  • dojo.connect(이벤트객체, 이벤트이름, 이벤트핸들러함수) : 지정한 객체에서 지정한 이름의 이벤트가 발생하면 이벤트 핸들러 함수를 호출하도록 "연결"한다. 핸들을 리턴한다.
  • dojo.disconnect(핸들) : dojo.connect()함수의 리턴값으로 받은 핸들을 사용하여 이벤트와 이벤트 핸들러 함수의 연결을 끊는다.
뭔 얘긴지 더 헷갈린다. 간다한 예제를 보자:
<html>
<head>
<script type="text/javascript" djConfig="isDebug:true" src="http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js"></script>
<script type="text/javascript">
</script>
</head>
<body>
<button id="helloBtn">Click Me</button>
<script type="text/javascript">
var helloBtn_onclick = function(evt) {
    alert('hello, world!');
    if (helloBtn_onclick_handler) {
       dojo.disconnect(helloBtn_onclick_handler);
       helloBtn_onclick_handler = null;
    }
};
var helloBtn = dojo.byId('helloBtn');
var helloBtn_onclick_handler = dojo.connect(helloBtn, 'onclick', helloBtn_onclick);
</script>
</body>
</html>

보시다시피 단순하다.

기존 방식대로 하면:
helloBtn_onclick = function(evt) {
    alert('hello, world!');
    helloBtn.onclick = null;
};
var helloBtn = document.getElementById('helloBtn');
helloBtn.onclick = helloBtn_onclick;

어랏?! 더 단순하자나! 그러나 이 코드가 항상 동작하는 것이 아니다라는 점이 문제다. 기존의 방식에 익숙하다면 지금 당장 바꿀 필요는 없다. dojo.connect가 있다는 점만 기억해두면 머지않아 필요할때가 올 것이다. 하나 이상의 이벤트 핸들러를 연결해야할 때, 이벤트 핸들러에서 이벤트의 전달을 중단해야 할 때, 또는 기본 동작(폼 submit같은)을 막고 싶을 때... 등등...
dijit(dojo의 위젯 시스템)을 쓴다면 별도로 disconnect를 해줄 필요가 없지만, 그 외의 경우에는 꼼꼼하게 disconnect해주는 것이 좋다. DOM 노드를 제거할때 dojo._destroyElement()를 사용하면 자동으로 연관된 이벤트 핸들러들을 disconnect 해주므로 편리하게 쓸 수 있다.

script태그가 body태그 끄트머리에 들어가있는 것이 이상하다고 생각한 분 계신가? 그렇다. 일부러 그렇게 한거다. 저렇게 안하면 브라우져와 주변 상황에 따라(!) 예상치 못한 결과를 만나게 된다. 그래서 dojo에서 이런 방법을 제공한다:
  • dojo.addOnLoad(핸들러함수) : 페이지를 열고 난 직후에 호출될 핸들러 함수를 추가한다.
  • dojo.addOnUnload(핸들러함수) : 페이지를 닫기 직전에 호출될 핸들러 함수를 추가한다.
백문이불여일견~
<html>
<head>
<script type="text/javascript" djConfig="isDebug:true" src="http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js"></script>
<script type="text/javascript">
var helloBtn_onclick = function(evt) {
    alert('hello, world!');
};
var byeBtn_onclick = function(evt) {
    alert('bye~ world!');
    location.href = 'http://google.com/';
};
var handlers = [];
var init = function() {
    handlers.push(dojo.connect(dojo.byId('helloBtn'), 'onclick', helloBtn_onclick));
    handlers.push(dojo.connect(dojo.byId('byeBtn'), 'onclick', byeBtn_onclick));
};
var destroy = function() {
  dojo.forEach(handlers).disconnect();
}
dojo.addOnLoad(init);
dojo.addOnUnload(destroy);
</script>
</head>
<body>
<button id="helloBtn">Click Me</button>
<button id="byeBtn">Bye~</button>
</body>
</html>

예제가 좀 길어졌지만, 기존에 자바스크립질에 익숙한 분들은 dojo.addOnLoad/Unload가 body의 onload/onunload핸들러와 크게 다르지 않다는 것을 알아챘을 것이다. 즉, <body onload="init()" onunload="destroy()"> 이라고 하면 된다는 얘기~ 그런데 왜 저렇게 복잡하게 하느냐고? 예전에도 한번 포스팅한 적이 있는데... onload의 타이밍이 미묘해서 브라우져마다 조금씩 다르다.
좀 다른 얘기지만, 위의 예제 코드에서 init()/destroy()에서 사용된 배열에 이벤트 핸들들을 보관해두고 일괄 해제하는 패턴은 자주 사용되므로 익해두면 편하다.

보너스로 한가지 더:
  • dojo.stopEvent(이벤트객체) : 이벤트의 전파와 기본 동작을 모두 차단한다.
예를 들면:
<form id="loginForm" action="login.do" method="post">
    <input type="text" id="usernameText" name="username" value="" />
    <input type="password" id="passwordText" name="password" value="" />
    <button type="submit">Login</button>
</form>
<script>
dojo.connect(dojo.byId('loginForm'), 'onsubmit', function(evt) {
    if (!dojo.byId('usernameText').value || !dojo.byId('passwordText').value) {
      dojo.stopEvent(evt);
    }
});
</script>

자바스크립트에 익숙한 분들은 return false; 이런 짓(!)을 하시는데... 이거 생각처럼 잘 안된다. 이 기회에 링크한 문서들을 참고해서 왜 되고 또 왜 안되는지 좀 더 파 보시는 것도 괜찮을 듯...

다소 뜬금없지만, 이벤트 시스템의 일부이기도 하고, 유용한 녀석들이니 언급은 하고 넘어가야 할 것 같다:
  • dojo.subscribe(토픽이름, 토픽핸들러함수) : 지정한 토픽이 발생하면 호출할 핸들러함수를 추가한다.
  • dojo.publish(토픽이름, 파라메터배열) : 지정한 토픽을 발생시킨다. 그러면, 위의 dojo.subscribe()를 통해 등록한 핸들러 함수들이 모두 호출된다.
AJAX의 특성상 비동기 동작이 많고, 이를 처리하기위해서 코드가 꼬이고, 이렇게 꼬인 코드를 풀기 위해 전역변수를 많이 쓰게된다. dojo.publish/subscribe()를 사용하면 이러한 상황을 많이 줄일 수 있다. C언어를 오랜동안 쓰신 분이라면 setjmp/longjmp와 비슷하다고 생각할 수 있겠다. 제대로된 예제를 만들려면 꽤 긴 코드가 필요하니, 나중에 따로 설명하기로 하자.

다음은 dojo의 객체 시스템에 대해서 알아보기로 하고...
오늘은... 이만...
사용자 삽입 이미지
정말... 덥다...

Posted by iolo
hacking/web2008/08/06 14:08
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Develop Ajax applications like the pros, Part 1: Using the Prototype JavaScript library and script.aculo.us
번역: 전문가다운 Ajax 응용 프로그램 개발, Part 1: Prototype 자바스크립트 라이브러리와 script.aculo.us 사용하기

developerWorks 특유의 장황한 제목이 인상적이다.
장황한 제목은 무시하고... 내 맘대로 제목을 붙여본다면...
프로토타입스크립타큘러스로 배우는 AJAX 프로그래밍 입문.



Posted by iolo
hacking/web2008/08/02 21:28
크리에이티브 커먼즈 라이선스
Creative Commons License
이번에 알아볼 내용은 애니메이션/효과를 위한 기능이다.

기본 효과
간단한 효과들이지만 dojo base에 포함되어 있어서 dojo.js 파일 하나만 있으면 편하게 쓸 수 있다.
  • dojo.fadeIn(args) : 지정한 노드를 서서히 불투명하게 만든다. args는 여러가지 파라메터를 묶은 해시다. dojo에서는 이런 식의 파라메터를 즐겨쓴다.
  • dojo.fadeOut(args) : 지정한 노드를 서서히 투명하게 만든다.
  • dojo.animateProperty(args) : 지정한 노드의 (CSS) 속성을 연속적으로 변화시킨다. 이 함수만 활용하면 대부분의 효과를 만들 수 있다.
간단한 예를 들어 보면:

dojo.fadeOut(
    node: 'title',
   duration: 1000,
   delay: 250
  }).play();

250ms를 기다린 후, 1000ms(1초)동안 id가 title인 노드를 천천히 표시한다(불투명). fadeOut대신 fadeIn을 사용하면 숨긴다(투명).

dojo.animateProperty({
    node: 'title',
    properties: {
        width:{ start:10, end:500, unit:'px' },
        opacity: { start:0, end:1 },
        backgroundColor: { start: '#ff0000', end: '#00ff00' }.
        fontSize: { start:10, end:20, unit:'pt'},
   },
    duration:500
});

500ms(0.5초) 동안 domNode의 너비를 10px에서 500px로, 투명에서 불투명으로,  배경색을 빨강에서 초록으로, 글꼴 크기를 10pt에서 20pt로... 부드럽게~ 바꾼다. 즉, 위의 dojo.fadeIn/fadeOut()은 dojo.animateProperty()로 쉽게 구현할 수 있다.

좀 더 복잡한(그래봐야 길어 보일 뿐~) 예를 만들어보자:
<html>
<head>
<script type="text/javascript" src="http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js"></script>
<style type="text/css">
#welcome { display:none; position:absolute; top:50px; left:50px; width:300px; height:200px; border:2px solid #cc0000; background-color:#00ff00; color:#0000ff; }
</style>
<script type="text/javascript">
var showWelcome = function() {
  // fadeIn이 효과가 있으려면 먼저 투명하게 만들어둬야 한다.
  dojo.style('welcome', { opacity: '0', display: 'block' });
  dojo.fadeIn({
    node: 'welcome',
    duration: 1000,
    delay: 1000
  }).play();
};

var flyWelcome = function() {
  var bodyBox = dojo.contentBox(dojo.body());
  var welcomeBox = dojo.contentBox('welcome');
  var goArgs = {
    node: 'welcome',
    properties: {
      left: bodyBox.w - welcomeBox.w,
      top: bodyBox.h - welcomeBox.h
    },
    duration: dojo.byId('flyTime').value * 1000, // 밀리초
  };
  var goAnim = dojo.animateProperty(goArgs);
  goAnim.play();
};

var hideWelcome = function() {
  dojo.fadeOut({
    node: 'welcome',
    duration: 1000,
    delay: 100,
    onEnd: function() { dojo.style('welcome', 'display', 'none'); }
  }).play();
  // 애니메이션은 비동기로 일어난다.
  // 여기에 dojo.style('welcome', 'display', 'none');를 넣으면
  // 애니메이션을 시작하자마자 바로 사라져버리므로(display:none),
  // 스르륵 사라지는(투명도를 조절하는) 효과를 볼 수 없게된다.
};

dojo.addOnLoad(showWelcome);
</script>
</head>
<body>
<h1>Hello, World!</h1>
<p>Blah Blah...</p>

<div id="welcome">
<h1>Welcome!</h1>
<p>Blah Blah...</p>
<p>
<button onclick="flyWelcome()">Fly me to the moon</button>
during <input type="text" id="flyTime" value="1" size="5" /> seconds.
</p>
<button onclick="hideWelcome()">Let it be</button>
</div>

</body>
</html>

페이지가 로딩되면 잠시 뒤에 Welcome 창(?)이 스르륵~ 나타난다. 여기서 Let it be를 누르면 창이 스르륵~ 사라지고, Fly me to the moon을 누르면 지정한 시간동안 창이 아래쪽 구석으로 날아간다.
예제 자체는 별거 없지만, 중간에 코멘트 중에 중요한 내용이 있다. 애니메이션은 항상 비동기로 진행된다는 사실을 명심하자. 동기를 맞추려면 그래서 onBegin, onEnd 등의 이벤트를 이용해야 한다.

고급 효과(dojo.fx 패키지)
dojo base에 효과를 자꾸 추가하면 dojo.js 파일의 크기가 너무 커지므로, dojo.fx 라는 별도의 패키지를 만들었다. 따라서 아래의 효과들을 사용하기 전에 dojo.require('dojo.fx');를 실행해야 한다.
  • dojo.fx.chain([애니메이션객체들...]) : 여러 개의 효과을 순서대로 실행하는 복합 효과.
  • dojo.fx.combine([애니메이션객체들...]) : 여러 개의 애니메이션을 동시에 실행하는 복합 효과.
  • dojo.fx.slideTo({ node: 노드, top: 세로좌표, left: 가로좌표 }) : 노드를 지정한 좌표로 이동하는 효과.
  • dojo.fx.wipeIn({ node: 노드 }) : 노드의 높이를 점점 크게하면서 나타나는 효과.
  • dojo.fx.wipeOut({ node: 노드 }) : 노드의 높이를 점점 줄이면서 사라지는 효과.
  • dojo.fx.Toggler(args) : 지정한 효과를 사용해서 노드를 show/hide() 하는 도우미 클래스. 동일한 효과로 show/hide()를 반복할 경우 편리하게 쓸 수 있다.
백문이불일견, 백견이불여일런!
말로 설명하려고 해도 말재주가 부족하니... 소스코드로 때우기로 하자.
<html>
<head>
<script type="text/javascript" djConfig="isDebug:true" src="http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js"></script>
<style type="text/css">
#overlay { z-index:999; position:absolute; overflow:hidden; top:0; left: 0; right:0; bottom: 0; width:100%; height:100%; background:#000; }
#lightbox { z-index:1000; position:absolute; overflow:hidden; top:0; left:0; background:#fff; }
#lightbox div { border:1px solid #000; padding:20px; }
</style>
<script type="text/javascript">
dojo.require('dojo.fx');

var showLightbox = function() {
  var s1 = dojo.fadeIn({ node:'overlay', end: 0.5 });
  var s2 = dojo.fx.wipeIn({ node:'lightbox' });
  var s3 = dojo.fx.slideTo({ node:'lightbox', top:100, left:0 });
  var s4 = dojo.fx.slideTo({ node:'lightbox', top:200, left:300 });
  fx = dojo.fx.chain([s1, s2, s3, s4]);
  dojo.connect(fx, 'onBegin', function() {
    dojo.style('overlay', 'display', 'block');
    dojo.style('lightbox', 'display', 'block');
    fx.stop();
  });
  fx.play();
};

var hideLightbox = function() {
  var h1 = dojo.fx.slideTo({ node:'lightbox', top:200, left:0 });
  var h2 = dojo.fx.slideTo({ node:'lightbox', top:0, left:0 });
  var h3 = dojo.fx.wipeOut({ node:'lightbox' });
  var h4 = dojo.fadeOut({ node:'overlay' });
  var fx = dojo.fx.combine([h1, h2, h3, h4]);
  dojo.connect(fx, 'onEnd', function() {
    dojo.style('overlay', 'display', 'none');
    dojo.style('lightbox', 'display', 'none');
    fx.stop();
  });
  fx.play();
};

dojo.addOnLoad(function() {
  dojo.style('overlay', 'display', 'none');
  dojo.style('lightbox', 'display', 'none');
});
</script>
</head>
<body>

<p>Click the picture to show in the light box:</p>
<img src="photo.jpg" width="80" onclick="showLightbox()" />

<div id="overlay"></div>

<div id="lightbox">
  <div>
    <img src="photo.jpg" onclick="hideLightbox()" />
  </div>
</div>

</body>
</html>

페이지가 로딩된 다음, 작은 이미지를 클릭하면 뭔가 어수선한 애니메이션이 나오고 창(레이어)에 큰 이미지가 표시된다. 큰 이미지를 클릭하면 역시 어수선한 에니메이션이 나오고 창(레이어)이 닫힌다. 쉽게 얘기해서 어수선한 LightBox 다. 나도 안다... 하나도 안 비슷하다는 거... 그래도 조금만 손을 보면... -.-;;;;
중간에 보면 dojo.fx.combine()dojo.fx.chain()을 쓴 부분이 있는데... 위의 코드를:
dojo.fx.chain([f1, dojo.fx.combine([f2, f3]), f4]); 처럼 바꾸면 f1이 먼저 진행되고, f2와 f3는 동시에 진행되고, 그 다음에 f4가 진행된다. 예를 들려다보니 저렇게 됐지만, 잘 엮으면 멋진 효과를 쉽게~ 만들 수 있다. 정말 잘~ 엮어야 된다. 뭔 소린지는 엮어 보면 안다. -.-;;;
그리고 dojo.addOnLoad()를 사용해서 페이지가 로딩된 직후 overlay와 lightbox노드를 숨기고(display: none)있는데, 이는 보이지 않는 노드에 대해서 높이 계산을 안하는 불여우의 버그(또는 기능)를 피하기 위한 꼼수다.

혹시 prototype을 사용하고 있다면 script.aculo.us를 사용해서 비슷한 효과(더욱 현란한 효과)를 낼 수 있다. prototype과 scrit.aculo.us에 관심이 있는 분들은 인사이트에서 번역 출판한 프로토타입과 스크립타큘러스를 참조하시라(절때! 내가 추천글을 썼다거나 교정을 봤다거나 해서 이러는 건 아니고...-.-;;;; 프로토타입 관련 책 중에서는 원서도 제일 좋고, 번역도 제일 좋다).

오늘은 이 정도로 하고... 다음은 이벤트 시스템~

Posted by iolo
hacking/web2008/07/30 10:00
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Performance Ajax tools
번역: Ajax 성능 도구

Apache Bench, Tsung, Bonnie++, Wireshark(Ethereal), 그리고 Cometd, Lightstreamer, KnowNow, lighttpd 등의 Comet 구현체들, LiveHttpHeaders 등의 파이어폭스 확장들을 소개한다.
말그대로... 소개만 할 뿐... 너무 기대하지 말자. -.-;;;

그래도 이렇게 모아서 소개해주는 것만으로 큰 도움이 된다.



Posted by iolo
hacking/web2008/07/29 00:43
크리에이티브 커먼즈 라이선스
Creative Commons License
할 수 있는데 까지 해보자.

DOM 노드 위치/좌표 관련 함수들
CSS만으로 모든 레이아웃을 정확하게 계산하기란 쉽지 않다. 디자이너의 현란한 디자인이 IE의 더블마진 버그와 만나는 순간... 때문에 레이아웃 잡는게 여간 골치아픈게 아니다. 그래서 이런게 필요하다:
  • dojo.marginBox(domNode) : 지정한 DOM 노드의 margin box를 얻는다.
  • dojo.marginBox(domNode, {l:가로좌표, t:세로좌표, w:너비, h:높이}) : 지정한 DOM 노드의 위치/크기를 margin box로 설정한다. 위치는 부모 노드의 위치에 대한 상대좌표다(즉, CSS의 position:absolute 다). margin/padding/border는 바뀌지 않지만, content box의 크기는 바뀐다. 기본 단위는 픽셀(px)이다. 각 속성은 생략할 수 있다.
  • dojo.contentBox(domNode) : 지정한 DOM 노드의 content box를 얻는다.
  • dojo.contentBox(domNode, {l:가로좌표, t:세로좌표, w:너비, h:높이}) : 지정한 DOM 노드의 content box의 위치/크기를 설정한다. 위치는 부모 노드의 위치에 대한 상대좌표다(즉, CSS의 position:absolute 다) margin/padding/border는 바뀌지 않지만, margin box의 크기는 바뀐다. 기본 단위는 픽셀(px)이다. 각 속성은 생략할 수 있다.
사용자 삽입 이미지
위의 그림은 CSS의 박스모델을 설명하는 것인데, dojo의 contentBox는 위의 그림에서 맨 안쪽의 content를 둘러싼 사각형을, marginBox는 맨 바깥쪽의 margin까지 포함한 사각형을 의미한다. 이 결과는 IE이건 아니건, Quirks Mode이건 아니건 동일하다.
웬만하면 CSS로 처리하는 것이 바람직하지만, iframe이나 textarea같은 꼴통들에겐 dojo.contentBox/marginBox()가 도움이된다. 간단한 예를 들어보면(저번에 예제를 하나도 안만들어서 이번엔 좀 길게 만들어 봤다):
<html>
<head>
<script type="text/javascript" src="http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js"></script>
<style type="text/css">
body { margin:0; padding:0; height:100%; overflow:hidden; }
#wrapper { width:100%; height:100%; }
#header { height:20px; background:#9cf; }
#content { width:100%; position:absolute; top:20px; bottom:0; background:#ccc; }
#frame { width:100%; height:100%; overflow:auto; }
</style>
<script type="text/javascript">
if (dojo.isIE) {
  var onResize = function() {
    var box1 = dojo.contentBox('wrapper');
    box1.t = 20;
    box1.h -= 20;
    dojo.marginBox('content', box1);
  };
  dojo.connect(dojo.global, 'resize', onResize);
  dojo.addOnLoad(onResize);
}
</script>
</head>
<body>
<div id="wrapper">
  <div id="header">Hello,World!</div>
  <div id="content"><iframe id="frame" src="http://dojotoolkit.org/" frameborder="no"></iframe></div>
</div>
</body>
</html>

이 예제의 목적은 스크롤바 없이 화면에 꽉 채운 페이지를 만드는 것이다. IE에선 부모 노드의 크기가 %로 지정되면 right/bottom 속성이 동작하지 않기때문에 곤란하다. IE의 CSS expression을 써도 되겠지만, 개인적으로는 이 방법을 선호한다. CSS만으로 어떻게 할 수 있을 것 같긴한데... 내공 부족 -.-;;;(표준 CSS만으로 할 수 있는 좋은 방법이 있으면 알려주시면 콩다방 커피 한잔 대접합니다~). 예제를 위한 예제이다 보니 아직 설명한 것들이 잔뜩 있는데 핵심은 중간 쯤에 있는 자바스크립트 코드다. 중간에 있는 if (dojo.isIE) { ... } 스크립트(주황색 배경)를 지우고 IE에서 실행시켜보시라. 나중에 dijit layout widget을 사용하면 이것보다 훨씬 복잡한 작업을 한 방에 해치울 수 있다!

DOM 편의 함수
앞에서 알아본 dojo.attr()/dojo.style()dojo.*Class() 외에도 잡다한 편의함수들이 많다. 이 함수들의 완전한 목록은 dojo API Reference에서 찾아보시고~ 여기서는 맛보기로 생각나는 것 몇 개만 알아보자:
  • dojo.place(domNode, refDomNode, position) : domNode를 refDomNode를 기준으로 위치/순서를 변경한다. position은 인덱스(숫자) 또는 before/after/first/last 중의 하나다. position 인자에 따라 appendChild/insertBefore() 등의 DOM API를 적절히 호출한다. 처음엔 복잡해 보이겠지만, 익숙해지고 나면 DOM API가 얼마나 구린지(?), 그리고 dojo.place()가 얼마나 자연스러운지 알게 될 것이다.
  • dojo.isDescendant(domNode, ancestorDomNode) : domNode가 ancestorDomNode의 하위 노드인지 확인한다.
  • dojo._destroyElement(domNode) : 지정한 노드를 해제한다. IE에서는 이벤트 핸들러가 걸린 노드와 관련한 메모리가 새는 버그가 있어서 domNode.parentNode.removeChild(domNode) 또는 domNode.parentNode.innerHTML = '' 또는 domNode.ownerDocument.detachNode(domNode) 로는 충분하지 않다. domNode.parentNode.innerHTML'_'로 시작하는 private함수지만 public으로 해도 무방할 정도로 유용하다.
  • dojo.setSelectable(domNode, selectable) : domNode와 모든 자식노드들을 선택불가능하게(마우스로 긁을 수 없게) 만든다. 이걸 활용하면 블로그 본문 긁지 못하게 하는 것을 쉽게 할 수 있겠지만... 이런 짓 하지말자. 어차피 긁을려면 다 긁는다. 다만, 메뉴나 툴바 같은 녀석들을 이 함수를 사용해 긁지 못하게 하면 잡다한 오동작을 원천봉쇄할 수 있다.
  • dojo._getOpacity(domNode) : domNode의 투명도를 얻어온다. 0이면 완전 투명, 1이면 완전 불투명이다. 이 함수 없이 할려면 IE이냐 아니냐에 따라서 삽질을 좀 해야 한다.
  • dojo._setOpacity(domNode, opacity) : domNode의 투명도를 설정한다.
이 함수들을 직접 쓸 기회는 많지 않겠지만 알아두면 유용할 때가 금방 온다.

(중간에 dojo API Reference가 있다고 얘기했다. 아는 사람은 다 알겠지만... 이걸 지금까지 얘기안한 이유가 있다. 이거 보고 괜히 dojo를 오해하지 말기 바란다. 이렇게 느려터지게 만드는 것도 쉬운 일이 아니다. 굳이 API가 필요하다면 이것 보다는 dojo toolbox를 쓰길 권한다.)

사용자 삽입 이미지
유틸리티 함수는 일단 마무리~
다음에는 재미있는(?) 애니메이션/효과 관련 함수들을 간단히 알아보고,
이어서 이벤트 시스템, 클래스 시스템, 그리고 dijit... 갈 길이 멀구나...

Posted by iolo
hacking/web2008/07/24 17:49
크리에이티브 커먼즈 라이선스
Creative Commons License
남아 있는 유틸리티 함수들 중에서 정말 자주 쓰이는 몇가지만 더 알아보자.

dojo.byId(id)
document.getElementById(id)와 동일하며 프로토타입$(id)와 동일하다.
지정한 id를 가진 DOM 노드를 찾는다. 참고로 dijit.byId(id)와는 전혀 다른 녀석이니 헷갈리지 않기를... 그리고 다른 window(frame/iframe)의 노드를 찾고 싶을 때는 dojo.withGlobal(window,'byId',dojo,[id]) 처럼 하면 된다(뭐가 이렇게 복잡하냐고? 그래도 없는 것 보다는 낫다).
$()보다 길어서 타이핑하기 귀찮겠지만... 덕분에 프로토타입이나 jQuery와 섞어서 사용해도 아무런 문제를 읽으키지 않는다. 굳이 $()를 쓰고 싶으면 예전에 쓴 블로그를 참조하시길...

dojo.attr() - DOM 속성 관련 함수들
dojo.attr()은 getter/setter 두가지 역할을 겸하고 있으며, domNode 대신 해당 노드의 id를 문자열로 지정해도 된다.
  • dojo.attr(domNode, attrName) : 지정한 DOM 노드의 지정한 속성 값을 가져온다. domNode.getAttribute(attrName)와 비슷하다.
  • dojo.attr(domNode, attrName, attrValue) : 지정한 DOM 노드의 지정한 속성 값을 변경한다. domNode.setAttribute(attrName, attrValue)와 비슷하다. 참고로, dojo 1.1.1 이후 버전에서는 attrName/Value 쌍을 배열로 지정할 수 있다. 예를 들면: dojo.attr(domNode, { action: 'add.php', method: 'POST' });
  • dojo.removeAttr(domNode, attrName) : 지정한 DOM 노드의 지정한 속성을 삭제한다. domNode.removeAttribute(attrName)와 비슷하다.
domNode.setAttribute/getAttribute/removeAttribute를 사용하면되는데 왜 이런게 필요하냐고 물으신다면... 자바스크립트 닭질을 좀 더 하시길 권해드리는 바이다. 일단 dojo에서 이런 걸 제공한다는 사실만 기억해두면 조만간 고맙게 쓰게 될 날이 온다.

dojo.style() - DOM CSS 속성 관련 함수들
dojo.style()도 getter/setter 두가지 역할을 겸하고 있으며, domNode 대신 해당 노드의 id를 문자열로 지정해도 된다.
  • dojo.style(domNode, cssAttrName) : 지정한 DOM 노드의 스타일 중에서 지정한 CSS속성 값을 가져온다. 주의 할 점은 cssAttrName은 CSS 형식(font-size, left-padding ...)이 아닌 자바스크립트 형식(fontSize, leftPadding ...)으로 지정해야 한다는 것이다. 참고로, dojo 1.1.1 이후 버전에서는 CSS 형식과 자바스크립트 형식 둘 다 사용할 수 있으며, cssAttrName/Value 쌍을 배열로 지정할 수 있다. 예를 들면: dojo.style(domNode, { fontSize: '20pt', 'text-decoration': 'underline' });
  • dojo.style(domNode, cssAttrName, cssAttrValue) : 지정한 DOM 노드의 스타일 중에서 지정한 CSS속성 값을 변경한다.
dojo.style()함수는 계산된 스타일(computed style)을 대상으로 한다. 즉, 캐스캐이드된 여러가지 CSS속성들이 모두 적용된 상태를 기준으로 값을 얻어오거나 변경한다.

dojo.*Class() - DOM CSS 클래스 관련 함수들
별거 아닌거 같지만 짱 편한 함수 몇 개 소개한다. 이런 짓 해보신 적 없으신가?
domNode.className = domNode.className + ' ' + 'newClass'; // 공백 주의!
domNode.className = domNode.className.replace('oldClass', ' ');

이게 중간 중간 공백 신경 쓰려면 열라 귀찮다. 아무튼 이런 닭질은 이젠 안녕이다.
  • dojo.addClass(domNode, cssClassName) : 지정한 DOM 노드에 지정한 CSS 클래스를 추가한다. cssClassName에는 여러 개의 클래스 이름을 공백으로 구분하여 지정해도 된다.
  • dojo.removeClass(domNode, cssClassName) : 지정한 DOM 노드에서 지정한 CSS 클래스를 제거한다. cssClassName에는 여러 개의 클래스 이름을 공백으로 구분하여 지정해도 된다.
  • dojo.toggleClass(domNode, cssClassName) : 지정한 DOM 노드에서 지정한 CSS 클래스를 갖고 있으면 제거하고, 없으면 추가한다.
  • dojo.hasClass(domNode, cssClassName) : 지정한 DOM 노드가 지정한 CSS 클래스를 갖고 있는지 확인한다.
dojo.attr()/dojo.style()/dojo.*Class()함수들은 dojo.query()와 함께 쓰면 더욱 편리하다. dojo.query에 대해서는 다음에 따로 알아보기로 하고, 예를 하나만 들어보면:
dojo.query('tr').forEach(
    function(node, i) {
        dojo.addClass(node, (i % 2) ? 'even' : 'odd');
    }
);

유틸리티 함수는 세 번으로 끝낼려고 했는데... 생각보다 길어졌다.

다음에 남은 유틸리티 함수들을 알아보고, 그 다음에 에니메이션 관련 함수들 알아보기로 하고... 오늘은 여기까지~

Posted by iolo
hacking/web2008/07/19 16:56
크리에이티브 커먼즈 라이선스
Creative Commons License
자바스크립트에는 두 가지 타입 검사 연산자가 있다: instanceoftypeof

그런데 이게 미묘하다. 예를 들어:
var hello = "hello"; 
alert(typeof hello); // string
var world = new String("world");
alert(typeof world); // object -,.-;;

dojo를 사용해보면 어떨까?
alert(dojo.isObject(hello)); // false
alert(dojo.isObject(world)); // true
alert(dojo.isString(hello)); // true
alert(dojo.isString(world)); // true

말나온 김에 한 가지만 더 예를 들어보면:
function test2() {
  alert(typeof arguments); // object
  // alert(arguments.join(',')); // 에러 -,.-;;;
  var args = []; // new Array();
  for (var i = 0; i < arguments.length; i++) { args[i] = arguments[i]; };
  alert(typeof args); // object typeof는 "array"를 모른다! -.-;
  alert(args.join(',')); // hello,world,1,2,3
}
test2('hello', 'world', 1, 2, 3);

dojo를 사용해보면 어떨까?
alert(dojo.isArray(arguments)); // false
alert(dojo.isArray(args)); // true
alert(dojo.isArrayLike(arguments)); // true
alert(dojo.isArrayLike(args)); // true

위의 것들은 생각나는 것을 예로 든건 뿐이고, 자바스크립트로 코딩하다보면 더 미묘한 경우도 많다. 그래서... dojo에는 이런 것들이 있다:

  • dojo.isString(arg) : arg가 문자열이면 true
  • dojo.isObject(arg): arg가 객체이면 true
  • dojo.isFunction(arg): arg가 함수이면 true
  • dojo.isArray(arg): arg가 배열이면 true
  • dojo.isArrayLike(arg): arg가 유사배열이면 true

그냥 익혀두고 쓰면 날로 편한케 하고져 할 따름이다. 찝찝하다면 그냥 알아만 두자. 자바스크립트로 먹고 살다보면 아쉬울 때가 곧 올 것이다.

이것만으로 끝내기 아까우니까 dojo의 브라우져 검사 기능을 간단히 알아보자:

  • dojo.isFF : 파이어폭스라면 메이저 버전 번호(숫자; 1.5, 2, 3)가 들어있다.
  • dojo.isIE: IE계열이라면 6, 7, 8 등의 메이저 버전 번호가 들어있다.
  • dojo.isSafari: 사파리라면 버전이 들어있다.
  • dojo.isOpera: 오페라라면 버전이 들어있다.
  • dojo.isMozilla: Gecko 기반 브라우져(Mozilla, Firefox, Camino 등)라면 Gecko 버전이 들어있다.
  • dojo.isKhtml: KHTML 기반 브라우져(Safari, Konqurer 등)라면 버전이 들어있다.
  • 기타 dojo.isBrowser, dojo.isQuirks, dojo.isGears, dojo.isAir, dojo.isRhino, dojo.isSpidermonkey 등이 있다.

이게 생각보다 편하다. 예를 들면:
if (dojo.isFF) {
  // FF workaround...
} else if(dojo.isIE) {
  // IE 공통 workaround...
  if (dojo.isIE === 6) {
    // IE6 전용 workaround...
  }
}
if (!dojo.isIE && !dojo.isMozilla) {
  alert('sorry unsupported!');
  return;
}
// 브라우져 공통 ...

직접(!) 제작한 짤방 하나 소개하며... 오늘은 여기까지~
사용자 삽입 이미지


덧 1. dijit을 사용하게 되면 위의 속성들을 참조해서 다음과 같은 css클래스를 html 태그에 추가해주므로, 브라우져별 css 핵을 적용할 때 편하게 사용할 수 있다:
dj_ie, dj_ie55, dj_ie6, dj_ie7, dj_iequirks, dj_opera, dj_opera8, dj_opera9, dj_khtml, dj_safari, dj_gecko, dj_ff2

덧 2. 나중에 얘기할 기회가 있겠지만(전에 했던가...-.-) 위의 예를 쉽게 테스트 해보려면 그냥 다음과 같은 태그를 다른 <script> 태그보다 앞에 추가해주면 된다:
<script type="text/javascript" src="http://o.aolcdn.com/dojo/1.1.1/dojo/dojo.xd.js"></script>


Posted by iolo
hacking/web2008/07/13 19:58
크리에이티브 커먼즈 라이선스
Creative Commons License
dojo를 알고 있는 ajax 개발자들 조차도 dojo하면 먼저 뽀대는 나지만 용량이 크기, 느리고, 무거운 위젯 시스템(일명 dijit)을 떠올린다. dijit도 많이 가벼워졌고, 더 가볍게 쓸 수 있는 방법들 많이 있지만, 일단 무시하고...

dojo의 기본 시스템(일명 dojo core), 그 중에서도 유틸리티 함수들에 대해서 알아보기로 하자.

서버에서 ajax로 다음과 같은 json 데이터를 받아 왔다고 치자:
items: [
  { link: 'http://www.googledocs.com/', title: 'Google Docs' },
  { link: 'http://www.zoho.com/', title: 'Zoho' },
  { link: 'http://www.thinkfree.com/', title: 'ThinkFree Online' }
]

(데이터의 의미가 뭔지 알려고 하지 말자... 다친다 -.-;;;)

이걸 일반적인 자바스크립트로 처리한다고 치면:
for(var i = 0; i < items.length; i++) {
  str += '<a href="' + items[i].link + '">' + items[i].title + '</a>';
}
document.getElementById('resultDiv').innerHTML = str;

dojo 없이도 개선해야 할 여지가 많이 있지만, 그건 이 글을 범위를 벗어나니 스킵~

백문이 불여일견! dojo로 바꿔보자.
dojo.forEach(result, function(item) {
  str += '<a href="' + item.link + '">' + item.title + '</a>';
});
dojo.byId('resultDiv').innerHTML = str;

뭐가 달라졌을까...
1. 맨 아랫줄을 보면 document.getElementById() 대신 dojo.byId()가 사용된 것을 볼 수 있는데, 이건 프로토타입의 $() 와 비슷하다. 그냥 타이핑을 줄여주는 것 뿐이다.
2. 고전적인 for 루프 대신 dojo.forEach() 가 사용되었다.
for (var item in items) { } 도 있으므로 별 필요가 없다고 생각할 수 있지만, 자바스크립트의 for...in...은 유명한 evil 중의 하나다. 믿어라. 크록포드옹께서 그리 말씀하셨다.
다음에 보게 되겠지만 dojo.forEach()는 dojo의 배열 지원 함수 중의 하나에 불과하다. 모두 합체하면 게키강가3가 나온다. 믿거나 말거나... -.-;;; 루리루리짱께서 그리 말씀하셨다.

두둥! 이것이 바로 게키강가3!

아무튼 다시 원래 길로 돌아와서...
별로 편한거 같지 않다는 분들이 계시다. 한가지만 더 해보자.
dojo.forEach(result, function(item) {
  str += dojo.string.substitute('<a href="${link}">${title}</a>', item);
});
dojo.byId('resultDiv').innerHTML = str;

dojo.string.substitute()라는 이름은 길지만, 의미가 명확한 함수를 사용했다.
멋지다! 결과는 달라지지 않았지만, 코드가 아름다워졌다! 자바스크립트와 HTML의 따옴표 사이에서 방황했던 개발자라면... 감동! 그 자체다.

그래도 별로 편한거 같지 않다는 분들이 계시다.
하지만... 너무 덥다. -.-;;;; 오늘은 그만 하자.
아쉬운 분들을 위해 선물 하나 준비했다. 클릭하면 크게 보이겠지만, 그냥 작게 보고 만족하자.=3=333
사용자 삽입 이미지

Posted by iolo
hacking/web2008/07/08 18:18
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Debug and tune applications on the fly with Firebug
번역: 파이어버그를 이용한 신속한 웹 애플리케이션 디버깅과 튜닝

파이어폭스를 최강의 웹브라우져로 만든 주역 Firebug에 대한 소개 기사다.
아주 기본적인 내용들을 스크린샷 위주로 쉽게 설명하고 있다.
잘 알고 있는 사람들에겐 따분하고 쓸모없어 보이겠지만, 이 마저도 모르는 사람들이 수두룩하다.

Posted by iolo
hacking/web2008/06/18 14:26
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Ajax overhaul, Part 2: Retrofit existing sites with jQuery, Ajax, tooltips, and lightboxes
번역: Ajax 오버홀, Part 2: jQuery, Ajax, 툴팁, 라이트박스로 기존 사이트 개선하기

Ajax 오버홀, Part 1: Ajax와 jQuery로 기존 사이트 개선하기에 이은 오버홀 완결편.

그 시작은 창대하였으나 끝은 미미하리라...


Posted by iolo
hacking/web2008/06/05 00:23
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Ajax performance analysis
번역: Ajax 성능 분석

모처럼 유용한 번역 기사다. 뭐 그렇다고 그동안 번역했던게 백해무익했다는 얘기까진 아니고... -.-;

원 제목을 그대로 번역하다보니... 짧게 "Ajax 성능 분석"이 되버렸는데... 제대로 된 제목은 "Firebug와 YSlow!를 이용한 Ajax 성능 분석"이 되겠다.

Firebug는 이제 웹 개발자, 특히 AJAX 개발자들에겐 없어선 안될 친구다. 그러나, 대부분의 개발자들은 Inspector와 Script 디버거 외에는 별로 활용을 하지 않는 것 같다. 하지만 Firebug는 우리가 기대하는 그 이상의 도구다.

이 기사는 Firebug의 Net탭을 통한 성능 측정 방법과 측정 결과의 해석, 그리고 그 해결책까지 제시해준다. 덧붙여 YSlow까지 설명해준다. 혹시 AJAX를 많이 쓰는 사이트를 개발 하고 있다면 지금 당장 Net 탭을 확인해보자. 막대 그래프들이 겹치지 않고 계단처럼 늘어서 있다면... 당신은 AJAX를 AJAX답게 쓰고 있지 않다는 뜻이다.

잊지말자! AJAX의 첫번째 A는 Asynchronous다.

백문이불여일견, 백견이불여일런~



Posted by iolo
hacking/web2008/04/12 16:28
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Ajax overhaul, Part 1: Retrofit existing sites with Ajax and jQuery
번역: Ajax 오버홀(overhaul), Part 1: Ajax와 jQuery로 기존 사이트 개선하기

developerWorks 기사답게... 제목이 장황하다. 덩달아서 번역도 장황하다.
급하게 번역한 티가 너무 팍팍 난다.

jQuery의 철학적 근간?!이라고 할 수 있는 "조신한 자바스크립트(Unobtrusive JavaScript)" -- 누군가는 "나대지않는 자바스크립트"라고 번역했더라 --에 "점진적 향상(Progressive Enhancement)"이라는 뜬금없는 개똥 철학까지 들먹이며... 기존 사이트의 최대한 손대지 않으면서 "AJAX 삘"을 불어넣는 방법을 설명하고 있다. 말그대로 jQuery 스타일의 접근 방식이다. 글을 위해서 일부러 말도 안되는 쇼핑몰 예제까지 만든 저자의 노력도 높이 살만한다.

대부분의 웹 프로젝트에서 AJAX는 이 글에서 나오는 범주를 크게 벋어나지 않는다.

덧. 오버홀(overhaul)같은 단어는 뭐라고 번역하면 좋을까? 사전을 찾아봐야 "총점검 정비", "분해검사", "분해수리" 같은 소리만 한다. Ajax 분해검사... -.-;;; 첨엔 "Ajax 완전 정복"라고 번역했다가 원어의 느낌이 너무 안 살아나서 포기, 담엔 "다시 보는 Ajax"라고 번역했다가 너무 오바한거 같아서... 그냥 "오버홀"로 했더니 편집자께서 친절하게 괄호안에 원어를 적어주셨다. 맘에 안드셨나보다. oTL 좋은 번역 좀 알려주시라. 새삼 절감하는 거지만, 번역은 영어보다 국어 실력이다 -.-;

Posted by iolo
hacking/web2008/04/12 16:03
크리에이티브 커먼즈 라이선스
Creative Commons License
한국 developerWorks에 기고한 번역문

원문: Ajax and XML: Ajax for tables
번역: Ajax와 XML: 테이블을 위한 Ajax

흠... 급하게 번역한 티가 팍팍 난다-.-;;; 테이블을 위한 Ajax라니...-.-;;;;
제목은 "Ajax로 table 다루기 정도"로 바꾸면 좋겠다.

아무튼 prototype.js를 사용해서 tab, table, glider(slide-in effect)  등의 자주 쓰이는 기법을 (미주알 고주알) 정말 알기 쉽게 설명하고 있다.(내가 그랬다는 얘기가 아니고 원저자가 그랬다는 얘기다)

AJAX라는 말만 들어봤지 실제로 써본적은 없는... 개발자라면...(이런 분들 꽤 많다) 이 기회에 한 번 맛이라도 봐두자. AJAX를 나름 좀 써봤다는 분들에게도 되새겨서 나쁠 것이 없는 "패턴"들이다.
Posted by iolo
hacking/web2007/10/15 21:07
크리에이티브 커먼즈 라이선스
Creative Commons License
ajaxian.com에서 실시한 설문조사결과를 조금 뜯어보자:

사용을 검토하고 있는 브라우져 플러그인
  • Flash 71.9%
  • Silverlight 12.2%
  • 기타 28.9%
예상했던 결과다. 기타에 뭐가 있는지 더 봤으면 좋겠는데... 확실한건 자바도 기타에 속한다는 것이고, 12.2%보다는 적다는 것이다.

사용하고 있거나/검토하고 있는 AJAX 프레임웍/라이브러리
  • Prototype 68.4%
  • Scriptaculous 58.7%
  • jQuery 47.5%
  • Yahoo UI 40.3%
  • Dojo 38.3%
  • Ext JS 33.8%
  • Google Gears 22.0%
  • Google Web Toolkit (GWT) 17.2%
  • DWR 12.7%
  • Symfony 4.6%
  • Qooxdoo 3.2%
  • Tibco GI 2.9%
  • jMaki 1.5%
  • ICEfaces 1.5%
  • Other (please specify) 21.8%
역시 예상했던 결과다. 복수 선택이 가능했던것 같다.
prototype/scriptaculous짝꿍이 압도적이고, 그 뒤로 새롭게 급부상하고 있는 jquery가 있다.
yahoo ui는 extjs와 표가 갈리면서 좀 부진한 모습이고, dojo는 0.9의 등장으로 상당히 선전하고 있는 모습?
gwt는 다소 하락세. gwt가 편하긴하지만, 자바 전용이고 융통성이 떨어진다는 측면에서 아무래도 폭넓은 지지를 받기가 힘들다.(고자동 저유연성).
dwr, jmaki같은 자바 전용 프레임웍/라이브러리들도 나름대로 지지를 받고 있다.
요약하면 prototype, yahoo ui, gwt, dojo 4파전에서 gwt와 jquery가 자리를 바꾼 모습이다. dojo는 1.0에 포함될 grid, yahoo ui는 extjs와의 분할, jquery는 새로 추가될 widget시스템이 어떤 결과를 가져올지 흥미진진하다.

사용하고 있는 언어/플랫폼
  • JavaScript/ECMAScript 83.8%
  • PHP 52.9%
  • Java 38.0%
  • ActionScript (i.e., Flash/Flex) 16.7%
  • Ruby 15.1%
  • C# 14.9%
  • Perl 10.4%
  • Python 9.7%
  • VB.NET 6.3%
  • C++ 5.9%
  • ColdFusion 5.0%
  • VB 6 and earlier 4.4%
  • Other 8.8%
클라이언트사이드/서버사이드의 구분이 없어서 좀 애매하긴 한데...
자바스크립트는 어차피 클라이언트사이드를 의미할텐데, 83.8%라는 건... VBScript가 10% 내외를 확보하고 있다는 것인가? 플래시 도입을 검토하고 있다는 응답이 70%가 넘었는데, 16.7%에 그친걸 보면 아직 도입하진 않았나보다. Ruby는 꾸준히 상승세. 나머지 P*들은 그럭저럭. 자바는 하락세... 뭔가 갈아탈 준비를 해야할 것 같은데... 보이질 않는다. PHP는 아니고... Ruby? 기타가 8.8%밖에 안된다는 것은 몇몇 인기있는 언어에 편중이 심하다는 사실을 확인시켜준다.

AJAX 개발에서 가장 큰 고려 사항(골칫거리)
  • Cross-browser rendering 60.4%
  • Runtime performance 48.7%
  • Testing/debugging 45.0%
  • Security 35.8%
  • Interaction design/user experience issues 34.1%
  • Finding the right framework/development tools 30.2%
  • Scalability 23.1%
  • SEO implications 21.6%
  • User acceptance 18.5%
  • Using JavaScript 15.6%
  • Developing for a mobile platform 10.3%
  • Proving ROI of Ajax functionality 9.9%
  • Web analytics implications 9.6%
  • Other 7.4%
흠... 역시나 예상했던 결과다.
크로스브라우져는 언제나 웹개발자들의 골칫거리였다. AJAX에 와선 더욱 골치아파졌다.
AJAX가 보조적인 기술로 사용될 때는 성능이 별 문제가 되지 않았지만, 페이지 전체를 AJAX로 만드는(웹어플리케이션을 한두페이지로 만드는) 상황에서는 꽤 골치아픈 문제가 되고 있다.
테스팅/디버깅은 이제 거의 나름대로 방법론이 확보된것 같다.
보안은 말만들기 좋아하는 사람들의 문제일 뿐.... AJAX라고 해서 크게 더 위험해진 것이 있나? 주목할만한 것은 그 다음 항목이다. 새로운 기술에 맞는 UI/UX!! 기획자도 모르고 개발자도 모른다. 어디까지 할 수 있는지.. 또 어디까지 해야 하는지... 데스크탑을 따라하는 것도 이상하고(야후메일의 악몽?) 그렇다고 기존 웹을 답습하자니 AJAX스럽지가 않고...
프레임웍/개발툴의 문제는 많이 좋아졌고, 또 좋아지고 있다. CS 개발 초창기에도 그랬고, 웹 개발 초창기에도 그랬다. 시간이 해결해준다.
확장성은 뭐... 뾰족한 수가 없다. 기존 CS와 웹의 중간 정도?  서블릿이 자랑하던 멀티쓰레드가 AJAX시대에와서는 보틀넥이 되어 버렸다.
SEO는... 글쎄... 검색은 애초에 컨텐츠를 대상으로 하는 것이고, AJAX를 웹을 컨텐츠가 아닌 어플리케이션 플랫폼으로 사용하는 기술이다. 궁합이 잘 맞을리가 없다.
자바스크립트가 문제라고? 자바스크립트는 죄가 없다. 브라우져가 문제일 뿐.
요즘에는 풀브라우징되는 모바일 장치들이 늘면서 모바일이라고 해봐야 해상도 낮고 입력장치가 부실한 웹브라우져가 하나 더 추가됐을 뿐이다. 굳이 비유를 하자면 지원 대상에서 IE가 빠지고 Opera가 들어간다는 정도?
수지타산이 제일 골치라는 사람이 9.9%밖에 없다는 건... 이 설문에 응한 사람이 주로 개발자라는 뜻이다.

흠... 많이 떠들었네...

늘 그랬듯이... 결론 없어=3=3=33

Posted by iolo
TAG Ajax
hacking/web2007/09/22 17:06
크리에이티브 커먼즈 라이선스
Creative Commons License
출처: http://blogs.zdnet.com/Stewart/?p=540

같은 그래프지만, 이해는 (AJAX 개발자인)내 맘대로~

일단 RIA쪽에서 잘 나갈 것 같은 녀석들의 구인 기록을 분석해보자:
사용자 삽입 이미지

FLEX vs Silverlight vs JavaFX vs OpenLaszlo


역시나, 예상대로 FLEX의 압승! OpenLaszlo는 FLEX덕분에 반사이익을 좀 보는 것 같고... JavaFX는 뭐야? 그런게 있기나 한거야?
Silverlight가 너무 쳐지는 것 같아서 WPF도 추가해 봤는데:
사용자 삽입 이미지

+ vs WPF


어랏?! 이게 뭐야~ 거의 FLEX랑 막상막하네. Silverlight랑 합치면... -.-;;; 역전~
호기심으로 AJAX도 추가해 봤다:
사용자 삽입 이미지

+ vs AJAX


헉!! @..@
뭐가 잘못된 거야? 원래 그런거야? 게임이 안되자나! 그럼 플래시는 어떨까:
사용자 삽입 이미지

+ vs 플래시


흠냐-.-;;; 이게 뭔 시츄에이숀-.-;;; 차분히 정리해보면 아직은 플래시를 많이 쓰고(플래시와 FLEX의  일을 정확히 구분하지 못하는???)있지만, AJAX 쪽이 대세라는?

그렇다면 RIA용 프로그래밍 언어들은 어떨까?
사용자 삽입 이미지

ActiveScript vs C# vs JavaScript


C#과 JavaScript가 같은 패턴으로 오르내리는 것이 흥미롭다.
플래시는 구인이 많은데 비해서 ActionScript가 적은 것은 FLEX개발자를 원하면서(ECMAScript/JavaScript) 플래시라고 구인 공고를 냈다는?? (위에서 세운 가정이 맞았군~)

마지막으로 이들의 연봉 수준을 비교해 보았다:
사용자 삽입 이미지

RIA 관련 기술 연봉 비교


위의 그래프들과 상관없이... 고르게 나왔는데, 상대적으로 오래된(그래서 사람 구하기가 쉬운) 플래시가 조금 낮다.

결론은 AJAX 개발자 여러분들~ 아자 아자 AJA AJA 힘내자~

'hacking > web' 카테고리의 다른 글

2007 Ajaxian.com Reader Survey 결과  (0) 2007/10/15
DOMContentLoaded revisited  (0) 2007/09/27
RIA 전성 시대? AJAX 독주 체제!  (2) 2007/09/22
dojo 1.0을 위한 grid 위젯은 TurboGrid  (0) 2007/09/17
SVG for All  (2) 2007/09/14
When innerHTML isn't Fast Enough  (0) 2007/09/14
Posted by iolo
TAG Ajax, ria, 연봉
hacking/web2007/09/17 16:27
크리에이티브 커먼즈 라이선스
Creative Commons License
http://sitepen.com/pressReleases.php?item=20070917

dojo 0.9에서 가장 황당한 이슈 중의 하나가... grid위젯(dojo 0.4의 SortableTable/FilteringTable의 대체품)이 없다는 것이었는데...

결국, 모질라 재단, SitePen, Nexaweb, Redfin, SnapLogin 등이 공동으로 TurboAjax의 Grid를 사들여서 dojo 재단에 기증하기로 했다는 소식.

TurboAjax는 dojo초창기부터 잘 다듬어서 상용으로 팔아먹던 회사였는데... 버틴 보람이 있군.

대충 훑어보면:
  • General Features
    • Browser support matching Dojo 1.0: IE6/7, Firefox 2/3, and Safari 3 on Windows, Safari 3 and Firefox 2/3 on Mac, and Firefox 2/3 on Linux. Opera support will follow.
    • Subgrids, nested grids, and tree grids
    • In-place editing
    • Context menus and tooltips specific to a particular row or column
    • Data sorting through sort functions or custom sort filter functions
    • Cell formatters for separation of data from layout
    • Documentation and unit tests
  • Dijit Features
    • Standard Dijit with markup and declarative instantiation
    • Data binding between data columns and grid columns, and dojo.data provider support
    • il8n and a11y
    • Grid events for easy manipulation and event handling for event-driven application development
    • Keyboard support, including cell selection
    • Theme infrastructure with structured CSS in dijit.css and tundra.css
  • Rows, Columns, formatting, and more
    • Virtual scrolling: 100,000+ rows without performance lags
    • User sizable columns
    • Complex rows of various widths and heights, just like HTML tables
    • Cells, rows, and columns may be patterned based on pattern or state
    • Fixed position columns
    • Column dimensions specified in a variety of CSS units, not just pixels
    • dojo.connect calls to selectively show/hide portions of rows
    • Optional auto-sizing to fill content or a container node
    • Auto-adjust dimensions in response to user-controlled font-size adjustments
    • Variable row height
    • Selection by row and multirows
    • Column layout may be changed on the fly by users and code
    • Resizing of the grid on the fly by users and code
좋은 얘기만 가득 @..@

10월 말 정도에 볼 수 있을꺼라고 하니... 기대만땅~

알렉스의 말빨이 무섭긴 무섭다. 열라 툴툴거리니까 옆에서 돈으로 해결해 주는 군-.-;

'hacking > web' 카테고리의 다른 글

DOMContentLoaded revisited  (0) 2007/09/27
RIA 전성 시대? AJAX 독주 체제!  (2) 2007/09/22
dojo 1.0을 위한 grid 위젯은 TurboGrid  (0) 2007/09/17
SVG for All  (2) 2007/09/14
When innerHTML isn't Fast Enough  (0) 2007/09/14
bloglines 3.0beta  (0) 2007/09/07
Posted by iolo
TAG Ajax, Dojo, GRID
hacking/web2006/11/07 23:18
크리에이티브 커먼즈 라이선스
Creative Commons License
웹에서 개발 좀 해봤다는 사람들이라면 히든 프레임 삽질은 다 알고 있을 것이다.

오늘 좀 더 삽스러운 것을 보았다.

간단히 요약하면, html쪽에 이런게 있다:
  1. document.write("<script src='test.php'></script>");
  2.  
  3. var result = 0;
  4. for (var i = 0; i < values.length; i++) {
  5.     result = result + values[i];
  6. }
  7.  
  8. alert(result);

문제는 test.php다:
  1. <?php
  2. echo("var values = [ 1, 2, 3, 4, 5 ];");
  3. ?>

-.-;;;;

'hacking > web' 카테고리의 다른 글

CSS의 진화 - 방탄웹 맛보기  (0) 2006/11/28
DWR과 IE와 TBODY와 innerHTML과 협공  (1) 2006/11/14
AJAX이전에 AJAX가 있었으니...  (0) 2006/11/07
slideshare.net  (0) 2006/11/07
Google has accquired JotSpot  (0) 2006/11/03
IE6 vs IE7 vs FF1.5 vs FF2  (0) 2006/11/01
Posted by iolo