1.WTL

.WTL 소개

윈도우즈용 응용 프로그램을 만드는 방법은 여러 가지가 있다. 운영체제가 제공하는 함수를 직접 호출하는 네이티브 언어가 가장 기본적이고 자바, 닷넷처럼 가상 머신을 활용하는 방법도 많이 사용된다. 가상 머신을 쓰는 방법은 프로그래밍 언어의 수준이 높아 생산성이 월등하지만 성능이 떨어져 아직까지는 용도상의 제약이 있는 편이다. 속도가 중요한 시스템 프로그래밍이나 메모리의 제약이 따르는 모바일 환경에서는 아직까지도 네이티브 언어가 주를 이룬다.

네이티브 개발을 직접 지원하는 언어는 수도 없이 많다. 과거에는 비주얼 베이직, 델파이 등의 RAD 툴도 많이 사용되었지만 요즘은 그다지 많이 사용되지 않는다. 역시 전통적인 C/C++ 언어가 가장 대중적이다. C/C++ 언어를 쓰는 방법은 크게 C 수준에서 API 함수를 직접 호출하는 SDK 방법과 C++로 API를 클래스화하여 사용하는 MFC 방법으로 나누어지며 업계에서 가장 일반적으로 많이 사용되는 방법이다. SDK와 MFC는 장단점이 확연히 구분되는데 한쪽의 장점이 반대쪽의 단점이 된다.

 

 

장점

단점

SDK

작고 빠르다.

생산성이 낮다.

MFC

생산성이 높다.

크고 느리다.

 

두 개발 방법의 차이점들은 기반 언어가 C인가 C++인가에 따라 파생된다. 물론 SDK에서도 C++을 쓸 수 있고 MFC에서도 C 문법을 쓸 수 있기는 하지만 일반적이지 않다. C++은 편리하기는 하지만 아무리 최적화를 해도 C보다 느린 것은 명백한 사실이다. C의 구조적인 방법이 속도나 크기면에서는 유리하고 생산성 향상을 위해서는 C++의 객체 지향적인 방법이 유리하다. 안타깝게도 두 언어의 장단점은 상호 배타적이다.

그렇다면 C의 효율성을 보장하면서도 C++의 편리함을 누릴 수 있는 방법은 없을까? 그래서 나온 것이 바로 WTL이다. WTL은 이 둘 사이에 위치하는 새로운 개발 방법으로써 복잡한 UI 제작을 위해 ATL을 확장한 클래스 집합이다. 대부분의 기능을 템플릿 클래스로 제공하여 객체 지향의 이점을 제공하면서도 크기가 작고 빠르다. SDK에 필적하는 크기와 속도를 제공하면서도 객체 지향의 장점을 누릴 수 있다.

WTL은 최초 마이크로소프트에 의해 무료 버전으로 만들어졌으며 현재는 오픈 소스로 공개된 상태이다. 마이크로소프트가 더 이상 지원을 하지는 않지만 어쨌든 중요한 것은 누구나 무료로 쓸 수 있다는 점이다. 버전이 올라갈수록 기능이 늘어나고 클래스 수가 증가하는 것은 당연한데 초기 버전부터 굵직한 변화만 정리해 보았다.

 

버전

발표 년도

특징

3.0

 

첫 버전.

3.1

 

3.0의 버그 픽스 및 마이너 업그레이드

7.0

2002년 4월 2일

VS 2001 지원

7.1

2003년 12월 9일

VS 2003 지원, 윈도우즈 CE 지원. 오픈 소스로 전환됨

7.5

2006년 6월 13일

VS 2005 지원

8.0

2007년 6월 15일

비스타 UI 지원, VS 2005 Express 지원

9.0

?

나온다는 소문만 무성한 상태임. 마이크로소프트 망하기 전에 나올 예정

 

버전이 1.0부터 시작하지 않고 3.0부터 시작하며 바로 7.0으로 건너 뛰었다. 이는 WTL이 기반 라이브러리인 ATL의 버전을 따르기 때문인데 ATL은 고유한 버전을 메기다가 갑자기 비주얼 스튜디오와 버전을 일치 시키도록 변경되었다. 그러다 보니 WTL의 버전 번호도 연속적이지 못하고 헷갈리게 메겨져 있다.

