티스토리 관리자 화면이 변경되었다. 메뉴 구성 자체는 이전 관리와 유사하나 세세한 UI 가 많이 변경되었고, 브라우저 호환성이 상당히 개선되었다.
어떤 자바스크립트 라이브러리를 사용하였을까? 자체 제작이라면 상당한 수준이라 생각되었다. 사용된 소스를 살짝 보니.. prototypejs 도 아닌 JQuery도 아닌 ExtJS 아닌가..
ExtJS 로 구현한 수많은 사이트를 돌아다녔지만 이정도로 많은 걷모양을 수정한 사례는 보지 못했었다. 물론 core 만 사용한다면 걷모양과는 관계가 없겠지만 티스토리의 경우 위젯까지 사용하고 있다.
관심을 가지고 자세히 살펴보니 단순히 테마만 변경한 것이 아니고, 위젯중 많은 부분을 수정, 확장하여 사용하여 Grid, Tree, Tab 은 물론 각종 Form Element 까지 완전히 다른 모습으로 탈바꿈 해 놓았다.
이정도면 ExtJS 공식 블로그에 적용사례로 소개되어도 될 듯 싶다.


ExtJS 는 사실 좀 무겁다. 용량도 큰 편이고 수많은 엘리먼트를 동적으로 조작하다 보니 실행속도도 느린편이다. 당연히 어느정도 클라이언트 환경을 특정할 수 있는 인트라넷 기반 RIA 제작에나 적당하다고 생각했는다. 티스토리 개발팀은 불특정 다수가 사용하는 대중적인 사이트에 과감히 적용해냈다.
다른면으론 이것은 또한 ExtJS 가 대형 포탈에 적용할 만큼 충분히 안정화 되었다는 것을 의미하기도 한다.

마지막으로 새로운 관리자화면을 개발 및 테스트 하느냐고 불철주야 고생한 모든 분들에게 박수를 보내는 바이다.
저작자 표시 비영리 변경 금지
Posted by 호리우스

트랙백 주소 :: http://horious.net/trackback/29

댓글을 달아 주세요

구글 크롬 (Google Chrome)
드디어 구글 크롬 베타버전이 출시되었다. FF3 쓰는 재미에 한참 빠져든 나에게 새로운 즐거움이 또 하나 늘어나는 구나. 사용자 입장에서 성능 좋은 공짜 브라우저가 자꾸만 늘어가는 것은 반가운 일이 아닐 수 없다!!

웹애플리케이션 바로가기 만들기??
여러가지 기능들을 테스트 하던 중 크롬의 재미있는 기능을 발견하였다. 이름하여 웹애플리케이션 바로가기
사실 이 기능은 FF3에도 부가기능 Prism for Firefox (이하 Prism)를 통해 똑같이 구현할 수 있다. 다만 구글 크롬에서는 그 기능을 직접 내장한 것이 특징이다. 그 밖에도 몇몇 차이점이 있는데 차차 소개하도록 하겠다.
그럼 Prism 혹은 웹애플리케이션 바로가기 만들기 기능은 무엇인가? 한번 써보면 금방 알겠지만 웹애플리케이션을 마치 데스크탑 애플리케이션 인냥 그동할 수 있게 해준다. 바탕화면이나 빠른실행줄에 바로가기를 만들 어 줄 뿐만 아니라 브라우저에 당연히 붙어있는 주소검색, 탭, 가타 패널등을 없애서 윈도우에 바로 웹애플리케이션을 띄어준다.

애플리케이션인가? 웹사이트인가?

위 스크린샷을 보면 알겠지만 주소창과 몇몇 패널들이 사라진 것 만으로도 충분히 데스크탑 애플리케이션 스러운 효과를 줄 수 있다. (ExtJS 를 사용하여 구현중인 웹애플리케이션이다.)

