현재 은행에서 시스템 개발과 유지보수를 하고 있는 프리랜서입니다.
최근 각광받고 있는 웹 인프라에 대해 부족한 점을 많이 느끼다가 아이디어가 떠올라
구현해본 결과에 대해 논의 하고자 합니다.
저는 여기서 턱시도, VB, ORACLE의 3Tier환경에서 계정 시스템 (외환)을 개발하여 비교적
성공적으로 완료한 경험이 있습니다. (600여개 점포에서 운영중입니다.^^)
그런데 여기서 좀 문제가 있습니다. 클라이언트 관리인데요. 물론 수정된 프로그램은
버젼관리시스템을 통해 각 점포로 배포, 유지되고 있습니다. 하지만 워낙 클라이언트
수가 많다보니 별의별 상황이 발생 하지요. 각 유형별로 정리하여 그때그때 해결 하지만
환경의 변화에 따라 새로운 문제가 생기곤 합니다. 바이러스 문제도 그렇구요..
그래서 생각 한게 웹브라우저에 클라이언트를 구현하면 리스크를 좀 줄일 수 있지 않을까
생각을 해보았습니다. 그래서 은행을 꼬드겨서 계정 시스템은 아니지만 본점 특정 부서를
대상으로하는 (총 60유저) 시스템을 웹으로 개발하게 되었습니다.
이건 작년 7월에 완료 했지요. 개발환경은 웹로직에 HTML을 사용하였는데요.
정말 골때리더군요. VB의 인터렉티브한 환경을 브라우저에 구현 하려니 정말 어려웠던게
한두가지가 아니더군요. 시행착오끝에 DHTML에 Behavior를 사용하여 컴퍼넌트 만들고
(HTC였음) EJB간 통신은 XML로 하는데 표준 프로토콜을 쓰지 않고 제가 직접 만들었지요.
일종의 XML-RPC라 해야하나? 사실 그때는 그런것도 몰랐죠.
하여간 여차여차해서 프로젝트를 완료하고 지금 잘 운영 중 인데요. 개발을 해보니
부족한 점이 많더군요. 특히 클라이언트는 좀 불만이 많았습니다.
비생산성에 열악한 디버깅 환경과 복잡함 때문에 유지보수가 문제가 되더군요.
이런 문제를 일거에 해결할 순 없겠지만 개선을 해볼필요가 있다고 생각했습니다.
그래서 고민고민끝에 BinaryBehavior가 해결책이 되지 않을까 하는 생각에 좀 구현해
보았는데요. 일단은 만족합니다. 우선 코드가 노출이 되지않아 보안이 개선되겠구요.
속도가 일반 스크립트에 비교가 되지 않지요. 그리고 스크립트로 구현하기 힘든 부분도
거뜬히 해결이 되구요. 일반 웹디자인툴을 이용하여 화면을 디자인하고 디자인된
엘리먼트에 Behavior를 Attach하면 되니까 생산성도 좋아질꺼라고 기대해 봅니다.
단점이라면 익스플로러가 아니면 안돼죠. 물론 OS는 Windows여야 하구요.
이런 단점을 감수할 수 있다면 한번 써볼만 하다고 생각합니다.
구현된 예제는 통화입력 속성인데요. 은행에선 돈이 중요하기 때문에 금액을
Input할때 천단위 Comma삽입을 통해 제대로 입력하는지 여부를 확인하죠.
그걸 적용해보았는데 그런데로 쓸만 하더군요. 예제는 50%완성 단계라 버그가 좀 있지만
BinaryBehavior의 기능을 확인하는데 문제 없으리라 생각됩니다.
한번 테스트 해보시고 의견좀 올려주세요. 예제는 Zip으로 압축을 했구요 디렉토리에
풀어서 HTML을 실행하면 코드를 설치하고 보안 어쩌고 저쩌고 하는 다이알로그가 뜨면
확인해 주세요.
PS: Binary개발 툴은 Delphi입니다.
제가 여기 오기 전까지는 Delphi를 쭉 써왔기 때문에 C++보다는 편하더라구요.
--------------------------------------------------------------------------------
BinaryBehavior.zip (580442 Bytes)
제목 : Re: 스크립트만으로 하기 힘든 경우는?
글쓴이: EmotionalBrain(goEB) 2003/04/11 10:51:18 조회수:271 줄수:50
스크립트만으로 하기 힘든 경우는 어떠한 것들이 있을까요?
아니 그보다 Binary Behaviors(이하 BB) 를 사용할 경우는 어떠한 것들이 있을까요?
저의 짧은 소견으로는 소켓통신, 파일접근등 시스템 자원을 사용하는 경우가 아니라면
BB 는 사용할 일이 없을 것이라 생각합니다. -_-a
시스템 자원의 접근도 ActiveX 로 --a
시스템 접근은 일반적으로 하나의 객체만 생성할 것이기에 더더욱 그래 보입니다만;;;
BB의 용량이 저렇게 큰데 비하여 작은 기능이고 스크립트로도 가능한 작업이라면
BB를 다운로드 하여 사용한다는게 넘 싫어요! >_<
소스 감추기!? 이벤트!?
오히려 유지보수만 더 어렵지 않을까요?
MS 사이트에도 제대로된 예제 하나 없던것 같던데 -_-a
BB의 이해 예제임에도 불구하고 제가 이해를 못 한 것이니 명쾌한 답변 부탁드립니다.
그럼 즐프하십시오. (__) 꾸벅!
P.S 1 :
만약 님의 경우처럼 서버와 소켓통신하는 것이 필요하다면 가능하면 그냥 브라우저를 이용하던지
ActiveX를 Global형태로 두어서 나머지 Behaviors에서 동적으로 가져다 사용하는 것은 어떨까요?
P.S 2 :
HTML의 유지 보수를 위해서는 위의 예제나 MS에서 명시한 예제에서 나온 것 처럼
OBJECT를 보여지는 HTML 소스에 넣는 것이 아닌, Behaviors(HTC)를 만들어서
OBJECT를 동적으로 생성한뒤에 자신을 불러들인 Element에 동적으로 OBJECT를
대입하는 것은 어떨까요? (편하겠죠.)
이 방법을 P.S 1 에도 적용한다면 ActiveX 를 사용하기에 편하겠죠.
마지막으로 제가 BB만의 장점을 제대로 파악하지 못해서 쓴 글일 수도 있습니다.
제목 : Re: 의견 감사합니다.
글쓴이: 김동준(lion001) 2003/04/12 00:07:24 조회수:127 줄수:33
금액 입력 기능의 경우 캐럿의 위치를 파악하는것이 중요합니다.
캐럿의 위치를 파악하려면 보통 윈도우에서 EM_GETSEL메세지를 이용하죠.
하지만 이것이 브라우저에서는 적용이 안됩니다. 브라우저에서는 동일한 역할을 할 수
있는 것이 TextRange Object인데요. 이것을 스크립트로 구현하게 되면 그
느린속도에 실망하게 되죠. 하지만 Binary Behaviors(이하 BB)로 구현하게되면
문제가 해결됩니다. 그리고 BB의 용량문제를 말씀하셨는데요. 지금 제가 올린 BB에는
금액입력 속성만 있는것은 아닙니다. DataGrid 속성도 구현되어 있는데 제가 확인해본
바로는 대략 20여개 속성을 넣어도 1M가를 넘지 않습니다. 물론 구현을 어떻게 했는냐에
달려 있지만 델파이가아닌 C++로 구현하면 그 용량은 더 줄어들게 됩니다.
DataGrid는 아직 30%정도밖에 진행이 되지 않아 공개를 하지 않았는데요. 주요기능은
이 게시판에도 올라왔었던 내용인데 테이블 Row를 증가하는 기능뿐만 아니라 Data
Binding기술을 응용하여 XML DataSource를 Grid로 표현 합니다.
이것은 Element Behavior (HTC)로 이미 구현되어 실무에서 사용하고 있던 것인에
스크립트의 미흡한 점을 개선하려고 BB로 변환 작업을 하고 있습니다.
P.S: 참고로 DataGrid HTC파일을 올려 드립니다. 저작권은 저에게 있으나 ^^; 실무에
응용하시는것에 대해서는 상관없습니다. 그리고 혹시 실무에 적용하시려면 메일 주세요.
--------------------------------------------------------------------------------
CustomDataGrid.htc (20702 Bytes)
제목 : Re: 혹시 제가 CAB Packaging을 잘못했나 모르겠군요.
글쓴이: 김동준(lion001) 2003/04/12 00:40:21 조회수:96 줄수:3
보내드린 BB예제가 제대로 실행이 안되시는 분들은 실행되고 있는 IE를 모두 종료하고
시도해보세요.
제목 : Re: 답변감사드리구요
글쓴이: EmotionalBrain(goEB) 2003/04/12 02:50:42 조회수:55 줄수:21
답변 감사드립니다.
그리구 님이 만드신 BB를 사용해본 짧은 견해를 말씀드려볼 까 합니다. ^^
BB가 에러 발생하면 열었던 브라우저를 모두 닫구 재실행해야 정상적으로 동작하더군요
열었던 브라우저를 모두 ㅠㅠ
에러 한번 발생하면 난리가 나겠습니다. -_-a
에러 없이 잘 되시길 바라구요
위의 예제 숫자 단위표시하는 거에서
숫자를 붙여넣기 했을 경우도
숫자의 단위가 처리되게 하면 무지무지 좋을 것 같습니다. ^^
그럼 즐프하시길 바랍니다.
제목 : Re: 참고로 말씀드립니다.
글쓴이: 김동준(lion001) 2003/04/12 04:50:35 조회수:104 줄수:19
MSDN에 가보면 아시겠지만 MS에서는 BB를 다음과 같이 소개하고 있습니다.
"While HTML Component (HTC) can be used to provide a generic way of creating
reusable components using scripting languages, binary behaviors can be used to
better protect intellectual property. This is because, unlike an HTC, a binary
behavior is compiled and, thus, cannot be read using the View Source command in a
browser. In addition, binary behaviors do not work through scripting engine
interfaces like HTCs do; instead, they directly call the underlying operating
system, and this allows binary behaviors to have superior performance relative to
HTCs."
소스보기를 통해 소스를 볼수 없다는 부분과, 스크립트 엔진을 통해 실행되지 않고 바로
OS를 Call하기 때문에 HTC에 비교하여 빠른속도 (superior performace)를 보장한다는
것이지요.
제 생각에는 이 솔루션이 범용성을 요하는 인터넷에는 맞지 않다고 생각이 됩니다. 대신
기업의 인트라넷환경에 적합하지 않을까 생각해봅니다.
제목 : Re: BB와 ActiveX의 차이점.
글쓴이: 김동준(lion001) 2003/04/15 00:17:50 조회수:419 줄수:24
자바의 Applet처럼 ActiveX역시 웹을 확장시키는 방법중 하나입니다.
ActiveX역시 BB처럼 Binary코드로 생성되어 시스템 자원을 접근한다던가 파일을 교환하는
등의 작업을 수행하게 됩니다. 이러한 기능은 악의적인 코드가 웹으로 부터 다운로드되어
보안상 문제를 야기할 수 있게되므로 보통 코드사이닝 기법을 이용하게 되죠. 이것은 BB
도 마찬가지입니다.
그렇다면 둘의 차이점은 무얼까요?
ActiveX는 일종의 Application입니다. 웹페이지의 일부분으로 동작하지만 그것이 전부가
될 수 있다는 것이지요. 따라서 ActiveX는 Windows Handle을 가지며 Windows의 관리하에
있게됩니다.
BB의 경우는 Component라 할 수 있겠습니다. 기존 웹페이지 컨트롤들 (DIV, SPAN, INPUT,
P...)에 Attach되어 확장하는 개념이라 하겠습니다. BB는 ActiveX와 달리 IE의 관리하에
있게 됩니다. SPY로 IE를 떠보면 Text INPUT Element의 경우 Handle이 없는것을 확인할
수 있습니다. 이것은 Text Input Element가 Windows의 TextBox Control과 전혀 다르다는
것을 추측케 합니다.
제가 예제로 올렸던 금액입력 속성의 경우 ActiveX버젼과 BB버젼 두가지가 있는데 웹페이지
에 100개 정도를 올려 놓으면 확연하게 차이가 납니다. ActiveX의 경우 웹페이지에
TextBox가 표시되는게 눈으로 일일이 확인이 가능할 정도로 느립니다. 그리고 메모리도
많이 잡아 먹지요. BB는 이런 현상이 전혀 없습니다. 참고하세요..^^
제목 : Re: BB의 구현방법 (서론)
글쓴이: 김동준(lion001) 2003/04/16 23:39:33 조회수:261 줄수:35
BB는 MS의 기술이지요. 따라서 자바서비스넷의 취지와 거리가 있겠지만 IE의 점유율이
높아진 현상황에서 한번쯤 접해보는것은 어떨까요?
BB의 근간은 MS의 COM기술에 의해 구현됩니다. COM기술은 Win95가 나오면서 등장했는데
이것은 DCOM, .NET으로 발전했죠. 윈도우즈에서 전통적인 모듈 공유는 DLL을 통해 이루어
집니다. 하지만 자원의 공유는 어플리케이션과 어플리케이션, 프로세스와 프로세스 그리고
컴퍼넌트와 컴퍼넌트간의 자원공유가 필요해지면서 COM이라는 기술이 생겨난것이지요.
이게 더 발전하게되어 원격지간의 자원공유가 가능하게 되었고 (DCOM) 이기종간의 자원
공유(?)가 가능하게된 것이지요(.NET -> 이것은 좀 논란이되겠군요.^^;)
COM은 out of process (.EXE)와 In process (.DLL, .OCX)로 보여집니다. 파일로 보는 COM
의 모습인데요. BB는 ".DLL"로 보시면 되겠습니다. (ActiveX는 ".OCX"이지요.)
COM을 구현하기위해서는 인터페이스를 이해하셔야 합니다. 최상위 인터페이스 IUnknown으로
부터 COM이 시작된다는거은 아마 많이 보셨을줄 압니다. BB는 IUnknown으로 부터 상속된
IDispatch인터페이스를 구현한 객체입니다. IDispatch인터페이스는 오토메이션을 구현할
수 있는 인터페이스로 보시면 되는데, 여기서 오토메이션이라는것을 이해하 여야 합니다.
간단히 설명하자면 각 객체간의 참조는 상호 속성과 메소드를 사용하는것이지요. 이
개체가 동일한 어플리케이션에 존재한다면 동일 메모리에 속해 있으므로 가상함수 테이블만
참조하면 됩니다. 하지만 개체가 다른 모듈 또는 다른 어플리케이션에 존재 한다면
참조가 조금 복잡하게 됩니다. 예를 들어 BB와 같이 AFEXBhavX.dll모듈에 있는 CEdit개체가
IE.EXE에 있는 HTMLElementBehavior개체를 참조하는 경우가 되겠지요. 이럴때 오토메이션
개체로 구현하여 서로 참조할 수 있도록 하는것입니다. In Process(.dll)일 경우에는
참조시 그다지 복잡하지 않지만 out of process나 원격지간에는 파라미터를 마샬링하는
복잡한 과정을 거치지요. COM 프로그래밍시 반드시 이런 내용을 알아야만 할 수 있는것은
아니지만 고급 프로그래밍에서는 짚고 넘어가야할 내용입니다.
언급한것 처럼 BB는 IDIspatch인터페이스를 구현한것이지만 직접 IDispatch를 구현한 것
은 아닙니다. MS에서는 이런것을 대비하여 몇가지 구현 인터페이스를 제공합니다.
1. IElementBehaviorFactory
2. IElementBehavior
3. 직접적인것은 아니지만 IElementBehaviorSite, IElementBehaviorSiteOM이 있습니다.
본론에서 하나씩 짚고 넘어가도록 하겠습니다.
제목 : Re: BB의 구현방법 (본론 #1)
글쓴이: 김동준(lion001) 2003/04/17 17:51:27 조회수:173 줄수:80
BB의 구현방법을 본격적으로 알아봅시다.
BB를 알기전에 우선 HTC Behaviors부터 알고 넘어가야 하겠습니다. 보통 웹페이지를
구성하기위해서는 HTML과 JavaScript를 이용해야 합니다. 단순한 페이지의 경우 문제가
없지만 복잡하고 방대한 웹사이트의 경우 다수의 페이지와 다양한 로직이 존재하므로
HTML과 JavaScript만 가지고는 개발비용과 유지보수비용 측면에서 상당히 불리합니다.
이런 문제를 무시하고 단순히 클라이언트니까 대수롭지 않게 생각했다가 큰코 다치는
경우가 허다하죠. 보통 개발공수가 Client/Server방식의 3 ~ 5배정도 더 들어간다고 봐도
과언이 아닐 것 입니다. 이 때 생각해볼 수 있는 방법중 하나가 코드를 컴퍼넌트화 하는
것 이지요. 그것이 바로 Behaviors의 역할입니다. Behaviors를 사용 하므로 얻는 효과가
여러가지 이지만 정리하면
1. 컨텐트로부터 쉽게 스크립트를 분리하여 줍니다.
2. 다수의 페이지에 걸쳐 코드의 재사용성을 높여 줍니다.
3. 페이지의 유지보수가 쉬워집니다.
로 요약할 수 있습니다.
Behaviors는 크게 Attached Behaviors와 Element Behaviors로 분류할 수 있습니다.
Attached Behaviors의 경우 각 Element의 Style 속성에 Behaviors를 명시하게 되는데
이경우 도큐먼트가 로드될 때 개별 Element속성에 정의 되어 있는 Behaviors를 각각의
쓰레드가 담당하여 처리하게 됩니다. 속성 정의 문장을 만날때마다 Behaviors가 웹서버로
부터 다운로드 되므로 비정상 상태 오류로 인한 Behaviors의 로드가 실패할 경우 제대로
실행되지 않는 문제가 있습니다.
예) Attached Behaviors를 사용할 경우
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<TITLE></TITLE>
………
</HEAD>
<BODY>
<DIV id=DrawCont style="BORDER-RIGHT: thin solid; BORDER-TOP: thin solid;
BEHAVIOR: url(./Draw.htc); “></DIV> ……
__________________________
</BODY>
</HTML>
Element Behaviors는 Attached Behaviors가 발표된 이후에 나온것이기 때문에 단점을
보완했다고 볼 수 있습니다. 그 이유는 도큐먼트가 로드되기전에 먼저 Behaviors를 먼저
다운로드, 파싱하여 놓고 커스텀 태그를 이용하여 페이지를 구성하게 됩니다. 따라서
비정상 상태 오류일 경우 도큐먼트 자체가 로드가 안되면 안되었지 Behaviors만 로드가
안되는 경우는 없기 때문입니다. 제가 생각하기에는 커스텀태그를 사용하는 것은 단점으로
작용할 수도 있다고 생각합니다. 그이유는 기존의 웹디자인툴 (드림위버, 나모…)에서
커스텀 태그를 표현할 방법이 없기 때문입니다. 이런 이유로 인해 Element Behavior를
적극 사용할 경우 이런 툴들과는 작별을 고하고 텍스트 에디터 (저는 Vi) 에 의존해
페이지를 작성하는 원시적인 방법으로 회기해야 합니다. 생산성과는 거리가 멀어진다고
할 수 있죠. ㅜㅜ (이런 이유로 저는 BB를 생각하게 되었답니다.)
예) Element Behaviors를 사용할 경우
<HTML xmlns:test>
----------
<HEAD>
<?import namespace=test implementation=./Draw.htc>
--------------------------------------------------
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<TITLE></TITLE>
…….
</HEAD>
<BODY>
<test:Draw id=DrawCont style="BORDER-RIGHT: thin solid; BORDER-TOP: thin solid;
----------
BORDER-LEFT: thin solid; WIDTH: 200px; BORDER-BOTTOM: thin solid;
POSITION: absolute; HEIGHT: 200px" LANGUAGE=javascript onfocus="return DrawCont_onfocus()"
onblur="return DrawCont_onblur()"></test:Draw> ……
------------
</BODY>
</HTML>
대충 이렇습니다. ^^
Attached Behaviors, Element Behaviors 어느것이든지 캡슐화된 컴퍼넌트로 사용하게
되므로 Behaviors가 제공하는 속성, 메소드, 이벤트를 가지고 스크립트를 작성하면 됩니다.
대충 짐작이 가시는지요?
이해를 돕기위해 Sample을 올립니다. 압축되어 있는 파일을 푸시고 htm파일을 실행해 보세요.
P.S: 우선 여기서 한템포 쉬고 BB에 대해서 알아보겠습니다. 지금 올린 HTC 샘플을 그대로
BB로 전환해보도록 하죠.
--------------------------------------------------------------------------------
Draw.zip (1670 Bytes)
제목 : Re: BB의 구현방법 (본론 #2)
글쓴이: 김동준(lion001) 2003/04/22 15:55:45 조회수:221 줄수:113
언급한것처럼 BB를 만들기위해 구현해야할 인터페이스들이 있습니다. 이 인터페이스들을
구현하기위해서 C++이나 Delphi에 대한 지식이 있어야 합니다. 저는 Delphi에 익숙하여
Delphi로 구현하였습니다. MSDN에는 C++의 ATL을 이용하여야만 된다고 나와 있지만 COM개체를
생성할 수 있는 어떤 언어든지 가능합니다. 참고로 제가 VisualBasic으로 구현하다가
포기했습니다. 그 이유는 EventSink를 구현할 방법이 없기 때문입니다. IDispatch를 구현한
개체를 대상 개체에 Advise시켜야 하는데 이게 VisualBasic에서 구현이 안되더군요. 하지만
EventSink를 쓰지 않을거라면 VisualBasic으로도 가능하겠습니다. 여기서 EventSink란 대상
Element의 이벤트 (키, 마우스 입력, 이벤트)를 인터셉트하는 것 을 의미합니다.
자 그럼 BB에 대해 알아보겠습니다.
1. IElementBehaviorFactory를 구현해야 합니다. 이 인터페이스의 역할은 IE의 Element와
BB를 연결하여주는 가교 역할을 한다고 보시면 됩니다.
- IElementBehaviorFactory의 멤버 FindBehavior메소드를 구현합니다. 이 메소드의 역할은
실제 처리하려는 로직을 구현한 오브젝트를 찾아 인스턴스를 생성하고 Element와 연결
시킵니다.
C++
HRESULT FindBehavior(BSTR bstrBehavior, BSTR bstrBehaviorUrl, IElementBehaviorSite* pSite,
IElmentBehavior** ppBehavior)
Delphi(Pascal)
function FindBehavior(const bstrBehavior: WideString; const bstrBehaviorUrl: WideString;
const pSite: IElementBehaviorSite; out ppBehavior: ElementBehavior): HResult; stdcall;
2. IElementBehavior를 구현합니다. 이 인터페이스의 역할은 HTC의 본문에 해당 합니다.
실제 로직이 구현되어 있습니다.
- 멤버 Init메소드를 구현합니다. 이 메소드는 FindBehavior메소드로 Behavior가 인스턴스화될
때 실행 됩니다. 보통 IElementBehaviorSite를 취하기 위한 처리를 합니다.
(IElementBehaviorSite는 HTML Element를 얻을 수 있는 메소드를 제공하여 줍니다.)
C++
HRESULT Init( IElementBehaviorSite* pBehaviorSite)
Delphi(Pascal)
function Init(const pBehaviorSite: IElementBehaviorSite): HResult; stdcall;
- 멤버 Notify메소드를 구현합니다. 이 메소드는 Behavior가 로드되어 파싱 중 이거나 Behavior가
Element에 완전히 Attach되었을때 실행 됩니다. 샘플에서는 Inner Div Element생성과 position을
설정하는 로직이 여기에 구현되어 있고 이벤트를 인터셉트하기위한 EventSink개체를 Advise하는
로직도 구현되어 있습니다.
C++
HRESULT Notify(LONG lEvent, VARIANT* pVar);
Delphi(Pascal)
function Notify(lEvent: Integer; var pVar: OleVariant): HResult; stdcall;
- 멤버 Detach메소드를 구현합니다. 이 메소드는 Behavior가 Element로부터 떨어질 때 실행
됩니다.
C++
HRESULT Detach(VOID)
Delphi(Pascal)
function Detach: HResult; stdcall;
- 멤버 GetIDsOfNames메소드를 구현합니다. 이 메소드는 Behavior의 속성 (Xpos, Ypos)를
매핑하는 역할을 합니다. 매핑된 속성은 Invoke메소드에서 구현 됩니다.
C++
HRESULT GetIDsOfNames(REFID rrid, OLECHAR FAR* rgszNames, unsigned int cNames,
LCID lcid, DISPID FAR* rgDispId);
Delphi(Pascal)
function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer;
DispIDs: Pointer): HResult; override; stdcall;
- Invoke메소드를 구현합니다. 이 메소드는 GetIDsOfNames메소드에서 매핑된 속성을 구현하려고 할
때 사용 합니다.
C++
HRESULT Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr);
Delphi(Pascal)
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;Flags: Word;
var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; override; stdcall;
3. IEventSink를 구현합니다. 이 인터페이스의 역할을 사용자 키 입력 이벤트를 인터셉트하여
특정처리를 하고자 할 때 사용됩니다. 샘플에서는 화살표키 입력을 인터셉트하여 사각형안의
캐릭터를 움직이는데 사용합니다.
4. 컴파일 합니다.
5. 생성된 모듈을 HTML에서 정의 하는 방법.
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<object id="Draw" classid="clsid:1781D747-5E5D-47D3-A531-5D40EEF4D343"
----------------------------------------------------------------------
codebase="./AFEXBhavX.cab#version=1,0,0,1"></object>
----------------------------------------------------
<TITLE></TITLE>
………
</HEAD>
<BODY>
<DIV id=DrawCont style="BORDER-RIGHT: thin solid; BORDER-TOP: thin solid;
BEHAVIOR: url(#Draw); “></DIV> ……
_________________________
</BODY>
</HTML>
전체 소스를 설명하기에는 양이 많아 메소드 프로토타입에 관련된 사항만 정리 하였습니다.
소스를 보시고 싶으신 분은 제게 말씀하여 주시면 보내드리도록 하지요. 컴파일된 모듈과 HTM을 우선 올립니다.
전에 제가 올렸던 Cedit샘플과 같은 요령으로 압축을 푸시고 HTM을 실행해 보세요.
P.S 실행하기전에 IE는 모두 종료하시고 하세요. 제가 테스트 인증서를 포함하여 패키징 하였으나 로컬환경에서는
제대로 동작을 안하네요. 방법을 도무지 모르겠네요. 이해하시기 바랍니다. 혹시 방법 아시는분은 좀..
--------------------------------------------------------------------------------
BinaryBehavior.zip (586819 Bytes)
제목 : Re: BB의 구현방법 (결론?)
글쓴이: 김동준(lion001) 2003/04/22 18:38:09 조회수:123 줄수:20
결론을 내기에는 부족한 면이 있습니다만, 여기서 이만 줄일까 합니다. 제가 보는 BB는
상당히 유용하다”입니다. 클라이언트가 thin으로 가는 추세라고 한다면 모든 Biz Logic은
서버상에서 구현되고 클라이언트는 유저와의 인터페이스를 담당하는 단말로서의 기능에
충실해야 합니다. 저는 이 부분에 주목합니다. Script가 최소화된 컴퓨팅을위해 BB의 역할이
클것이라 생각 됩니다.
기초적인 인프라 컨트롤들을 BB로 작성하고 재사용을 통해 확장하여 하나의 프레임웍으로
만든다면 생산성과 유지보수 측면에서 충분한 효과가 있을것이라고 생각합니다.
게다가 JSF, ASP.NET등과 결합한다면 금상첨화이겠지요. 오직 IE에서만 돌아간다는점을 빼고말입니다.
이게 치명적이라 생각하지 않습니다. 서두에서도 말했지만 어디까지나 인트라넷에서 적용한다는
전제를 두고 본다면 문제 없을꺼라 생각합니다. 프레임웍으로의 발전은 단계적 상속, 확장을 통해서
가능할 것입니다. 가령 DataGrid Control을 만들었다면 이것을 확장하여 DropDown List Control을
만들 수 있을거구요. 이것을 확장, 상속하여 우편번호 리스팅을 한다거나 코드리스트를 팝업할 수
있는 기능으로 발전시킬 수 있겠지요. 지금 이것을 한번 시도해보려고 합니다. 관심 있으신분과 서로
의견 교환을 했으면 합니다.
그동안 변변찮은 내용 보시느라 수고 많이 하셨습니다.
감사합니다.
최근 각광받고 있는 웹 인프라에 대해 부족한 점을 많이 느끼다가 아이디어가 떠올라
구현해본 결과에 대해 논의 하고자 합니다.
저는 여기서 턱시도, VB, ORACLE의 3Tier환경에서 계정 시스템 (외환)을 개발하여 비교적
성공적으로 완료한 경험이 있습니다. (600여개 점포에서 운영중입니다.^^)
그런데 여기서 좀 문제가 있습니다. 클라이언트 관리인데요. 물론 수정된 프로그램은
버젼관리시스템을 통해 각 점포로 배포, 유지되고 있습니다. 하지만 워낙 클라이언트
수가 많다보니 별의별 상황이 발생 하지요. 각 유형별로 정리하여 그때그때 해결 하지만
환경의 변화에 따라 새로운 문제가 생기곤 합니다. 바이러스 문제도 그렇구요..
그래서 생각 한게 웹브라우저에 클라이언트를 구현하면 리스크를 좀 줄일 수 있지 않을까
생각을 해보았습니다. 그래서 은행을 꼬드겨서 계정 시스템은 아니지만 본점 특정 부서를
대상으로하는 (총 60유저) 시스템을 웹으로 개발하게 되었습니다.
이건 작년 7월에 완료 했지요. 개발환경은 웹로직에 HTML을 사용하였는데요.
정말 골때리더군요. VB의 인터렉티브한 환경을 브라우저에 구현 하려니 정말 어려웠던게
한두가지가 아니더군요. 시행착오끝에 DHTML에 Behavior를 사용하여 컴퍼넌트 만들고
(HTC였음) EJB간 통신은 XML로 하는데 표준 프로토콜을 쓰지 않고 제가 직접 만들었지요.
일종의 XML-RPC라 해야하나? 사실 그때는 그런것도 몰랐죠.
하여간 여차여차해서 프로젝트를 완료하고 지금 잘 운영 중 인데요. 개발을 해보니
부족한 점이 많더군요. 특히 클라이언트는 좀 불만이 많았습니다.
비생산성에 열악한 디버깅 환경과 복잡함 때문에 유지보수가 문제가 되더군요.
이런 문제를 일거에 해결할 순 없겠지만 개선을 해볼필요가 있다고 생각했습니다.
그래서 고민고민끝에 BinaryBehavior가 해결책이 되지 않을까 하는 생각에 좀 구현해
보았는데요. 일단은 만족합니다. 우선 코드가 노출이 되지않아 보안이 개선되겠구요.
속도가 일반 스크립트에 비교가 되지 않지요. 그리고 스크립트로 구현하기 힘든 부분도
거뜬히 해결이 되구요. 일반 웹디자인툴을 이용하여 화면을 디자인하고 디자인된
엘리먼트에 Behavior를 Attach하면 되니까 생산성도 좋아질꺼라고 기대해 봅니다.
단점이라면 익스플로러가 아니면 안돼죠. 물론 OS는 Windows여야 하구요.
이런 단점을 감수할 수 있다면 한번 써볼만 하다고 생각합니다.
구현된 예제는 통화입력 속성인데요. 은행에선 돈이 중요하기 때문에 금액을
Input할때 천단위 Comma삽입을 통해 제대로 입력하는지 여부를 확인하죠.
그걸 적용해보았는데 그런데로 쓸만 하더군요. 예제는 50%완성 단계라 버그가 좀 있지만
BinaryBehavior의 기능을 확인하는데 문제 없으리라 생각됩니다.
한번 테스트 해보시고 의견좀 올려주세요. 예제는 Zip으로 압축을 했구요 디렉토리에
풀어서 HTML을 실행하면 코드를 설치하고 보안 어쩌고 저쩌고 하는 다이알로그가 뜨면
확인해 주세요.
PS: Binary개발 툴은 Delphi입니다.
제가 여기 오기 전까지는 Delphi를 쭉 써왔기 때문에 C++보다는 편하더라구요.
--------------------------------------------------------------------------------
BinaryBehavior.zip (580442 Bytes)
제목 : Re: 스크립트만으로 하기 힘든 경우는?
글쓴이: EmotionalBrain(goEB) 2003/04/11 10:51:18 조회수:271 줄수:50
스크립트만으로 하기 힘든 경우는 어떠한 것들이 있을까요?
아니 그보다 Binary Behaviors(이하 BB) 를 사용할 경우는 어떠한 것들이 있을까요?
저의 짧은 소견으로는 소켓통신, 파일접근등 시스템 자원을 사용하는 경우가 아니라면
BB 는 사용할 일이 없을 것이라 생각합니다. -_-a
시스템 자원의 접근도 ActiveX 로 --a
시스템 접근은 일반적으로 하나의 객체만 생성할 것이기에 더더욱 그래 보입니다만;;;
BB의 용량이 저렇게 큰데 비하여 작은 기능이고 스크립트로도 가능한 작업이라면
BB를 다운로드 하여 사용한다는게 넘 싫어요! >_<
소스 감추기!? 이벤트!?
오히려 유지보수만 더 어렵지 않을까요?
MS 사이트에도 제대로된 예제 하나 없던것 같던데 -_-a
BB의 이해 예제임에도 불구하고 제가 이해를 못 한 것이니 명쾌한 답변 부탁드립니다.
그럼 즐프하십시오. (__) 꾸벅!
P.S 1 :
만약 님의 경우처럼 서버와 소켓통신하는 것이 필요하다면 가능하면 그냥 브라우저를 이용하던지
ActiveX를 Global형태로 두어서 나머지 Behaviors에서 동적으로 가져다 사용하는 것은 어떨까요?
P.S 2 :
HTML의 유지 보수를 위해서는 위의 예제나 MS에서 명시한 예제에서 나온 것 처럼
OBJECT를 보여지는 HTML 소스에 넣는 것이 아닌, Behaviors(HTC)를 만들어서
OBJECT를 동적으로 생성한뒤에 자신을 불러들인 Element에 동적으로 OBJECT를
대입하는 것은 어떨까요? (편하겠죠.)
이 방법을 P.S 1 에도 적용한다면 ActiveX 를 사용하기에 편하겠죠.
마지막으로 제가 BB만의 장점을 제대로 파악하지 못해서 쓴 글일 수도 있습니다.
제목 : Re: 의견 감사합니다.
글쓴이: 김동준(lion001) 2003/04/12 00:07:24 조회수:127 줄수:33
금액 입력 기능의 경우 캐럿의 위치를 파악하는것이 중요합니다.
캐럿의 위치를 파악하려면 보통 윈도우에서 EM_GETSEL메세지를 이용하죠.
하지만 이것이 브라우저에서는 적용이 안됩니다. 브라우저에서는 동일한 역할을 할 수
있는 것이 TextRange Object인데요. 이것을 스크립트로 구현하게 되면 그
느린속도에 실망하게 되죠. 하지만 Binary Behaviors(이하 BB)로 구현하게되면
문제가 해결됩니다. 그리고 BB의 용량문제를 말씀하셨는데요. 지금 제가 올린 BB에는
금액입력 속성만 있는것은 아닙니다. DataGrid 속성도 구현되어 있는데 제가 확인해본
바로는 대략 20여개 속성을 넣어도 1M가를 넘지 않습니다. 물론 구현을 어떻게 했는냐에
달려 있지만 델파이가아닌 C++로 구현하면 그 용량은 더 줄어들게 됩니다.
DataGrid는 아직 30%정도밖에 진행이 되지 않아 공개를 하지 않았는데요. 주요기능은
이 게시판에도 올라왔었던 내용인데 테이블 Row를 증가하는 기능뿐만 아니라 Data
Binding기술을 응용하여 XML DataSource를 Grid로 표현 합니다.
이것은 Element Behavior (HTC)로 이미 구현되어 실무에서 사용하고 있던 것인에
스크립트의 미흡한 점을 개선하려고 BB로 변환 작업을 하고 있습니다.
P.S: 참고로 DataGrid HTC파일을 올려 드립니다. 저작권은 저에게 있으나 ^^; 실무에
응용하시는것에 대해서는 상관없습니다. 그리고 혹시 실무에 적용하시려면 메일 주세요.
--------------------------------------------------------------------------------
CustomDataGrid.htc (20702 Bytes)
제목 : Re: 혹시 제가 CAB Packaging을 잘못했나 모르겠군요.
글쓴이: 김동준(lion001) 2003/04/12 00:40:21 조회수:96 줄수:3
보내드린 BB예제가 제대로 실행이 안되시는 분들은 실행되고 있는 IE를 모두 종료하고
시도해보세요.
제목 : Re: 답변감사드리구요
글쓴이: EmotionalBrain(goEB) 2003/04/12 02:50:42 조회수:55 줄수:21
답변 감사드립니다.
그리구 님이 만드신 BB를 사용해본 짧은 견해를 말씀드려볼 까 합니다. ^^
BB가 에러 발생하면 열었던 브라우저를 모두 닫구 재실행해야 정상적으로 동작하더군요
열었던 브라우저를 모두 ㅠㅠ
에러 한번 발생하면 난리가 나겠습니다. -_-a
에러 없이 잘 되시길 바라구요
위의 예제 숫자 단위표시하는 거에서
숫자를 붙여넣기 했을 경우도
숫자의 단위가 처리되게 하면 무지무지 좋을 것 같습니다. ^^
그럼 즐프하시길 바랍니다.
제목 : Re: 참고로 말씀드립니다.
글쓴이: 김동준(lion001) 2003/04/12 04:50:35 조회수:104 줄수:19
MSDN에 가보면 아시겠지만 MS에서는 BB를 다음과 같이 소개하고 있습니다.
"While HTML Component (HTC) can be used to provide a generic way of creating
reusable components using scripting languages, binary behaviors can be used to
better protect intellectual property. This is because, unlike an HTC, a binary
behavior is compiled and, thus, cannot be read using the View Source command in a
browser. In addition, binary behaviors do not work through scripting engine
interfaces like HTCs do; instead, they directly call the underlying operating
system, and this allows binary behaviors to have superior performance relative to
HTCs."
소스보기를 통해 소스를 볼수 없다는 부분과, 스크립트 엔진을 통해 실행되지 않고 바로
OS를 Call하기 때문에 HTC에 비교하여 빠른속도 (superior performace)를 보장한다는
것이지요.
제 생각에는 이 솔루션이 범용성을 요하는 인터넷에는 맞지 않다고 생각이 됩니다. 대신
기업의 인트라넷환경에 적합하지 않을까 생각해봅니다.
제목 : Re: BB와 ActiveX의 차이점.
글쓴이: 김동준(lion001) 2003/04/15 00:17:50 조회수:419 줄수:24
자바의 Applet처럼 ActiveX역시 웹을 확장시키는 방법중 하나입니다.
ActiveX역시 BB처럼 Binary코드로 생성되어 시스템 자원을 접근한다던가 파일을 교환하는
등의 작업을 수행하게 됩니다. 이러한 기능은 악의적인 코드가 웹으로 부터 다운로드되어
보안상 문제를 야기할 수 있게되므로 보통 코드사이닝 기법을 이용하게 되죠. 이것은 BB
도 마찬가지입니다.
그렇다면 둘의 차이점은 무얼까요?
ActiveX는 일종의 Application입니다. 웹페이지의 일부분으로 동작하지만 그것이 전부가
될 수 있다는 것이지요. 따라서 ActiveX는 Windows Handle을 가지며 Windows의 관리하에
있게됩니다.
BB의 경우는 Component라 할 수 있겠습니다. 기존 웹페이지 컨트롤들 (DIV, SPAN, INPUT,
P...)에 Attach되어 확장하는 개념이라 하겠습니다. BB는 ActiveX와 달리 IE의 관리하에
있게 됩니다. SPY로 IE를 떠보면 Text INPUT Element의 경우 Handle이 없는것을 확인할
수 있습니다. 이것은 Text Input Element가 Windows의 TextBox Control과 전혀 다르다는
것을 추측케 합니다.
제가 예제로 올렸던 금액입력 속성의 경우 ActiveX버젼과 BB버젼 두가지가 있는데 웹페이지
에 100개 정도를 올려 놓으면 확연하게 차이가 납니다. ActiveX의 경우 웹페이지에
TextBox가 표시되는게 눈으로 일일이 확인이 가능할 정도로 느립니다. 그리고 메모리도
많이 잡아 먹지요. BB는 이런 현상이 전혀 없습니다. 참고하세요..^^
제목 : Re: BB의 구현방법 (서론)
글쓴이: 김동준(lion001) 2003/04/16 23:39:33 조회수:261 줄수:35
BB는 MS의 기술이지요. 따라서 자바서비스넷의 취지와 거리가 있겠지만 IE의 점유율이
높아진 현상황에서 한번쯤 접해보는것은 어떨까요?
BB의 근간은 MS의 COM기술에 의해 구현됩니다. COM기술은 Win95가 나오면서 등장했는데
이것은 DCOM, .NET으로 발전했죠. 윈도우즈에서 전통적인 모듈 공유는 DLL을 통해 이루어
집니다. 하지만 자원의 공유는 어플리케이션과 어플리케이션, 프로세스와 프로세스 그리고
컴퍼넌트와 컴퍼넌트간의 자원공유가 필요해지면서 COM이라는 기술이 생겨난것이지요.
이게 더 발전하게되어 원격지간의 자원공유가 가능하게 되었고 (DCOM) 이기종간의 자원
공유(?)가 가능하게된 것이지요(.NET -> 이것은 좀 논란이되겠군요.^^;)
COM은 out of process (.EXE)와 In process (.DLL, .OCX)로 보여집니다. 파일로 보는 COM
의 모습인데요. BB는 ".DLL"로 보시면 되겠습니다. (ActiveX는 ".OCX"이지요.)
COM을 구현하기위해서는 인터페이스를 이해하셔야 합니다. 최상위 인터페이스 IUnknown으로
부터 COM이 시작된다는거은 아마 많이 보셨을줄 압니다. BB는 IUnknown으로 부터 상속된
IDispatch인터페이스를 구현한 객체입니다. IDispatch인터페이스는 오토메이션을 구현할
수 있는 인터페이스로 보시면 되는데, 여기서 오토메이션이라는것을 이해하 여야 합니다.
간단히 설명하자면 각 객체간의 참조는 상호 속성과 메소드를 사용하는것이지요. 이
개체가 동일한 어플리케이션에 존재한다면 동일 메모리에 속해 있으므로 가상함수 테이블만
참조하면 됩니다. 하지만 개체가 다른 모듈 또는 다른 어플리케이션에 존재 한다면
참조가 조금 복잡하게 됩니다. 예를 들어 BB와 같이 AFEXBhavX.dll모듈에 있는 CEdit개체가
IE.EXE에 있는 HTMLElementBehavior개체를 참조하는 경우가 되겠지요. 이럴때 오토메이션
개체로 구현하여 서로 참조할 수 있도록 하는것입니다. In Process(.dll)일 경우에는
참조시 그다지 복잡하지 않지만 out of process나 원격지간에는 파라미터를 마샬링하는
복잡한 과정을 거치지요. COM 프로그래밍시 반드시 이런 내용을 알아야만 할 수 있는것은
아니지만 고급 프로그래밍에서는 짚고 넘어가야할 내용입니다.
언급한것 처럼 BB는 IDIspatch인터페이스를 구현한것이지만 직접 IDispatch를 구현한 것
은 아닙니다. MS에서는 이런것을 대비하여 몇가지 구현 인터페이스를 제공합니다.
1. IElementBehaviorFactory
2. IElementBehavior
3. 직접적인것은 아니지만 IElementBehaviorSite, IElementBehaviorSiteOM이 있습니다.
본론에서 하나씩 짚고 넘어가도록 하겠습니다.
제목 : Re: BB의 구현방법 (본론 #1)
글쓴이: 김동준(lion001) 2003/04/17 17:51:27 조회수:173 줄수:80
BB의 구현방법을 본격적으로 알아봅시다.
BB를 알기전에 우선 HTC Behaviors부터 알고 넘어가야 하겠습니다. 보통 웹페이지를
구성하기위해서는 HTML과 JavaScript를 이용해야 합니다. 단순한 페이지의 경우 문제가
없지만 복잡하고 방대한 웹사이트의 경우 다수의 페이지와 다양한 로직이 존재하므로
HTML과 JavaScript만 가지고는 개발비용과 유지보수비용 측면에서 상당히 불리합니다.
이런 문제를 무시하고 단순히 클라이언트니까 대수롭지 않게 생각했다가 큰코 다치는
경우가 허다하죠. 보통 개발공수가 Client/Server방식의 3 ~ 5배정도 더 들어간다고 봐도
과언이 아닐 것 입니다. 이 때 생각해볼 수 있는 방법중 하나가 코드를 컴퍼넌트화 하는
것 이지요. 그것이 바로 Behaviors의 역할입니다. Behaviors를 사용 하므로 얻는 효과가
여러가지 이지만 정리하면
1. 컨텐트로부터 쉽게 스크립트를 분리하여 줍니다.
2. 다수의 페이지에 걸쳐 코드의 재사용성을 높여 줍니다.
3. 페이지의 유지보수가 쉬워집니다.
로 요약할 수 있습니다.
Behaviors는 크게 Attached Behaviors와 Element Behaviors로 분류할 수 있습니다.
Attached Behaviors의 경우 각 Element의 Style 속성에 Behaviors를 명시하게 되는데
이경우 도큐먼트가 로드될 때 개별 Element속성에 정의 되어 있는 Behaviors를 각각의
쓰레드가 담당하여 처리하게 됩니다. 속성 정의 문장을 만날때마다 Behaviors가 웹서버로
부터 다운로드 되므로 비정상 상태 오류로 인한 Behaviors의 로드가 실패할 경우 제대로
실행되지 않는 문제가 있습니다.
예) Attached Behaviors를 사용할 경우
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<TITLE></TITLE>
………
</HEAD>
<BODY>
<DIV id=DrawCont style="BORDER-RIGHT: thin solid; BORDER-TOP: thin solid;
BEHAVIOR: url(./Draw.htc); “></DIV> ……
__________________________
</BODY>
</HTML>
Element Behaviors는 Attached Behaviors가 발표된 이후에 나온것이기 때문에 단점을
보완했다고 볼 수 있습니다. 그 이유는 도큐먼트가 로드되기전에 먼저 Behaviors를 먼저
다운로드, 파싱하여 놓고 커스텀 태그를 이용하여 페이지를 구성하게 됩니다. 따라서
비정상 상태 오류일 경우 도큐먼트 자체가 로드가 안되면 안되었지 Behaviors만 로드가
안되는 경우는 없기 때문입니다. 제가 생각하기에는 커스텀태그를 사용하는 것은 단점으로
작용할 수도 있다고 생각합니다. 그이유는 기존의 웹디자인툴 (드림위버, 나모…)에서
커스텀 태그를 표현할 방법이 없기 때문입니다. 이런 이유로 인해 Element Behavior를
적극 사용할 경우 이런 툴들과는 작별을 고하고 텍스트 에디터 (저는 Vi) 에 의존해
페이지를 작성하는 원시적인 방법으로 회기해야 합니다. 생산성과는 거리가 멀어진다고
할 수 있죠. ㅜㅜ (이런 이유로 저는 BB를 생각하게 되었답니다.)
예) Element Behaviors를 사용할 경우
<HTML xmlns:test>
----------
<HEAD>
<?import namespace=test implementation=./Draw.htc>
--------------------------------------------------
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<TITLE></TITLE>
…….
</HEAD>
<BODY>
<test:Draw id=DrawCont style="BORDER-RIGHT: thin solid; BORDER-TOP: thin solid;
----------
BORDER-LEFT: thin solid; WIDTH: 200px; BORDER-BOTTOM: thin solid;
POSITION: absolute; HEIGHT: 200px" LANGUAGE=javascript onfocus="return DrawCont_onfocus()"
onblur="return DrawCont_onblur()"></test:Draw> ……
------------
</BODY>
</HTML>
대충 이렇습니다. ^^
Attached Behaviors, Element Behaviors 어느것이든지 캡슐화된 컴퍼넌트로 사용하게
되므로 Behaviors가 제공하는 속성, 메소드, 이벤트를 가지고 스크립트를 작성하면 됩니다.
대충 짐작이 가시는지요?
이해를 돕기위해 Sample을 올립니다. 압축되어 있는 파일을 푸시고 htm파일을 실행해 보세요.
P.S: 우선 여기서 한템포 쉬고 BB에 대해서 알아보겠습니다. 지금 올린 HTC 샘플을 그대로
BB로 전환해보도록 하죠.
--------------------------------------------------------------------------------
Draw.zip (1670 Bytes)
제목 : Re: BB의 구현방법 (본론 #2)
글쓴이: 김동준(lion001) 2003/04/22 15:55:45 조회수:221 줄수:113
언급한것처럼 BB를 만들기위해 구현해야할 인터페이스들이 있습니다. 이 인터페이스들을
구현하기위해서 C++이나 Delphi에 대한 지식이 있어야 합니다. 저는 Delphi에 익숙하여
Delphi로 구현하였습니다. MSDN에는 C++의 ATL을 이용하여야만 된다고 나와 있지만 COM개체를
생성할 수 있는 어떤 언어든지 가능합니다. 참고로 제가 VisualBasic으로 구현하다가
포기했습니다. 그 이유는 EventSink를 구현할 방법이 없기 때문입니다. IDispatch를 구현한
개체를 대상 개체에 Advise시켜야 하는데 이게 VisualBasic에서 구현이 안되더군요. 하지만
EventSink를 쓰지 않을거라면 VisualBasic으로도 가능하겠습니다. 여기서 EventSink란 대상
Element의 이벤트 (키, 마우스 입력, 이벤트)를 인터셉트하는 것 을 의미합니다.
자 그럼 BB에 대해 알아보겠습니다.
1. IElementBehaviorFactory를 구현해야 합니다. 이 인터페이스의 역할은 IE의 Element와
BB를 연결하여주는 가교 역할을 한다고 보시면 됩니다.
- IElementBehaviorFactory의 멤버 FindBehavior메소드를 구현합니다. 이 메소드의 역할은
실제 처리하려는 로직을 구현한 오브젝트를 찾아 인스턴스를 생성하고 Element와 연결
시킵니다.
C++
HRESULT FindBehavior(BSTR bstrBehavior, BSTR bstrBehaviorUrl, IElementBehaviorSite* pSite,
IElmentBehavior** ppBehavior)
Delphi(Pascal)
function FindBehavior(const bstrBehavior: WideString; const bstrBehaviorUrl: WideString;
const pSite: IElementBehaviorSite; out ppBehavior: ElementBehavior): HResult; stdcall;
2. IElementBehavior를 구현합니다. 이 인터페이스의 역할은 HTC의 본문에 해당 합니다.
실제 로직이 구현되어 있습니다.
- 멤버 Init메소드를 구현합니다. 이 메소드는 FindBehavior메소드로 Behavior가 인스턴스화될
때 실행 됩니다. 보통 IElementBehaviorSite를 취하기 위한 처리를 합니다.
(IElementBehaviorSite는 HTML Element를 얻을 수 있는 메소드를 제공하여 줍니다.)
C++
HRESULT Init( IElementBehaviorSite* pBehaviorSite)
Delphi(Pascal)
function Init(const pBehaviorSite: IElementBehaviorSite): HResult; stdcall;
- 멤버 Notify메소드를 구현합니다. 이 메소드는 Behavior가 로드되어 파싱 중 이거나 Behavior가
Element에 완전히 Attach되었을때 실행 됩니다. 샘플에서는 Inner Div Element생성과 position을
설정하는 로직이 여기에 구현되어 있고 이벤트를 인터셉트하기위한 EventSink개체를 Advise하는
로직도 구현되어 있습니다.
C++
HRESULT Notify(LONG lEvent, VARIANT* pVar);
Delphi(Pascal)
function Notify(lEvent: Integer; var pVar: OleVariant): HResult; stdcall;
- 멤버 Detach메소드를 구현합니다. 이 메소드는 Behavior가 Element로부터 떨어질 때 실행
됩니다.
C++
HRESULT Detach(VOID)
Delphi(Pascal)
function Detach: HResult; stdcall;
- 멤버 GetIDsOfNames메소드를 구현합니다. 이 메소드는 Behavior의 속성 (Xpos, Ypos)를
매핑하는 역할을 합니다. 매핑된 속성은 Invoke메소드에서 구현 됩니다.
C++
HRESULT GetIDsOfNames(REFID rrid, OLECHAR FAR* rgszNames, unsigned int cNames,
LCID lcid, DISPID FAR* rgDispId);
Delphi(Pascal)
function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer;
DispIDs: Pointer): HResult; override; stdcall;
- Invoke메소드를 구현합니다. 이 메소드는 GetIDsOfNames메소드에서 매핑된 속성을 구현하려고 할
때 사용 합니다.
C++
HRESULT Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,
DISPPARAMS FAR* pDispParams, VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr);
Delphi(Pascal)
function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;Flags: Word;
var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; override; stdcall;
3. IEventSink를 구현합니다. 이 인터페이스의 역할을 사용자 키 입력 이벤트를 인터셉트하여
특정처리를 하고자 할 때 사용됩니다. 샘플에서는 화살표키 입력을 인터셉트하여 사각형안의
캐릭터를 움직이는데 사용합니다.
4. 컴파일 합니다.
5. 생성된 모듈을 HTML에서 정의 하는 방법.
<HTML>
<HEAD>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<object id="Draw" classid="clsid:1781D747-5E5D-47D3-A531-5D40EEF4D343"
----------------------------------------------------------------------
codebase="./AFEXBhavX.cab#version=1,0,0,1"></object>
----------------------------------------------------
<TITLE></TITLE>
………
</HEAD>
<BODY>
<DIV id=DrawCont style="BORDER-RIGHT: thin solid; BORDER-TOP: thin solid;
BEHAVIOR: url(#Draw); “></DIV> ……
_________________________
</BODY>
</HTML>
전체 소스를 설명하기에는 양이 많아 메소드 프로토타입에 관련된 사항만 정리 하였습니다.
소스를 보시고 싶으신 분은 제게 말씀하여 주시면 보내드리도록 하지요. 컴파일된 모듈과 HTM을 우선 올립니다.
전에 제가 올렸던 Cedit샘플과 같은 요령으로 압축을 푸시고 HTM을 실행해 보세요.
P.S 실행하기전에 IE는 모두 종료하시고 하세요. 제가 테스트 인증서를 포함하여 패키징 하였으나 로컬환경에서는
제대로 동작을 안하네요. 방법을 도무지 모르겠네요. 이해하시기 바랍니다. 혹시 방법 아시는분은 좀..
--------------------------------------------------------------------------------
BinaryBehavior.zip (586819 Bytes)
제목 : Re: BB의 구현방법 (결론?)
글쓴이: 김동준(lion001) 2003/04/22 18:38:09 조회수:123 줄수:20
결론을 내기에는 부족한 면이 있습니다만, 여기서 이만 줄일까 합니다. 제가 보는 BB는
상당히 유용하다”입니다. 클라이언트가 thin으로 가는 추세라고 한다면 모든 Biz Logic은
서버상에서 구현되고 클라이언트는 유저와의 인터페이스를 담당하는 단말로서의 기능에
충실해야 합니다. 저는 이 부분에 주목합니다. Script가 최소화된 컴퓨팅을위해 BB의 역할이
클것이라 생각 됩니다.
기초적인 인프라 컨트롤들을 BB로 작성하고 재사용을 통해 확장하여 하나의 프레임웍으로
만든다면 생산성과 유지보수 측면에서 충분한 효과가 있을것이라고 생각합니다.
게다가 JSF, ASP.NET등과 결합한다면 금상첨화이겠지요. 오직 IE에서만 돌아간다는점을 빼고말입니다.
이게 치명적이라 생각하지 않습니다. 서두에서도 말했지만 어디까지나 인트라넷에서 적용한다는
전제를 두고 본다면 문제 없을꺼라 생각합니다. 프레임웍으로의 발전은 단계적 상속, 확장을 통해서
가능할 것입니다. 가령 DataGrid Control을 만들었다면 이것을 확장하여 DropDown List Control을
만들 수 있을거구요. 이것을 확장, 상속하여 우편번호 리스팅을 한다거나 코드리스트를 팝업할 수
있는 기능으로 발전시킬 수 있겠지요. 지금 이것을 한번 시도해보려고 합니다. 관심 있으신분과 서로
의견 교환을 했으면 합니다.
그동안 변변찮은 내용 보시느라 수고 많이 하셨습니다.
감사합니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
18 | 스크롤바를 따라다니는 메뉴판 | 박상현 | 2003.12.04 | 1575 |
17 | 스크롤바를 따라다니는 이미지 | 박상현 | 2003.12.04 | 1684 |
16 | 이벤트 종류알기 및 좌표 읽기 | 박상현 | 2003.12.03 | 1989 |
15 | 문서크기에 맞게 아이프레임폭 자동으로 조정하기 | 박상현 | 2003.11.17 | 1928 |
14 | 목록에서 선택된 라인에만 색칠하고 다른것은 이전색으로 변경하기 | 박상현 | 2003.11.13 | 1705 |
13 | 목록에서 다중 선택된 항목을 표시(특정색상)하고 체크박스를 선택해주는 스크립트 | 박상현 | 2003.11.07 | 2837 |
12 | 여러가지의 색으로 롤오버 효과및 항목을 선택시 선택된 색을 고정시키는 예제 | 박상현 | 2003.11.07 | 2212 |
11 | event.keyCode의 숫자표 | 박상현 | 2003.10.20 | 1863 |
10 | jsp페이지에서 popup창의 depth에 따른 메인 복귀 방법 달리하기... | 박상현 | 2003.10.14 | 3496 |
9 | 색상표 | 박상현 | 2003.10.10 | 1771 |
8 | [javascript]textarea의 내용을 클립보드에 담아 처리하기 | 박상현 | 2003.10.09 | 3679 |
7 | 자바스크립트사용시 주의점 | 운영자 | 2003.10.06 | 1899 |
6 | excel로 자료 출력 | 운영자 | 2003.10.06 | 2387 |
5 | 테두리및 가로줄, 세로줄이 1px인 테이블 만들기 | 운영자 | 2003.10.01 | 2531 |
4 | table 외곽에 테두리만 1pixel로 만들기 | 운영자 | 2003.10.01 | 2249 |
» | BB설명 | 운영자 | 2003.09.26 | 2159 |
2 | 창닫기 전에 물어보기 | 운영자 | 2003.09.26 | 2574 |
1 | popup창 띄우는 4가지 방법 | 운영자 | 2003.09.24 | 4004 |