현재 이 글을 쓰는 시점에서 WTL의 최신 버전은 8.0이다. 비주얼 스튜디오 2008과 함께 쓸 수 있는 버전은 아직 없으므로 2005로 학습해야 한다. 나온지 대략 1년 정도 되었으므로 이제 9.0이 나올 때도 되었다. 아마 9.0은 비주얼 스튜디오 2008을 지원할 것으로 예상된다. 버전이 바뀌어도 하위 호환성은 왠만큼 유지되므로 8.0으로 학습을 시작해도 차후 실무에 적용할 때 별 무리는 없을 것이다.

.WTL의 장단점

WTL은 기존 개발 방법과 어떤 차이점이 있을까. 윈도우를 만들고 그 안에 문자열 하나만 출력하는 간단한 예제를 만들어 크기와 속도를 비교해 보자. 비주얼 스튜디오의 각종 프로젝트 형식으로 예제를 죄다 만들어 보았다.

 

개발 방법

디버그

릴리즈

속도

Win32

428K

37K

가장 빠름

MFC 공유 DLL

137K

48K

느림

MFC 정적 DLL

2300K

489K

느림

WTL

736K

76K

빠름

닷넷

4K

4K

엄청나게 느림

 

디버그 버전은 별 의미없으므로 릴리즈 버전만 비교해 보자. 프로그램의 크기는 역시 Win32가 가장 작다. 37K나 나왔는데 세팅을 조금 변경하면 사실 이보다 더 작게 만들 수도 있다. 다음으로 MFC 공유 DLL 버전이 작은데 알다시피 이 방식으로 만든 실행 파일은 MFCxx.DLL이라는 엄청난 크기의 DLL을 같이 배포해야 하는 문제가 있다. 단독 실행 가능한 MFC 정적 DLL 버전은 Win32에 비해 대략 15배 정도 더 크다. 프로젝트가 커지면 이 차이는 줄어들지만 아뭏든 큰 건 사실이다.

WTL은 76K로 Win32에 비해서는 곱절 정도 되지만 MFC에 비해서는 7배 정도 더 작다. 꼭 필요한 코드만 포함하므로 크기가 작고 별도의 DLL을 배포하지 않아도 단독 실행이 가능하다. 닷넷 예제도 만들어 봤는데 크기가 4K로 초미니인 것 같지만 뒤쪽에 닷넷 프레임워크라는 거대한 지원군이 있어야 하므로 공정한 비교라 할 수는 없다.

속도는 정밀하게 측정하기 어려워 주관적으로 비교해 보았다. 가장 느린 닷넷과 Win32는 대략 2.5배 차이가 나며 MFC와 WTL은 Win32에 비해 근소하게 조금 느리다. 속도라는 것은 프로젝트의 형태에 따라 평가 방법이 달라지므로 원론적인 비교만 가능할 뿐이다. WTL은 Win32와 MFC 사이에서 적당한 크기와 적당한 속도를 내 주는 중간적인 개발 방법이다. 다음은 WTL의 일반적인 장점들이다.

 

■ 다운로드만 받으면 쓸 수 있는 공짜다.

MFC에 버금가는 객체 지향 환경을 제공한다. CString같은 편리한 클래스를 쓸 수 있으며 DDX 같은 기능도 제공된다.

Win32에 비해 마법사, 메시지 맵 편집 등 일부 기능이 자동화되어 있다.

MFC에 비해 도큐멘트/뷰 구조 같은 복잡한 구조를 쓰지 않아 단순하다.

■ 소스가 공개되어 있으므로 원하면 뜯어 고쳐가며 쓸 수도 있고 WTL을 통해 최신 API의 적용 기법을 연구할 수도 있다.

■ 워낙 가볍다 보니 최신 기술이 빨리 적용되며 어떤 부분은 MFC보다 더 좋은 기능을 제공하기도 한다.

 

물론 단점도 많다. 기능적으로 부족한 점도 있고 처음 배울 때 생소하다는 것도 문제다. 그러나 가장 치명적인 단점은 사용하는 사람이 적고 관련 자료를 얻기 힘들다는 점이다. 마이크로소프트가 공식적으로 지원하지 않기 때문에 MSDN에 관련 문서가 전무하다. 인터넷에 공개된 자습서들을 참조하든가 아니면 헤더 파일을 일일이 분석해서 사용법을 익혀야 하므로 초보자가 쉽게 범접하기 어렵다.

그렇다면 왜 애써 만들어 놓고 지원을 하지 않을까? 이유는 간단하다. 돈이 안되기 때문이다. 돈받고 팔 정도의 라이브러리가 아니다 보니 만들어만 놓고 더 이상 투자를 하지 않다가 오픈 소스로 전환하여 던져 버린 것이다. 그렇다면 돈도 안되는 걸 알면서 왜 만들었을까? WTL을 만든 속사정은 정확하게 알 수 없지만 아마도 모바일이나 인터넷 환경을 위해 만든 것이 아닌가 생각된다. API는 너무 불편하고 MFC는 너무 비효율적이기 때문에 중간 단계의 적당한 라이브러리가 절실했던 것이다.