뭐가 좋은데?
별거 아닌 것 같은 기능이지만 바탕화면 바로가기 클릭만으로 해당 웹애플리케이션을 로딩 할 수 있고, Prism 같은 경우에는 전용 캐쉬에 웹 리소스들을 보관함으로 네트웍 비용이 대폭 절감된다. (다만 원하지 않는 캐쉬가 남아있어 갱신되지 않는 경우도 있긴 한다.) 브라우저 인터페이스도 전용 데스크탑 애플리케이션을 돌리는 기분뿐만 아니라 공간도 효율 적으로 쓸 수 있다.

FF3 Prism과 Chrome 의 미묘한 차이
지금까지 발견한 말하기도 애매한 미묘한 차이점을 살펴보면
  1. 아이콘을 만들 때 FF3 는 원본 favicon.icon 을 쓰지만 크롬은 다운사이징한 아이콘을 쓴다. 따라서 크롬은 큰 아이콘으로 봤을 때 깨진다.
  2. FF3 가 Chrome 보다 캐쉬를 보다 적극적으로 활용하는 듯 하다. 웹페이지가 갱신되어도 FF3 의 Prism 은 간혹 반영하지 못하는 현상이 생긴다. (사실 버그인지, 서버 캐쉬 설정 문제인지 정확하게 확인하지 못했다.)
  3. 애플리케이션을 생성할때 FF3 의 Prism 은 applcation name을 영어로밖에 지정하지 못하여 단축아이콘이 영어로 생성되지만 크롬의 바로가기 만들기는 index page 의 title 을 단축아이콘 명으로 지정해 버린다.

그렇지만 결국 웹페이지 바로가기일 뿐
그러나 Prisim 이나 웹애플리케이션 바로가기 만들기나 생김새만 데스크탑 애플리케이션 일뿐 사실 인터넷이 되지 않는다면 아무것도 할 수 없다. 단지 주소줄이 없는 브라우저에 사용자가 설정한 웹사이트를 로딩해 주는 역할만 하는 그야말로 바로가기 이기 때문이다.

진정한 데스크탑 애플리케이션
그렇다면 대안이 되는 기술이 있는가? 그렇다 바로 Adobe Air 다.
Air는 서버상의 리소스를 아예 패키징 하여 클라이언트로 다운로드 하여 Air 에 내장된 브라우저로 웹리소스를 보여준다. 게다가 Air에서 제공하는 각종 라이브러리를 통해 native window, sound, file system, local database 등의 제어도 가능하니 그야말로 html로 만드는 데스크탑 애플리케이션이 되겠다. 다만 flex 나 flash 로 Air를 만드는 것에 비해 제약이 좀 많은 편이다.
쓰다보니 Air 얘기까지 흘러와 버렸다. ㅋㅋ

그밖의 이야기
구글 크롬은 ExtJS와 궁합이 환상이다. 몇몇 무거운 위젯의 렌더링 타임이 IE 와 비교했을 때 엄청 빠르고 FF3 보다 다소 빠르다. 애플의 사파리, 구글의 크롬, 어도비의 에어 모두 Webkit 엔진을 사용했는데 사실 Javascript 엔진이 ExtJS 성능과는 더 밀접한 관련이 있지 않나 싶다. 그런면에서 크롬은 Javascript Virtual Machine V8 이라는 놈을 내장했다고 하는데 이놈이 발군의 실력을 발휘하는 것인가?? 곧 조만간 성능 비교한 자료가 국내외에서 포스팅 될 터인데 빨리 보고 싶다.

저작자 표시 비영리 변경 금지
Posted by 호리우스

트랙백 주소 :: http://horious.net/trackback/26

