기존의 무선인터넷 플랫폼은 VM 기술과 네이티브 바이너리 기술로 구별된다. 두 가지 기술은 상호배타적인 특성을 가지고 있다. 즉 한쪽 기술의 장점이 다른 기술의 단점이 되고, 한쪽 기술의 단점이 다른 기술의 장점이 되는 것이다.VM 기술은 말 그대로 가상 기계를 사용해 프로그램을 동작시키는 것이다. 작성된 프로그램을 소프트웨어 CPU에서 동작할 수 있는 중간 코드로 변환하면 가상 기계가 해당 코드를 실제 CPU용 기계어로 번역해 실행시키는 방식이다. 이러한 기술은 자바를 통해 일반화돼 있으며 자바 가상머신은 무선인터넷 플랫폼에도 이미 적용되어 있다. 국내에서는 SK텔레콤의 SK-VM, LGT의 자바 스테이션이 JVM을 탑재한 무선인터넷 플랫폼을 통해 서비스를 제공하고 있다. 또한 C 언어의 축소판인 Mini-C를 이용한 GVM 기술이 국내에서 개발돼 SK텔레콤을 통해 서비스되고 있다. 또 다른 기술인 네이티브 바이너리 기술은 일반적으로 우리가 프로그램을 작성하고 컴파일해 실행시키는 방법과 동일한 과정을 밟는다. 즉, 개발된 프로그램을 프로그램이 실행될 CPU에서 동작되는 기계어로 만들어 실행시키는 것이다. 이 기술을 이용한 무선인터넷 플랫폼이 퀄컴의 브루 플랫폼이다.VM 기반의 무선인터넷 플랫폼은 소프트웨어 CPU를 이용해 중간 코드를 실행 과정에 번역(Interpreting)하는 부담을 안고 있으며 이는 CPU 성능과 자원이 제한된 휴대전화기에서 사용자가 상대적으로 매우 느린 속도를 경험하게 된다. 그러나 VM 기술은 상대적인 시스템 안정성을 제공하며 완벽한 보안을 제공하는 장점을 가지고 있다. 반면 네이티브 바이너리를 이용하는 플랫폼은 VM 기술과 달리 탑재된 CPU의 성능을 100% 활용할 수 있으므로 VM에 비해 매우 빠른 실행속도를 제공한다. 그러나 지금의 네이티브 바이너리를 사용하는 기술은 개발언어로 C/C++를 사용하고 있어 프로그램 개발자에 의해 악의적인 메모리 접근 등을 통한 시스템 안정성을 위해할 수 있는 요소를 갖고 있다.WIPI 플랫폼은 이러한 대조되는 두 가지 기술의 장점을 갖는 플랫폼으로 계획되고 개발됐다. 즉, 자바 언어의 장점을 수용하며 네이티브 바이너리의 실행 성능을 갖도록 하는 것이다. 따라서 WIPI 플랫폼은 C/C++와 자바를 기본 언어로 채택해 프로그램 개발이 가능하고, 단말기에 탑재되는 애플리케이션은 네이티브 바이너리로 만들어져 실행 성능을 보장받는다. 여기서 C/C++ 언어는 네이티브 바이너리를 생성하는 데 아무런 문제가 없으나, 자바 언어는 기본적으로 가상 기계를 대상으로 하기 때문에 자바를 컴파일해 단말기에서 직접 실행가능한 실행 바이너리를 어디선가 만들어야 한다. 이러한 기능을 수행하는 WIPI 구성요소가 바로 COD(Compile On Demand)다.COD/AOTC란 무엇인가COD는 AOTC(Ahead Of Time Compile) 기술이 포함된 일종의 서비스 프레임워크를 표현하는 말이다. COD란 단어가 표현하고 있는 것을 대부분의 사람들은 ‘사용자 요구에 의한 프로그램 컴파일’이라고 생각한다. 즉, 사용자가 어떤 프로그램을 자기 단말기로 다운받기를 원하면 자바 프로그램은 시스템에 의해 컴파일되고, 해당 단말기에서 실행되는 바이너리로 생성되어 다운로드될 것이라는 것이다. 물론 이러한 시스템 구성도 가능하다. 이런 경우라면 동일한 종류의 단말기에 동일한 프로그램을 탑재시키기 위해 시스템에서 동일한 바이너리를 생성하기 위한 반복적인 작업으로 많은 자원을 낭비하는 결과를 초래할 것이다.하지만 ‘요구(Demand)’의 주체가 사용자가 아닌 ‘프로그램 개발자’ 또는 ‘시스템 관리자’라고 생각하면 어떨까. 이렇게 되면 프로그램 개발자는 COD 시스템에 자신이 개발한 프로그램을 제공하고 단말기에 탑재할 수 있는 실행 바이너리를 생성해 관리한다. 만일 사용자가 다운로드를 요구하면 이미 컴파일된 실행 바이너리를 선택해 다운로드하면 된다. 현재 COD 시스템은 후자와 같은 서비스 흐름을 갖는 시스템으로 구현되어 있다. 그러면 AOTC는 어떤 기술인가. 앞서 언급된 바와 같이 자바로 작성된 프로그램이 단말 환경에서 빠른 실행 속도를 보장받기 위해 가상 기계를 이용하지 않고 단말에서 직접 실행되는 바이너리 형태를 가져야 한다(이에 관련된 설명은 2-1부 WIPI 플랫폼 기사를 참조하기 바란다). 즉, 어디선가 자바 프로그램을 바이너리로 만들어야 한다. AOTC는 이러한 요구를 충족시킬 수 있는 자바 관련 기술이다. AOTC 기술은 현재 많이 연구되고 있으며 실행 자원이 풍부한 시스템을 대상으로 하는 제품은 일부 출시되어 있기도 하다. 그러나 이를 매우 취약한 단말 환경에 적합하게 개발한다는 것은 결코 쉬운 일은 아니다.COD 서비스 구조COD 시스템은 크게 두 가지 기능으로 구별할 수 있다. 첫째가 AOTC 부분이며 두 번째가 AOTC 결과물을 패키징하고 관리하며 단말기에 다운로드하는 과정이다. <그림 1>은 이러한 일련의 과정을 표시한 것이다.
이를 입출력의 관점에서 보면 COD 시스템은 개발자가 제공하는 자바 클래스 파일을 입력으로 일련의 과정을 거쳐 단말기 사용자에게 프로그램 바이너리 이미지 파일을 제공한다. COD 내부에서는 입력된 자바 바이트코드를 분석해 해당 분석 정보를 기반으로 이와 동일한 기능을 갖는 C/C++ 프로그램으로 번역한다. 또한 이렇게 만들어진 소스를 자동으로 컴파일할 수 있는 Makefile도 같이 만들어 컴파일러를 구동한다. 이에 대한 시스템 관점의 흐름을 ‘서비스 프래임워크’에서 좀더 자세히 설명하겠다.COD 서비스 프레임워크그렇다면 과연 COD는 실제 어디에 어떻게 위치해 동작하는 것인가. <그림 2>는 이러한 관점에서 가능한 실제에 가까운 시스템 구성을 표현한 것이다. 여기서 COD는 여러 시스템에 나눠 있으며 매우 다양한 작업을 수행하게 된다. 이 그림을 몇 가지 단계로 나눠 설명하면 다음과 같다.
① 개발자의 프로그램 제공WIPI 프로그램 개발자는 프로그램을 WIPI SDK 등에서 제공되는 기능을 이용해 프로그램을 개발하고, 자바 컴파일러를 이용해 클래스 파일을 생성한 후 JAR(Java Archive) 형태로 프로그램 정보와 함께 묶어 ‘Content Provider Web Site’를 통해 제출한다. 제출된 프로그램은 검증 과정을 거쳐 프로비져닝(provisioning) 서버에 등록되는 것으로 개발자 프로그램 제공 과정이 마무리된다.② Compile On Demand 개발자에 의해 제출된 프로그램은 시스템 관리자 또는 개발자 자신에 의해 컴파일을 요청하며, COD 프로세스는 이 요청에 의해 해당 프로그램을 단말기에서 작동가능한 바이너리로 생성한다. 정상적으로 생성된 바이너리는 다운로드 형태로 패키징돼 애플리케이션 스토어 데이터베이스에 등록되어 사용자의 다운로드 요청을 기다린다.③ 애플리케이션 다운로드사용자는 단말기를 이용해 서버에 접속해 다운로드가 가능한 프로그램을 검색하고 다운로드할 수 있다. 물론, 이 과정도 그리 단순하지만은 않다. 예를 들면, 접속한 단말기의 종류를 확인하고, 사용자가 정상적인 사용자인지 검사하고, 특히 연령제한을 받는 프로그램이라면 이에 대한 확인 작업이 선행되며 각각의 경우에 발생할 수 있는 오류를 적절한 형태로 단말기에 반환해 사용자에게 적합한 메시지를 제공해야 한다. 다운로드를 위한 모든 준비과정이 정상적으로 수행되었을 때 다운로드가 수행된다.이상과 같은 세 가지 정도의 중요 경로를 설명했으나 실제 서비스에는 훨씬 다양하고 복잡한 과정이 포함되어 있다. 또한 이러한 과정은 서비스 제공자에 따라 약간씩 차이점을 가지고 있다.COD가 제공하는 이점과연 COD가 개발자에게 제공하는 이점은 무엇인가. 이는 지금까지 지속적으로 언급돼 온 자바 언어를 무선인터넷 플랫폼을 위한 개발언어로 사용해 얻어지는 이익과 거의 동일하다. 또한 AOTC 기술이 사용돼 추가적으로 얻어지는 장점도 있을 것이다.첫 번째는 자바 언어 수준의 신뢰할 수 있는 안정성을 제공한다. 자바 언어를 사용함으로써 개발자는 개발과정에서 발생할 수 있는 모든 종류의 오류로부터 자유로워질 수 있다. 즉, 자바의 예외 처리 기능을 통해 안정적인 프로그램 작성이 가능하며, 또한 개발자의 실수에 의해 발생하는 시스템 오류 문제를 근본적으로 회피할 수 있다. 많은 독자들이 생각하듯 이동통신 단말기가 구동되고 실행되는 환경은 매우 열악하다. 물론, 시스템의 보호를 위해 많은 보호장치를 하고는 있으나 이는 매우 미미하며 독자들이 일반적으로 사용하고 있는 PC의 운영체제와는 비교도 되지 않을 정도의 초보적인 운영체제를 이용하고 있다.따라서 단말기에서 실행되는 프로그램이 발생시키는 오류에 의해 단말기 자체의 작동이 불가능한 상태가 발생될 수 있다. 일반적으로 지금까지 바이너리 실행환경의 단말기 플랫폼 개발자는 이러한 오류 발생을 근본적으로 회피할 수 없는 환경이었다. COD에 의해 제공되는 이러한 신뢰할 수 있는 안정성은 프로그램 개발자뿐만 아니라 무선인터넷 서비스를 제공하는 이동통신사에게도 매우 중요한 요소다.또 다른 장점은 개발자에게 매우 일반적이고 잘 알려진 개발 환경을 제공한다. 자바 프로그램의 개발 환경은 개발자에게 매우 친숙하며 쉬운 사용자 인터페이스를 제공하고 있다. 이러한 개발 환경을 개발자는 동일하게 사용해 개발 작업을 진행할 수 있기 때문에 무선인터넷 플랫폼을 위한 별도의 개발 환경에 적응해야 하는 시간이 필요하지 않다. 또한 WIPI API는 기존의 자바 프로그램 개발자라면 특별한 노력을 들이지 않고도 쉽게 이해할 수 있는 구조를 지원하고 있다. 따라서 날로 확산되고 있는 자바 프로그램 개발자가 쉽게 무선인터넷을 위한 프로그램 개발이 가능해 짧은 기간 내에 많은 개발자의 흡수가 가능하다.마지막으로 AOTC에 의해 생성된 바이너리는 단말기에서의 빠른 수행속도를 제공하기 때문에 많은 장점을 가질 수 있다. 즉, 가상 기계를 사용하는 구조에 비해 상대적으로 매우 뛰어난 성능을 제공해 멀티미디어 서비스와 같은 고속 처리가 필요한 프로그램 개발과 서비스가 가능하다. AOTC의 결과물은 단말기에 최적화된 실행 바이너리로 단말기에서 최상의 성능을 갖도록 튜닝되어 있다. 이는 지금까지 우리가 일반적으로 생각하는 ‘자바는 느리다’는 인식을 불식시키기에 충분하다. 물론 C 언어로 작성된 프로그램보다 빠르다는 이야기는 아니다. 그렇지만 충분히 이에 근접하는 성능을 AOTC를 통해 제공해 고성능의 프로그램 작성을 위한 기반을 제공한다.COD 코드변환기COD의 구성요소에서 가장 중요한 코드변환기에 대해 알아보자. 독자들이 아는 바와 같이 자바와 C++ 언어는 객체지향 언어의 대표주자다. 즉, 두 언어 모두 객체를 다루기 위해 설계된 언어이므로 그 구조나 형태가 매우 유사하다.코드변환기의 아이디어는 여기에서 시작된 것이다. 물론 자바와 C++ 언어가 구조적인 유사성이 매우 높은 언어이긴 하지만 프로그래밍 언어론 관점의 구문이 일치하지는 않는다. 즉, 매우 미묘한 부분의 차이에 의해 자바 프로그램을 C++ 언어로 변환하는 것은 자동화 과정에 많은 기술적 어려움을 겪을 수밖에 없다. 물론 두 가지 언어를 모두 잘 알고 사용할 수 있는 개발자가 직접 자바로 구현된 내용을 C++로 구현하는 것은 그리 어려운 일은 아니다(여기서는 프로그래밍 언어적 의미일 뿐 실제 작업이 쉽다는 표현은 아니므로 독자들의 오해가 없기를 바란다).코드변환기는 자바 클래스 파일(바이트코드)을 이와 동일한 기능을 갖는 C++ 언어로 변환하는 기능을 수행하며, 또한 생성된 C++ 프로그램을 컴파일하기 위한 Makefile을 자동으로 생성한다. 현재 AOTC에 관련된 많은 자료를 인터넷을 통해 얻을 수 있으므로 기술적인 관심을 갖고 있는 독자라면 한번쯤 웹 서핑을 해보는 것을 권하고 싶다.AOTC를 이용한 고성능 자바 구현지금까지 지난 1년 동안 진행된 WIPI 무선인터넷 플랫폼 과제에 포함된 COD에 대한 내용을 개괄적으로나마 적어봤다. 어느 누구도 생각하지 않았고 시도하지 않았던 기술을 사용해 무선인터넷 플랫폼의 구현이 성공적으로 마무리된 것을 자축하며 앞으로 이 기술이 사용자에게 빨리 선보일 수 있었으면 한다. 참고로 이 글을 읽은 독자는 COD 및 AOTC와 이에 관련된 기술적 비교 정보가 2-1부에 상세히 기술되어 있으므로 참고하기를 바란다. @