사정이 이렇다 보니 WTL을 배우고 사용하기가 쉽지 않다. 시중에 WTL을 다루는 친절한 자습서 하나 출판된 바 없고 개발하다가 문제가 생겨도 참조할만한 문서가 드물다. 그나마 천만 다행인 것은 자유 공간인 인터넷에는 관련 문서가 어느 정도 존재한다는 점이다. 인터넷을 검색해 보면 최소한의 기본 사용법 정도는 어렵지 않게 얻을 수 있다. 또 비주얼 스튜디오의 인텔리센스 기능도 굉장한 도움이 된다.

객체 다음에 점만 꼭 찍으면 멤버의 목록이 좌악 나온다. 최소한 멤버 함수의 이름을 일일이 외우지 않아도 된다. 함수 다음에 여는 괄호를 열면 인수의 목록이 나타나며 오버로딩된 함수는 어떤 원형이 있는지 알 수 있다. 만약 비주얼 스튜디오가 인텔리센스를 지원하지 않는다면 허구헌날 헤더 파일 사이를 헤엄치고 돌아 다녀야 할 것이다. 개발 경험이 있는 사람들은 사실 이 정도 도움말만 해도 충분한 정도다.

WTL을 배우는데는 어느 정도의 노력이 들까? WTL은 간단한 라이브러리이지만 선수 과목이 많은 편이라 사람에 따라 쉬울 수도 있고 아닐 수도 있다. 기본 자질이 된다면 WTL은 그야 말로 껌이지만 초보자에게는 아주 난해해 보인다. WTL을 제대로 배우고 활용하기 위해서는 다음 요건들을 만족해야 한다.

 

C/C++ : 모든 프로그래밍 언어의 기본이다. C/C++을 모른다면 WTL은 아예 접근조차 할 수 없다. 특히 C++의 템플릿 같은 고급 문법에도 통달해 있어야 한다.

Win32 API : WTL은 Win32의 래퍼이므로 Win32도 기본 과목이다. 상세하게는 아니더라도 운영체제가 어떻게 돌아가는지 개념은 파악하고 있어야 한다. 시중에 Win32를 다루는 좋은 책이 출판되어 있다. 딱히 뭐라고 말하진 않겠지만...

MFC : WTL은 MFC를 모방한 라이브러리이므로 MFC에 대한 경험이 중요하다. MFC의 구조와 거의 흡사하므로 MFC를 잘 알면 WTL 활용은 아주 쉽다. Win32보다 오히려 MFC에 대한 경험이 더 많은 도움이 될 것이다. 대충 아는 정도여서는 안되며 MFC의 내부까지 파악하고 있어야 한다.

ATL : WTL은 ATL의 확장 라이브러리이므로 ATL에 대한 대충의 이해도 필요하다. ATL은 애초에 COM 오브젝트나 ActiveX 컨트롤 제작을 위해 디자인된 것이다. 그러다 보니 기본적인 UI 클래스가 포함되어 있다. 하지만 COM 관련 기능에 너무 치중하다 보니 거대하고 복잡하다. 그래서 ATL의 UI 클래스를 확장하여 응용 프로그램 개발에 쉽게 활용할 수 있도록 WTL을 만든 것이다. 다행히 ATL을 모른다고 하여 지금 ATL을 공부할 필요는 없다.

 

그렇다면 지금 과연 WTL을 배울 필요가 있을까? 이 질문에 대한 답은 각자의 상황에 따라 달라지겠지만 결론부터 말하자면 굳이 배울 필요가 없다. 실무에서 Win32나 MFC를 잘 써 먹고 있고 별 부족함이 없다면 그걸로 계속 만족하면 된다. WTL보다는 MFC가 아무래도 한 수 위이고 생산성도 높으며 공개된 문서도 많다. MFC의 크기나 속도가 만족스럽지 못하다면 이때는 Win32를 사용하면 된다. WTL 예찬론자들은 MFC보다 작고 Win32보다 편리하다고 주장하지만 반대로 얘기하면 Win32보다 크고 MFC보다 불편하다. 쉽게 말해서 어중간한 것이다.