댓글을 달아 주세요

  1. dudtn 2008/09/04 10:01  댓글주소  수정/삭제  댓글쓰기

    예전에 어디서 듣기로는 Google Gears가 오프라인에서도 작동하는 웹어플을 생성해주는 것으로 들은 것 같은데 그건 아닌것 같더군요,,,

    크롬을 깔아놓고 웹어플 바로가기 키를 만들고 오프라인상에서 클릭해보니,,, 페이지를 못찾는다고 나오더군요 +_+ 혹시나 해서 firefox에 google gears add-on을 설치하고 prism으로 만든 웹어플 시도를 해봤지만 역시 마찮가지구요(프리즘으로 만든 웹어플에는 부가기능이 작동안한다는 것을 깜빡+_+),,, ,,,

    오프라인상에서 웹어플이가능하게 해주는 건 언제쯤 나올까요 +_+

    air... 예전에 미투데이 open api 포스팅에서 한 번 써보긴 했는데,,, 이걸로 구글 app들을 사용할수 있을까요??? 정확하게 어떤건지 잘 몰라서.... ...

    extjs가 정확하게 먼지 모르겠는데 저도 어디서 들어본듯한... 제 블로그 테마가 ext js theme 더군요 ㅋㅋㅋㅋ

    포스팅에 나오는 용어들이 다들 한 번씩 들어봤는데 다 따로따로노는 듯한 느낌이네요 ㅋ

    하여간 글 잘 읽고 갑니다.^ㅡ^,,,,

    오프라인 어플로 가능하게 하는 것 좀 나왔으면 좋겠어요 +_+

    • 호리우스 2008/09/05 07:47  댓글주소  수정/삭제

      안녕하세요 댓글 감사합니다.
      사실 동적으로 페이지들을 생성해 내는 이른바 웹 애플리케이션 에서는 사실상 오프라인 에서 구동하는 것이 아무 의미가 없을지 모릅니다. 그렇지만 개발시에 오프라인 구동을 염두하고 Adobe Air 나 말씀해 주신 Google Gears 와 같은 플랫폼을 사용하여 개발한다면 불가능 한 것은 아닙니다.
      예를들어..
      오프라인 일 때에는 자체 저장소를 쓰다고 온라인일 시에 서버와 동기화를 하여 서버의 저장소를 쓴다던가 하는 행위가 가능해 지는 겁니다.
      제가 알기로는 Google gears 개발자 지원 사이트에 위 상황에 해당하는 여러가지 예제가 있는 것으로 알고 있습니다. 그리고 ExtJS 사이트에 가시면 간단한 일정관리 프로그램을 Google Gears + ExtJS 로 구현한 버젼과 Adobe Air + ExtJS 로 구현한 버젼 모두 있습니다. 관심 있으시면 한번 살펴 보세요.

오늘자 ExtJs 공식 블로그에 Intergrating Google Maps API With ExtJS 라는 글이 포스팅 되었다.

ExtJS 의 Panel 을 확장해서 만든 GMapPanel 을 이용한 샘플이 공개 되었는데 Google Maps API를 이용했다.
재미있는것은 Google 의 StreetView 도 Panel 를 확장해서 구현했단는 것.

사용자 삽입 이미지

지난달 초에 ExtJS 의 Web Desktop 샘플코드를 이용해서 NaverMap API 를 적용한 코드를 작성한 바 있는데 이를 소개할까 한다.

데모보기
사용자 삽입 이미지


