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


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

마지막으로 새로운 관리자화면을 개발 및 테스트 하느냐고 불철주야 고생한 모든 분들에게 박수를 보내는 바이다.
저작자 표시 비영리 변경 금지
Posted by horious
Develope/ExtJS2008/07/02 00:24
오늘자 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 horious
Develope/ExtJS2008/06/09 13:47
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 horious
Develope/ExtJS2007/12/12 19:32

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 horious