비슷 비슷한 세 가지를 머리속에 같이 넣고 다니자면 헷갈리기도 한다. 비슷한 것 같아 보여도 실상은 미세하게 틀린 부분이 많아 뜻하지 않게 함정에 빠질 위험이 도처에 도사리고 있다. 특별히 당장 필요가 없다면 애써 시간을 내서 새로 배울 필요는 없다고 생각한다. 이것 저것 연장을 많이 보유한 것보다 연장 하나라도 제대로 잘 쓰는 것이 더 중요하다. 괜한 호기심에 WTL을 배워 보고자 한다면 당장 관두기를 권하고 싶다.

그러나 실제로 개발 현장에 있다 보면 세상 살이라는게 그렇게 간단하지 않다는 것을 느낄 수 있다. 나 혼자만 안 쓴다고 될 게 아니더라는 것이다. 프로젝트 중에 커스텀 컨트롤을 갑이 제공한 것으로 교체하라는 지시가 떨어졌다. 컨트롤을 준다니 그냥 붙이면 될 것 같아 좋아라 했는데 그게 DLL도 아니고 LIB도 아니고 WTL 소스로 온 것이다. 생판 모르는 소스를 어찌 어찌해서 겨우 붙였는데 그나마도 버그가 있는 것이다. 디버깅은 을의 몫이다. 버그를 고치지 않으면 갑이 돈을 안 주니 어쩔 도리가 없다.

그래서 어쩔 수 없이 WTL을 배우게 된 것이다. 이미 WTL로 작성된 코드가 있기 때문에 최소한 기본은 공부해야 할 필요가 있다. 인터넷을 검색하여 몇 안되는 문서를 찾아 WTL을 익히고 실무에 적용을 했으며 지금은 나 같은 곤란한 처지에 놓인 사람을 위해 이렇게 강좌까지 쓰고 있다. 비록 허접하기는 하지만 말이다. 이 강좌는 목숨 걸고 쓴 것이 아니며 대충 아는 범위내에서 끄적거려 본 정도에 불과하다. 이 강좌를 통해 오버뷰를 하고 더 깊은 곳을 보고 싶으면 인터넷을 더 검색해 보기 바란다.

개인적으로는 WTL의 구조가 상당히 마음에 들지만 프로젝트에 본격적으로 사용하고 싶은 생각은 들지 않는다. 그냥 남의 코드 줏어서 자기 프로젝트에 쓸 수 있을 정도면 되지 않을까 생각한다. WTL 학습에 또 다른 의미를 꼭 부여한다면 C++ 템플릿 문법에 대한 실습과 고급 라이브러리 제작법 습득 정도가 있을 것이다. 지금은 바빠서 대충 공부했지만 차후 좀 더 시간이 허락된다면 깔끔하게 다시 정리해 보고 싶다.

.설치 및 준비

WTL은 헤더 파일로만 구성된 작은 라이브러리이고 또 무료이다 보니 설치 과정도 아주 간단한다. 다음 사이트에서 WTL의 최신 버전인 8.0을 다운로드 받을 수 있다.

 

http://www.microsoft.com/downloads/details.aspx?familyid=E5BA5BA4-6E6B-462A-B24C-61115E846F0C&displaylang=en

 

URL은 언제 바뀔 지 알 수 없으므로 주소를 직접 타이핑하지 말고 마이크로소프트 사이트에 들어가서 WTL 키워드로 검색하면 다운로드 주소가 나타날 것이다. 여러분이 이 글을 읽을 때 쯤에는 WTL 9.0이나 WTL 12.0이 나와 있을지도 모르는데 가급적이면 최신 버전을 받는 것이 좋을 것이다.

그러나 이 강좌와 맞추려면 일단 8.0을 받아서 써 보고 최신 버전으로 업그레이드를 해도 늦지 않다. WTL80.exe라는 달랑 887KB짜리 파일 하나가 다운로드된다. 미국까지 갖다 오기 귀찮다면 WinApi에도 사본을 올려 두었으므로 다음 링크를 눌러 다운로드 받으면 된다. 설마 여기다 올려 놨다고 빌 게이츠 형님이 나를 고소하지는 않겠지?

 

http://www.winapi.co.kr/project/library/wtl/WTL80.exe

 

좀 싱거워 보이지만 이 파일이 WTL의 실체이다. 설치 실행 파일인 것처럼 보이지만 막상 실행해 보면 단순한 압축 파일일 뿐이다.

디폴트 설치 경로가 루트 디렉토리로 되어 있는데 나는 개인적으로 루트에 직접 설치하는 것을 좋아하지 않는다. 아마 여러분들도 그럴 것이다. Program Files\wtl80 등 눈에 거슬리지 않는 곳에 압축을 풀도록 하자. 압축을 풀어 보면 다음과 같은 파일들이 생성되어 있다.