Source Code (일부)
MyDesktop.MapWindow = Ext.extend(Ext.app.Module, {
id: 'map-win',
init: function(){
this.launcher = {
text: 'Where we are ?',
iconCls: 'icon-map',
handler: this.createWindow,
scope: this
}
},
createWindow: function(){
var desktop = this.app.getDesktop();
var win = desktop.getWindow('map-win');
var mapObj = null;
function centerMap(){
if (mapObj != null) {
mapObj.setCenterAndZoom(new NPoint(316350, 550250), 2);
}
}
if (!win) {
win = desktop.createWindow({
id: 'map-win',
title: 'Where we are?',
width: 740,
height: 480,
minHeight: 400,
minWidth: 500,
iconCls: 'icon-map',
shim: false,
animCollapse: false,
constrainHeader: true,
layout: 'fit',
tbar: ['서울특별시 성동구 성수1가2동 리버하우스', '->',
{
xtype: 'button',
iconCls: 'map-init',
text: '초기화',
handler: centerMap,
scope: this
}],
listeners: {
beforeshow: function(){
if (mapObj == null) { //최초 생성
mapObj = new NMap(this.body.dom);
mapObj.enableWheelZoom();
centerMap();
var zoom = new NZoomControl();
if (Ext.isIE6) {
var cm = new NMark(
new NPoint(316325, 550245),
new NIcon('images/here.gif',
new NSize(68, 50),
new NSize(34, 48)
)

)
} else {
var cm = new NMark(
new NPoint(316325, 550245),
new NIcon(
'images/here.png',
new NSize(68, 50),
new NSize(34, 48)
)

)
}
NEvent.addListener(cm, 'click', function(){
var w = new Ext.Window({
animateTarget: win.getEl(),
modal: true,
iconCls: 'icon-map',
title: '리버하우스 B동 207호',
html: '<img src="images/riverhouse.jpg">',
width: 360,
autoHeight: true,
resizable: false,
stateful: false
});
w.show();
});

cm.show();
zoom.setAlign("right");
zoom.setValign("top");
mapObj.addControl(zoom);
mapObj.addOverlay(cm);

} else { //생성된 적이 있다면!!
if (this.animateTarget == null) { //Close 상태
this.taskButton = desktop.taskbar.addTaskButton(this);
centerMap();
}
this.animateTarget = this.taskButton.el;
}

},
beforeclose: function(){
this.backupTarget = this.animateTarget;
this.animateTarget = null;
this.fireEvent('close', this); //taskButton remove
this.hide();
return false;
},
bodyresize: function(){
if (this.rendered && mapObj != null) {
mapObj.resize();
}
},
scope: win
}
});
}
win.show();
}
});

Web Desktop 의 작동방식은 바탕화면의 아이콘이나 시작버튼의 메뉴를 클릭하게 되면 Window 를 생성해서 화면에 보여주게 되는데 이때의 Window 는 별도의 객체에 의해서 생성된다. App 라는 Class 인데 Factory 이자 Status 를 관리하는 Manager 역할도 한다.
NaverMap과 연동하기 위한 코드는 코드상의 볼드 처리된 부분이며 주의할 점은

1. NaverMap API 는 한번만 초기화 되어야 한다.
Web Desktop 은 생성된 Window가 Close 될때 Destroy 하게 설계가 되어있다. 하지만 NaverMap 은 별도로 destroy를 할 수 있는 방법을 제공하지 않는다.
  1. NMap 을 전역으로 사용하던가
  2. mapWindow 의 멤버로 이용하려면 close 할때 window 를 destroy 하지 말고 hide 하는 방식을 취해야 한다.
상단의 코드는 후자의 방식을 택하고 있고, 파란색 beforeclose 리스너에서 hide 를 호출하고 Desktop App Manager 에서는 윈도우가 닫힌 것으로 인식하게 끔 close 이벤트를 발생시키고 있다.

2. Window resize 를 고려해야 한다.
우선 NMap 을 생성할 때 사이즈에 관한 인자를 주지 않으면 자동으로 컨테이너 사이즈로 생성됨을 확인하였다.
Window resize 이벤트가 발생할 때 NMap 의 인스턴스의 resize() 를 호출하야 한다. (소스코드 보라색)

그러나
사실 Web Desktop 에서 급히 쓰기해서 NaverMap 과의 연동부분이 샘플코드에 인라인으로 코딩이 되었지만 ExtJS 공식블로그에서 소개한 바와 같이 Panel을 확장해서 새로운 클래스로 만드는 편이 재사용을 위해 100만배는 좋다.
Posted by 호리우스

트랙백 주소 :: http://horious.net/trackback/21

댓글을 달아 주세요

ExtJS 와 브라우저 한글 폰트의 관계

