Tuesday, September 20, 2011

Closure의 namespace 관리 : provide() , require()

JavaScript 에서 namespace를 만드는 방법

1) API 에 prefix 를 다는 방법
간단하지만 라이브러리가 복잡해지면 골치아픈 방법.

GM_log(), GM_getValue(), ..

2) 하나의 global object 를 정의하고 여기에 함수를 붙여가는 방법
체계적이고 충돌의 여지가 적다는 장점이 있지만, 매번 오브젝트를 뒤지므로 오버헤드가 있고, 타이핑이 길어지는 단점이 있음.

var goog={};
goog.array = {};
goog.array.binarySearch = function( ... );

Closure는 두번째 방식을 이용. closure compiler는 최적화를 하므로 오버헤드의 문제는 해결된다.

goog.provide(namespace) : namespace 정의

com.dopanysoft.Object 라는 오브젝트를 정의한다고 할때. goog.provide() 를 호출하면 여기서 정의된 오브젝트가 필요시 생성됨. 즉 Java에서의 패키지와 같은 개념으로 활용 가능. (자바처럼 디렉토리 구조가 일치해야 할 필요는 없음)

goog.provide("com.dopanysoft");
com.dopanysoft.Object = function() {...};

goog.require(namespace) : namespace 호출

myobject.js 라는 파일에서 goog.provide("com.dopanysoft")를 정의했다고 하면.
나중에 "com.dopanysoft" 를 어떻게 찾아야 할까? javascript 는 java와 달리 패키지 개념도 없고 말이지.
여기서 goog.addDependency()가 등장한다. (http://closure-library.googlecode.com/svn/docs/closure_goog_base.js.html 참고)

goog.addDependency() 는 goog.require() 에서 지정된 namespace를 담고 있는 javascript 파일의 경로를 지정해주고, 이렇게 지정된 javascript 파일들은 해당 goog.require() 가 호출된 script 의 뒷부분에서 <script>로 추가된다.
말이 좀 어려운데..
http://code.google.com/closure/library/docs/gettingstarted.html 에서 나온 예제를 예로 들자면, 다음과 같이 정의된 스크립트를

<script src="closure-library/closure/goog/base.js"></script>
<script>
  goog.require('goog.dom');
</script>
<script>
  var newHeader = goog.dom.createDom('h1');
</script>

이렇게 대치한다고 생각하면 될듯.

<script src="closure-library/closure/goog/base.js"></script>
<script src="closure-library/closure/goog/dom/dom.js"></script>
<script>
  var newHeader = goog.dom.createDom('h1');
</script>


closure api의 addDependency() 는 closure library에 포함되어 있는데,
"com.dopansoft" 와 같이 사용자가 만든 패키지의 namespace를 분석해서 addDependency()를 호출해주는 deps.js 코드 생성 툴이 바로 DepsWriter.

Tuesday, September 13, 2011

Closure 설치 및 설정

closure library , templates, compiler, inspector 다운로드 및 설치 방법 정리

mkdir ~/closure
cd ~/closure
svn co http://closure-library.googlecode.com/svn/trunk/ closure-library

cd ~/closure
svn co http://closuretemplates.googlecode.com/svn/trunk/ closure-templates
cd ~/closure/closure-templates
ant SoyToJsSrcCompiler
( result :  ~/closure/closure-templates/build/SoyToJsSrcCompiler.jar)

cd ~/closure
svn co http://closure-compiler.googlecode.com/svn/trunc/ closure-compiler
cd ~/closure/closure-compiler/
ant jar
( result : ~/closure/closure-compiler/build/compiler.jar )

http://code.google.com/closure/compiler/docs/inspector.html