include 폴더의 헤더 파일들이 바로 WTL이다. 클래스 템플릿이므로 모두 헤더 파일로 정의되어 있으며 구현 파일은 하나도 없다. 헤더 파일 총 크기는 1.36M이며 전체 소스량은 52557줄이다. 까짓거 하루 이틀 밤새서 읽어 보면 다 분석해 볼 수 있는 분량이다. 각 헤더 파일에 대한 간단한 설명은 다음과 같다.

 

헤더 파일

설명

atlapp.h

message loop, interfaces, general app stuff

atlcrack.h

message cracker macros

atlctrls.h

standard and common control classes

atlctrlw.h

command bar class

atlctrlx.h

bitmap button, check list view, and other controls

atlddx.h

data exchange for dialogs and windows

atldlgs.h

common dialog classes, property sheet and page classes

atlfind.h

Find/Replace support for Edit and RichEdit

atlframe.h

frame window classes, MDI, update UI classes

atlgdi.h

DC classes, GDI object classes

atlmisc.h

WTL ports of CPoint, CRect, CSize, CString, etc.

atlprint.h

printing and print preview

atlres.h

standard resource IDs

atlresce.h

standard resource IDs for Windows CE

atlscrl.h

scrollable windows

atlsplit.h

splitter windows

atltheme.h

Windows XP theme classes

atluser.h

menu class, USER object classes

atlwince.h

specific support for Windows CE Mobile platforms

atlwinx.h

extensions of ATL windowing support

 

이 중 atlapp.h가 가장 기본적인 정의 파일이며 나머지는 필요할 때만 인클루드하면 된다. C로 치면 stdio.h쯤 되고 SDK로 치면 windows.h쯤 되는 헤더 파일이다. atlapp.h 인클루드 전에 atlbase.h를 먼저 인클루드해야 하는데 이 헤더 파일은 비주얼 C++의 ATL 폴더에 이미 설치되어 있다. 나머지 헤더 파일들은 atlapp.h가 알아서 인클루드하거나 아니면 필요할 때만 인클루드하면 된다.

그 외 샘플, 나를 읽어줘, 위저드 설치 파일, 라이센스 안내문 등이 있다. 압축만 풀면 설치는 끝나며 다음은 비주얼 스튜디오에서 WTL을 인식할 수 있도록 환경을 조정해야 한다. AppWiz 디렉토리안에는 위저드를 구성하는 파일들과 이 파일을 비주얼 스튜디오 디렉토리로 복사하는 자바 스크립트 파일들이 있다. 자신의 컴파일러와 맞는 스크립트를 실행하면 된다. 비주얼 스튜디오 2005의 경우 AppWiz\setup80.js 파일을 실행하면 된다. setup80x.js는 2005 익스프레스 버전용인데 무료 컴파일러에도 WTL을 쓸 수 있다.

공식적으로 2008은 아직 지원되지 않는다. 비주얼 스튜디오 2003이나 모바일 환경의 개발툴을 사용한다면 관련 마법사도 설치해야 한다. 다음으로 비주얼 스튜디오 2005를 실행한다. 그리고 도구/옵션 메뉴를 선택한 후 VC++ 디렉터리의 Win32플랫폼 포함 파일에 WTL의 include 폴더를 지정한다. 모바일 환경에서 WTL을 사용하려면 플랫폼을 모바일로 변경한 후 include 폴더를 지정해야 한다. 목록에 있기만 하면 되며 반드시 제일 위에 올릴 필요까지는 없다.

이 지정에 의해 컴파일러는 어디서 WTL 클래스를 찾을 수 있는지를 알게 된다. 여기까지만 해 주면 이후부터 WTL을 바로 사용할 수 있다.

이외에 설치에 관한 문제점들은 readme.html 파일이나 인터넷의 강좌들을 참조하기 바란다. 비주얼 C++ 6.0의 경우는 최신 플랫폼 SDK가 있어야 하며 WTL 8.0 이전의 버전은 익스프레스 버전을 지원하지 않는다. 이런 여러 가지 문제를 신경쓰기 싫으면 비주얼 스튜디오 2005를 수단 방법 가리지 말고 구해서 2005에 WTL 8.0 이상의 버전을 설치하면 된다. 실무에서는 어떤 컴파일러를 쓰든 자유지만 공부할 때는 강좌와 개발툴을 맞추는 것이 편리하다.