ExtJS 에 기본적으로 포함되어 있는 css 에는 한글 폰트를 고려하고 있지 않다.
기본 css 에는 Tahoma 가 주로 제1 서체로 지정되어 있는데 사용하는 크기는 대부분 12px과 11px 이다.

IE 의 경우 Tahoma 가 서체로 지정되어 있는경우 한글 서체는 굴림이 사용되는데 이때 문제가 발생한다.
한글의 경우 12px 이나 11px 이나 똑같은 크기로 표시 된다는 것!!!

만약 IE 로 이 포스팅을 보고 있다면 아래 두 라인에 한글부분은 차이가 없을 것이다.

font:normal 11px tahoma
Abcd 한글 123
font:normal 12px tahoma
Abcd 한글 123

그래서 발생하는 대표적인 문제는 Tab Panel 의 Tab 에 영문으로만 이루어진 탭과 한글 또는 한글영문 혼합으로 이루이진 탭이 공존하면 높낮이가 깨져 버린다.

사용자 삽입 이미지
자세히 보면 탭 아래 공간이 비어 있는것을 볼 수 있다. 탭을 선택 하더라도 깨져서 표현이 된다.

반면에 IE 를 제외한 ExtJS 호환 브라우져 에서는 굴림체를 11px로 표시함으로서 위와 같은 문제가 발생하지 않는다.

해결방법은??
11px 이 사용되는 부분의 폰트를 아래와 같이 굴림으로 명확히 지정해 주면 된다.

font:normal 11px gulim

또는 아래의 코드로 IE 의 탭 관련 css 를 재정의 한다.

.ext-ie .x-tab-strip span.x-tab-strip-text {    font: 11px Gulim, Tahoma;}
Posted by 호리우스

트랙백 주소 :: http://horious.net/trackback/12

  1. Subject: TabPanel 에서 한글 문제

    Tracked from memorize a day.. 2008/07/11 01:47  삭제

    ExtJS 로 탭 패널을 구성할 때 맘에 안드는 부분이 탭 부분에 한글이 있을 때 비활성 탭의 아랫부분이 살짝 뜨는 현상이다.Tahoma 의 한글 부분을 IE 에서 11px 의 굴림을 12px 로 출력해버리는 거다.아래의 한글부분이 IE에서는 같게 출력된다. font:normal 11px tahoma; - abc 가나다 123 font:normal 12px tahoma; - abc 가나다 123해결한다고 했던게..CSS 를 고치긴 했는데..탭 높이...

댓글을 달아 주세요

Extjs 자바스크립트 라이브러리를 접하게 된것은 약 3개월 전이다.
각종 현란한 사용자 UI Component 들을 잘 객제화 시켜놓아 (마치 Swing 처럼) html 을 전혀 사용하지 않고도 복잡한 UI 를 생성할 수 있을 뿐만 아니라 클라이언트와 서버가 주고받는 데이타도 라이브러리가 제공하는 각종 proxy 와 model class 를 통해 객체화 한 것이 특징이다.

당연히 IE 뿐만 아닌 다양한 브라우져에 대응하고 있으며, 그 모양이나 효과들도 수준급이라 클라이언트도 만족할 것으로 예상했다.

하지만 클라이언트의 반응은 극과 극이었다. 
웹상에서 마치 전용 어플리케이션을 사용하는 듯한 UI 에 대체적으로 만족하는 분위기 였지만, 웹 느낌이 나질 않는다며 (전형적으로 한국적인 웹을 말한다. 이미지로 된 버튼, 그리드의 페이징, 등등) 거부 반응을 나타낸 사람도 있다. 개인적으로는 마치 웹메일 오랬동안 쓰던 사람들이 아웃룩을 더 불편하다고 생각하는 것과 비슷하다고 생각한다.

프로그래머 관점에서 Extjs 는 어떨까?
1.1 버젼은 프로젝트에 적용하기엔 다소 문제가 있다는 것이 공통된 의견이다.

