User 가 Page 요청을 할 때
web browser 에 URL 을 쳐넣으면, browser 는 server 에게 해당하는 url 을 요청하게 된다.(request) 그러면 해당하는 page를 server 가 response 해준다. 서버에게서 받은 이 page 를 browser가 읽어서 page 내에 있는 javascript 를 요청하는 부분에서 javascript 를 요청하게 되는데, 이 javascript 가 bootstrap javascript 이다.보통 아래와 같은 형식으로 request 를 하게 되는데, nocache.js 를 요청한다.
<script language="javascript" src="com.manning.gwtia.ch02.HelloWorld/com.manning.gwtia.ch02.HelloWorld.nocache.js"></script>
그러면 server 는 nocache.js 를 browser 에게 주게 된다. 이 nocache.js 는 bootstrap file 이라고 불린다.
여기서는 이 nocache.js 에 대해서 알아보자.
이 nocache.js 파일은 GWT compiler 에 의해 만들어지게 된다. 이밖에도 GWT compiler 에 의해 만들어지는 파일이 있는데, 자세한 내용은 아래 링크를 참고하도록 하자.
대략적인 Bootstrap Procedure
nocache.js 를 자세히 설명하기 전에 GWT application 의 전체적인 bootstrap procedure 를 이해하면 좋다.
- browser는 host HTML page 를 load 하고, 수행한다.(process)
- browser 가 <script src=" ....nocache.js"> 부분을 만나면, browser 는 바로 script 를 download 하고 실행하게 된다. .nocache.js 파일은 Deferred Binding(아래 참조) 설정들을 수행하는(resolve) JavaScript 파일을 포함한다.
- 다음으로, 만들어져 있는 여러 .cache.html중 하나를 선택하기 위해 GWT compiler 에 의해 만들어진 lookup table 을 사용한다.
- 그 후, .nocache.js 에 있는 JavaScript 코드는 감춰진 <iframe> tag 를 만들고, host page 의 DOM 에 추가(insert)하고, .cache.html 파일을 이 iframe 으로 load 한다.
- .cache.html 파일은 GWT application 의 실질적인 프로그램 로직을 가지고 있다.
좀 더 자세한 Bootstrap procedure 는 Developer Guide example 를 참고하자.
Deferred Binding (지연된 binding)
지연된 binding 은 말 그대로, binding 이 뒤늦게 되는 것을 이야기 한다. 여기서 무엇에 대한 binding 인가 하면, browser 와 그 browser 에 해당하는 파일에 대한 binding 이라고 이해하면 될 듯 하다.
GWT compiler 의 특징중에 하나인데, 여러 버전의 코드가 compile time 에 만들어지게 되는 것을 이야기 한다.
실행시간에 bootstrapping 동안에 특정 client 에 의해서는 그중에 단 하나만 load 되면 된다.
각 버전은 application 이 정의하고 사용하는 다른 축(axis)과 함께, 브라우저 기반마다(per browser basis) 하나씩 만들어지게 된다.
예를 들면, application 을 GWT의 Internationalization module 을 사용해서 국제화(internationalize) 를 하려고 한다면, GWT compiler 는 "영어 firefox", "프랑스어 firefox", "영어 인터넷 익스플로어" 등, 다양한 브라우저 환경마다 다양한 버전의 application을 만들게 될 것이다.
결과적으로, 특정 브라우저에서 필요한 코드와 리소스(resources) 들만을 포함하고 있기 때문에, 배포된 Javascript 코드는 손으로 작성한 javascript 보다 간결하고 빠르게 다운로드될 수 있다.
.nocache.js
이 .nocache file 에서 Deferred Binding 이 일어난다. application 이 실행되기 전에 dynamically-bound code 가 결정되어야 한다. 이 code 는 browser 와 관련된 class 들의 버전들, user 가 선택한 언어와 관련된 문자열들 등을 포함한다.
java 에서는 이것은 간단히 특정 interface 를 구현한 알맞은 service-provider class 를 loading 하는 것으로 처리된다.
그러나, GWT 는, 성능(performance) 를 최대화하고, download size 를 최소화하기 위해, nocache file 안에서 맨 앞줄에 이 선택을 수행한다.
.nocache.html 이라는 이름이 붙은 이유는 이 파일은 cached 되면 안되기 때문이다. 이 녀석은 반드시 브라우저가 GWT application 을 실행할 때마다 다운로드받아서 다시 수행해야만 한다.
cache 되지 말아야 하는 이유
다시 다운로드를 받아야만 하는 이유는 GWT compiler 가 다시 만들어 낼 때마다 같은 이름으로 만들어내기 때문이다.
file 을 browser 가 cache 하게 되면, GWT application 의 새로운 버전이 만들어져서 server 에 배포되었다 해도 새로운 버전의 file 을 다운로드 받지 않을 것이다.
이 caching 을 막기 위해서 gwt.js 에 있는 코드가 실질적으로 unique 한 timestamp 를 HTTP GET parameter 를 file 이름 끝에 붙인다.(append)
browser 는 이것을 dynamic HTTP request 로 해석한다. 그래서 file 을 cache 로 부터 load 하지 않게 된다.
Reference
- What's with all the cache/nocache stuff and weird filenames?, gwtproject.org
댓글 없음:
댓글 쓰기