액티브X 문제로 때 아닌 진통을 겪고 있는 나라는 놀랍게도 우리나라뿐이다. 미국이나 유럽 대부분의 국가들은 https 프로토콜 하나로 ID만으로 인증하면 그걸로 끝인 탓이다. 보안 능력을 높이기 위해 사용자에게 그 이상의 요구를 하지 않는다. 그들의 보안 의식이 낮은 탓일까? 필자는 그렇게 생각하지 않는다. MS의 조국인 미국에서조차 사용하지 않고 있는 액티브X의 지나친 사용을 이제는 되돌아보고 바로잡을 때다. 특집 4부에서는 XPCOM을 통해 기존의 액티브X를 어떻게 대체할 수 있는지에 대해 알아본다.
XPCOM, 앞에 두 글자 XP와 뒤에 COM를 보면 Windows XP와 무슨 관련이 있는 기술처럼 보인다. 그도 그럴 것이 COM와 COM+로 대표되는 액티브X를 위시한 마이크로소프트(이하 MS)의 컴포넌트 기술과 비슷한 단어인 Cross Platform Component Object Model의 약자이기 때문이다. 그래서 어느 정도 관련이 있다고도 볼 수 있는 기술이다.
하지만, 결정적으로 MS는 수익을 추구하는 회사란 집단이고 XPCOM을 만든 모질라 재단은 비영리단체라는 것이다. 물론, 수익 추구라는 차이를 내세워 표준인지 아닌지를 가름 할 수는 없다. 하지만 MS의 브라우저 IE는 리눅스용이 없다. 하지만 모질라재단의 파이어폭스는 윈도우는 물론 리눅스와 유닉스, 맥OS, OS/2 등등 현존하는 거의 모든 OS를 지원하고 있다.
즉, 지원하는 플랫폼이 다양하기 때문에 더욱 범용적으로 사용할 수 있고 액티브X를 대체하는 것에 더하여 표준으로 자리 잡기에 충분하다고 얘기할 수 있겠다.
이번 특집에서는 기존에 마소를 통해 소개된 적 있는 XPCOM의 소개 기사는 최대한 배제하고, 다양한 플랫폼에 XPCOM을 어떻게 적용하면 좋을 지에 대한 활용 기사 위주로 다룰 것이다. XPCOM에 대해 더 궁금한 독자들은 원고 중에 제시된 링크를 참조하길 바란다.
XPCOM으로 개발하려면 SDK를 다운로드 받아 설치해야 한다. 다음의 링크를 통해 필요한 파일을 다운로드 받을 수 있다.
먼저 각각의 과정을 살펴보면 가장 먼저 xxIxxx.idl를 만들고, 그 뒤에 xpidl를 이용하여 xxIxxx.xpt와 xxIxxx.h를 작성한다. 또, xxIxxx.h로부터 xxxxx.h, xxxxx.cpp와 xxxxxModule.cpp를 작성하고 나서 Makefile.in를 작성하고 파이어폭스와 함께 빌드하면 된다.
<리스트 1>은 두 개의 숫자를 입력받아 더하는 역할을 하는 xxlxxx.idl 코드다. 이제 다음과 같이 xpidl를 이용하여 xxIxxx.xpt 와 xxIxxx.h를 작성해 보자.
xpidl -m typelib -I c:xxx_gecko_sdk xxIxxx.idl
xpidl -m header -I c:xxx_gecko_sdk xxIxxx.idl
다음으로 해야 할 일은 xxxxx.ccp를 작성하기 위해 xxIxxx.h에 있는 /* Header file */ 부터 /* Implementation file */ 의 앞까지를 xxxxx.h에 복사한 뒤에 xxxxx()를 virtual xxxxx()로 바꾸는 것이다.
xxxxx.cpp는 xxIxxx.h에 있는 /* Implementation file */부터 /* End of implementation class template. */ 까지를 복사하여 만들면 된다.
이번에는 모듈 등록을 위해 <리스트 4>과 같이 xxxxxModule.cpp 파일을 만든다.
이번에는 리눅스에 C++ XPCOM을 적용하는 방법에 대해 알아볼 것이다. 여기에서는 Debian GNU/Linux를 기준으로 하여 진행한다. 리눅스에서는 .so 형식의 셰어드 라이브러리로 만들어야 한다.
가장 먼저 다음과 같은 방법으로 작업용 디렉토리를 만든다.
% mkdir -p xpcom-sample/{content/xpcom-sample,components}
% cd xpcom-sample
코드를 작성하기 전에 일단 XPCOM을 인스톨 하는 확장 기능을 만들어 보자.
파이어폭스의 사용자 유저 인터페이스의 환경을 저장하는 chrome 파일을 확인한다.
인스톨러 작성 스크립트도 만든다.
<리스트 7>처럼 dist.sh가 만들어졌으면 다음과 같이 입력하여 .xpi를 작성한다.
% ./dist.sh
현재 디렉토리에 xpcom-sample-0.1.xpi을 인스톨하기 위해 다음과 같이 입력한다.
% iceweasel xpcom-sample-0.1.xpi
파이어폭스에서 [툴] - [애드 온(add-on)] 메뉴를 선택하여 ‘XPCOM sample’이 인스톨 되어 있는지 확인한다.
자 이제 XPCOM을 사용할 모든 준비가 끝났으니 실제 코드들을 만들어보자.
IDL의 작성 편집
가장 먼저 할 일은 components 디렉토리에 myICalc.idl를 작성하는 것이다. components 디렉토리 아래에 작성하여 파이어폭스가 자동으로 XPCOM를 검출해 읽어 들일 수 있도록 해 준다. 그렇게 하지 않으면 수동으로 등록하지 않으면 안 된다.
IDL 안의 uuid를 uuidgen(참고링크3)로 생성한다.
% uuidgen
c95498ae-16f5-4b46-8713-2cf79e30d4ef
.xpt와 .h 생성하기와 편집하기
IDL이 다 만들어졌다면 이번에는 만들어 놓은 IDL 로부터 .xpt와 .h를 생성할 차례다. xpidl를 사용하여 .xpi와 .h를 만든다. 이 두 파일은 .idl 를 수정할 때마다 만들어야 하므로 Makefile로 만들어 두는 것이 좋다.
여기에서는 XULRunner를 사용하고 있는데 데비안 이외의 리눅스 환경에서는 GECKO_PATH나 GECKO_XXX_PATH를 변경 할 필요가 있을 것이다.
dist.sh를 실행해 .xpi 를 생성한 후에 다시 인스톨한다.
% ./dist.sh
/usr/lib/xulrunner/xpidl -m typelib -I/usr/lib/xulrunner/sdk/idl myICalc.idl
/usr/lib/xulrunner/xpidl -m header -I/usr/lib/xulrunner/sdk/idl myICalc.idl
% iceweasel xpcom-sample-0.1.xpi
.xpt가 인식되고 있는지 확인하려면 다음과 같이 입력해 보자.
% grep xpcom-sample /.mozilla/firefox/*/xpti.dat
다음과 같은 결과가 출력되면 .xpt가 정상적으로 인식된 것이다.
4,.../extentions/xpcom-sample@imaso.co.kr/components
XPCOM의 설치하기
우선은 myCalc.h를 작성해야 하는데 여기에서도 UUID가 필요하다. 다음과 같이 입력하여 사전에 UUID를 만들어 둔다.
% uuidgen
8931dfd3-edf3-4b7d-bd44-1da72064f0dc
이렇게 만들어진 uuid를 16진수로 나누어 코드에 적용하기 위해 다음과 같이 포맷을 변환해 두어야 한다.
8931dfd3-edf3-4b7d-bd44-1da72064f0dc
↓
8931dfd3 edf3 4b7d bd 44 1d a7 20 64 f0 dc
↓
0x8931dfd3 0xedf3 0x4b7d 0xbd 0x44 0x1d 0xa7 0x20 0x64 0xf0 0xdc
↓
{0x8931dfd3, 0xedf3, 0x4b7d, {0xbd, 0x44, 0x1d, 0xa7, 0x20, 0x64, 0xf0, 0xdc}}
이것을 요즘 유행하는 스크립트 언어인 루비를 이용해서 만들어 보자.
혹은 이렇게 한다.
<리스트 10>나 <리스트 11>과 같이 하면 다음과 같은 두 형식의 UUID가 만들어진다.
8931dfd3-edf3-4b7d-bd44-1da72064f0dc
{0x8931dfd3, 0xedf3, 0x4b7d, {0xbd, 0x44, 0x1d, 0xa7, 0x20, 0x64, 0xf0, 0xdc}}
헤더 파일은 components/myICalc.h에 있는 것을 카피하여 사용한다.
cpp도 components/myICalc.cpp에 있으므로 그것을 복사하고 add를 추가한다.
components/Makefile를 수정하여 컴파일 할 수 있도록 한다.
dist.sh를 실행해 컴파일 할 때 모질라의 헤더 파일에 warning 메시지가 표시되지만 큰 문제는 없다.
컴파일 시 warning 메시지들
% ./dist.sh
c++ -g -Wall -fno-rtti -fno-exceptions -shared -DXPCOM_GLUE -I/usr/lib/xulrunner/sdk/include -c myCalc.cpp
/usr/lib/xulrunner/sdk/include/nsISupportsBase.h:80: warning:
‘class nsISupports
' has virtual functions but non-virtual destructor
/usr/lib/xulrunner/sdk/include/nsIProgrammingLanguage.h:32: warning:
‘class nsIProgrammingLanguage
' has virtual functions but non-virtual destructor
/usr/lib/xulrunner/sdk/include/nsIClassInfo.h:33: warning:
‘class nsIClassInfo
' has virtual functions but non-virtual destructor
myICalc.h:25: warning:
‘class myICalc
' has virtual functions but non-virtual destructor
c++ -g -Wall -fno-rtti -fno-exceptions -shared -L/usr/lib/xulrunner/sdk/lib -o myCalc.so myCalc.o -lxpcomglue -lnspr4 -lplds4
이것으로 components/myCalc.so를 만들어 사용 할 수 있다. 하지만, 이것만으로는 아직 부족하다.
XPCOM 등록하기
공유 라이브러리가 읽혔을 때에 XPCOM을 등록하는 기능이 필요하다면 그 기능은 <리스트 15>과 같이 components/myCalcModule.cpp로 구현하면 된다.
또한 components/Makefile의 OBJS에도 추가한다.
예제에서는 myCalc 하나만을 등록하고 있지만 복수의 XPCOM이 하나의 공유 라이브러리에 들어갈 수도 있다. 프로그램 패키지를 묶어서 인스톨하기 위해 다음과 같이 스크립트를 입력한다.
% ./dist.sh
...
% iceweasel xpcom-sample-0.1.xpi
myCalc가 등록되었는지 확인하려면 다음과 같이 입력한다.
% grep myCalc /.mozilla/firefox/*/compreg.dat
이렇게 입력한 결과가 다음과 같이 나오면 제대로 등록된 것이다.
abs:/.../xpcom-sample@imaso.co.kr/components/myCalc.so,1173322260000
{8931dfd3-edf3-4b7d-bd44-1da72064f0dc},,,,abs:/.../myCalc.so
테스트용 인터페이스
대화형으로 xul을 사용하여 팝업의 인터페이스를 만들어 자바스크립트의 식을 테스트하는 인터페이스를 만들어 보자.
역시 .xpi 를 다시 인스톨 한다.
% ./dist.sh
% iceweasel xpcom-sample-0.1.xpi
[XPCOM sample] 메뉴에서 [Call sample XPCOM]를 실현한 뒤에 ‘3 + 4 = 7’라는 메시지가 표시되면 성공이다.
지금까지 각 운영체제별 XPCOM 개발 예제에 대해 간단히 알아보았다. 지면 한계상 의도했던 내용의 절반 정도 밖에는 소개하지 못하여 아쉬움이 남는다. 하지만 우리에겐 인터넷과 커뮤니티가 있다. 아직 한국의 모질라 개발자 커뮤니티 등에는 다양한 자료와 질문, 답변들이 준비되어 있다. 특집 4부의 내용을 기반으로 커뮤니티의 자료들을 참고하면 XPCOM에 대해 좀 더 다양한 지식들을 얻을 수 있을 것이다. @
참고자료
1) XPCOM 소개 : http://cafe.naver.com/huni0716.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1589
2) Creating a C++ XPCOM component : http://www.iosart.com/firefox/xpcom/
3) GUID Generator :
http://www.microsoft.com/downloads/details.aspx?FamilyID=94551F58-484F-4A8C-BB39-ADB270833AFC&displaylang=en
4) 한국 모질라 개발자 커뮤니티 : http://www.mozilla.or.kr/developer/
* 이 기사는 ZDNet Korea의 제휴매체인 마이크로소프트웨어에 게재된 내용입니다.
지금 뜨는 기사
이시각 헤드라인
ZDNet Power Center