그 첫번째 이유로 많은 UI 컴포넌트들을 제공하고는 있으나 조금만 복잡해 지면 소스레벨에서 수정을 가해야 한다. 특히 Grid 같은 경우에는 Group 단위 표현이 불가능하고 집계 값을 처리하는 기능이 없다. 다행히 2.0 버젼에서는 이러한 기능을 제공하고 plugin 개념을 적용하여 이용자가 좀 더 쉽게 커스터마이징 할 수 있겠끔 변경되었다.

 
[Grid 예]

두번째로, Form 을 만들어 내기가 지나치게 복잡하다.
html을 코딩함에 있어 복잡한 폼을 만들어 내기위해서 <Table>의 사용은 필수였다.
하지만 Extjs 는 순수 label 과 Input element 를 이용한 폼만을 만들어 낼 수 있게끔 설계되어 많은 편법을 동원해야 복잡한 폼을 만들어 낼 수가 있다.
다이나믹하게 반응하는 폼이라도 만들어 내려면 폼 하나 코딩하는데 몇 시간씩 걸리곤 한다. 이것은 java의 swing 도 마찬가지 이나 visual form editor 같은 지원 툴이라도 있지 않은가? 물론 Extjs 도 시범단계 수준의 에디터들이 존재함을 확인하고 사용해 보았으나 사용불가!!! (손으로 일일이 코딩하거나 별도의 support 라이브러리를 구축하는 수 밖에 없다.) 2.0 에서는 좀더 다양한 폼 관련 컴포넌트를 제공하니 그나마 다행이다.
 


[Form 예]

세번째로 엄청난 메모리 사용율이다. 이것이야 RIA 의 공통된 문제지만, Extjs 도 피해갈 수 없는 문제이다.

그럼에도 불구하고 Extjs 가 가지고 있는 장점은 아래와 같다.

서버와 주고 받는 데이터들을 객체화 하여 다룰수 있다. 서버로 부터 전송받은 Json 문자열을 자동으로 decode 하여 record 들의 collection 으로  만들어 주고, 그 반대도 가능하다. 물론 이렇게 생생된 collection 은 form 이나 grid, combobox 등에 바인딩이 가능하다.

또한 각종 UI 들을 html 코딩없이 코드로 만으로 생생할 수 있다는 것도 장점이 되겠다. 게다가 품질도 양호하고, 각종 효과들도 지원한다.

Extjs 2.0 의 등장
Extjs 2.0은 우리가 프로젝트에서 1.1 버젼으로 고전하고 있을때 알파버젼이 공개된 상태였고, 프로젝트가 끝나는 시점에 final 버젼이 나왔다. ㅠㅠ
필요하다 싶은 컴포넌트들은 여지없이 2.0 에 속속 포함되는 것을 보고서는 사용자의 요구사항이 많이 반영되었다는 것을 느낄 수가 있었다!.
2.0 버젼의 API 문서또한 눈부시게 발전했다. 각 개체간의 관계와 구조 용도가 명확해 졌다. (1.1의 문서는 보기에는 그럴 듯 했으나 소스를 보지 않으면 도통 이해할 수 없었다.)
많은 리펙토링을 통해서 성능을 개선했고, 이 과정에서 대대적으로 구조가 개선되었기 때문에 기존 생성물을 1.1에서 2.0으로의 마이그레이션하기는 사실상 불가능 할 것으로 보인다.

Posted by 호리우스

트랙백 주소 :: http://horious.net/trackback/10

댓글을 달아 주세요

  1. illtal 2008/03/10 00:33  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 홈페이지에 덧글을 이제서야 보고 답글을 달았습니다.
    결론은 한국에서 사시면 됩니다. 자세한건 답글로 달아 놓았습니다.

    덕분에 extjs 잘보고 갑니다. RIA로써의 js는 적당히 써야지 과잉하면 안쓰는 것만 못하다는 생각이 듭니다. YUI와 몇몇 라이블러리를 쓰고 있는데, 차라리 Flash나 silver right로 만드는 게 더 나을지도 모르겠다는 생각이 들더군요.