본문 바로가기

프로그래밍 세상/폰갭 이야기

cordova-1.9.0.js 파악하기 (1) - iOS

Phonegap은 Web App 의 한계를 개선하여, 

각 장비의 기능을 사용할 수 있는 App 의 장점을 활용 할 수 있는 하이브리드 앱 개발 프레임워크이다.

Phonegap 에 대한 설명 및 동작원리는 검색 사이트에서 찾아보는 걸로... 


Phonegap은 Android, iOS, BlackBerry, Window Mobile 에 대해서 지원하고 있으며, 

WebView와 App 간의 정보 공유를 할 수 있다.

Phonegap은 Javascript와 각 OS별 Source 로 구성되어 있으며, 

먼저 Javascript 파일인 cordova-1.9.0.js 에 대해서 공부하도록 하겠다.

 

Cordova for iOS - 기본 내용

Cordova js 의 경우 Javascript 의 클래스, 클로져, 모듈 패턴 등을 사용해서 작성되었다.

객체 지향 언어인 Java, C# 에서 보았던 객체 지향적 프로그래밍을 Javascript 에 비슷하게 구현하였으며,

모듈패턴을 이용해서 private, public 을 비슷하게 구현하여, 작성되었습니다.

 

;(function() {

// file: lib/scripts/require.js
var require,
    define;

(function () {
    var modules = {};

    function build(module) {
        var factory = module.factory;
        module.exports = {};
        delete module.factory;
        factory(require, module.exports, module);
        return module.exports;
    }

    require = function (id) {
        if (!modules[id]) {
            throw "module " + id + " not found";
        }
        return modules[id].factory ? build(modules[id]) : modules[id].exports;
    };

    define = function (id, factory) {
        if (modules[id]) {
            throw "module " + id + " already defined";
        }

        modules[id] = {
            id: id,
            factory: factory
        };
    };

    define.remove = function (id) {
        delete modules[id];
    };

})();

//Export for use in node
if (typeof module === "object" && typeof require === "function") {
    module.exports.require = require;
    module.exports.define = define;
}


Line 1 : 클러져(Scope에 제약을 받지 않는 변수들을 포함하고 있는 코드 블럭) 로 작성되었으며, 

              js 로딩시 실행되도록 작성되어 있다.

Line 4, 5 : require, define 은 cordova 내부 private 전역객체로 설정, 내부 함수에 의해서 정의된다.

Line 8 : modules 는 private 객체

Line 10 : build 함수는 require 에서 호출되며, 파라메터로 전달받은 함수를 이용한다.

 

function build(module) {
        // 전달받은 module 객체의 factory 함수를 factory 지역변수와 연결한다.
        // 값이 아닌 주소 전달이므로
        var factory = module.factory;
        // module의 exports 빈 객체를 생성한다.
        module.exports = {};
        // 메모리 절약을 위해 module의 factory 는 삭제한다. 
        // module.factory 와 function 의 연결고리를 끊는것이지,
        // function 을 삭제하는 것이 아니다.
        delete module.factory;
        // 위에서 module.factory 함수와 지역변수 factory 를 연결하였으므로
        // module에서 factory 를 삭제하였더라도 
        // 지역변수 factory 는 사용할 수 있다.
        // require, module 을 이용해서 module.exports 에 객체를 저장한다.
        // factory 함수는 module.exports 에 해당 내용을 저장한다.
        factory(require, module.exports, module);
        // factory 함수에서 저장한 module.exports를 리턴한다.
       // 만약 module.exports 가 생성되지 않을 경우 오류가 발생하므로
       // 위에 module.exports = {}; 를 통해서 오류를 방지한다.
        return module.exports;
    }


Line 18 : 전달받은 id 와 같은 id를 가진 modules 의 factory 함수가 존재할 경우 build 혹은 exports 객체 리턴

             단, modules에서 전달받은 id 와 같은 id 가 없는 경우 오류 발생           

Line 25 : modules 에 전달받은 id 와 factory 함수를 저장한다.

             단, 전달받은 id 와 같은 id를 가진 modules 가 있는 경우 오류 발생

Line 36 : 전달받은 id와 같은 id 를 가진 modules 내부 객체를 삭제

Line 43 : 전역객체인 module 이 존재하고, require 가 함수인 경우 module 객체에 해당 내용 저장

             단, module 이 전역객체가 아니므로 실행되지 않음 ( 보통 module 은 파라메터로 전달된다. )


지금까지 가장 기본이 되는 define, require 객체에 대해서 살펴보았다.

5000줄 이후 소스를 제외하곤 define 으로 객체를 생성하는 것을 볼 수 있다.

define 내부에 require 를 사용하고 있으며, 5202 줄에서는 window.cordova = require('cordova') 를 함으로써 

Phonegap 기능을 window 객체에 할당하여, 사용할 수 있다.


cordova js 는 Javascript 코드를 모듈화 할 수 있고, 비동기로 관리하면서 여러파일을 병렬로 다운로드 할 수 있게

도와주는 RequireJS 와 비슷한 형태로 개발되어 진 것 같다.

소스 내부 주석을 보면 // file: lib/scripts/require.js 등으로 되어 있는데, 

여러 파일로 나눌 경우 스크립트 파일이 필요할 때만 병렬로 로딩되기 때문에 페이지 속도가 빨라지는 효과를 줄 수 있다.

하지만, 무조건 사용되는 경우는 하나의 파일로 만들어서 네트웍 전송을 하는 것이 올바른 방법일 것이다.


다음 포스팅은 define 부터 간단히 살펴보도록 하겠다.