게시판 본문 COM / COM+ by VB 6.0 - Read Only

re: 송원석님 답변 정말 감사합니다.. 저에게는 재미있는(?) 일이기에 다시 글 올립니다. ^^*
작성자: 송원석
작성일시: 2004-05-08 22:05,  조회수: 3,019
우기님께는 조금 가혹한 얘기가 될지도 모르겠습니다만 제가 알고 있는 바를 솔직하게 말씀드리는 것이 진정으로 원하시는 바라고 생각하고 제 생각을 그대로 말씀드리도록 하겠습니다. 혹시라도 불쾌하게 느껴지신다면 진심으로 사과드리겠습니다. 단지 올려주신 코드를 간단히 살펴보니 자칫 잘못하면 상당한 기간동안 헤매시게 될 것 같아서 말씀을 드립니다. 우기님께서 올려주신 코드에 약간의 문제점이 있습니다. ^_^;;;

물론 당연한 얘기지만 제가 말씀드리는 내용들 중에서도 일부 오류가 있을 수 있으므로 이 점을 감안하시기 바랍니다. 본론으로 들어가서 단도직입적으로 결론부터 말씀을 드리자면 먼저 해당 코드의 Activate() 메소드와 Deactivate() 메소드 그리고 CanBePooled() 메소드를 잘못 사용하고 계십니다.

먼저 CanBePooled() 메소드와 관련된 내용을 말씀드리도록 하겠습니다. 이 메소드가 실제로 하는 일은 매우 간단합니다. 즉 상황에 따라서 True 를 리턴해주거나 False 를 리턴해주기만 하면 되니까요. 왜 이런 메소드가 존재하는 것일까요? 그것은 바로 구성 요소 서비스에게 해당 컴포넌트가 개체 풀링 기능을 지원하는지 여부를 알려주기 위함입니다. 메소드의 이름 그대로의 의미를 가지고 있는 것이죠. 그렇기 때문에 비주얼 베이직에서는 항상 False 를 리턴해 주셔야만 합니다. 왜냐하면 비주얼 베이직으로 만든 COM+ 컴포넌트는 쓰레드 친화성과 STA 관련 문제로 개체 풀링을 지원하지 않기 때문입니다. 물론 구성 요소 서비스에서는 비주얼 베이직으로 만든 컴포넌트를 자동으로 감지하여 개체 풀링 옵션을 비활성화 시켜버리기는 하지만 이는 원칙입니다.

적시 활성화를 구현한 컴포넌트는 이전 글에서 말씀드렸던 대로 메소드의 호출이 이루어질 때마다 내부적으로 개체 소멸과 재생성을 반복하게 되는데 이 때 실제로 소멸을 할지 아니면 개체 풀에 들어갔다가 나올지를 결정할 때 컴포넌트 자체에서 애초에 개체 풀링을 지원하도록 구현되었지는를 확실하게 규정하기 위한 메소드입니다.

그리고 Activate() 메소드와 Deactivate() 메소드도 잘못 사용하고 계신데 이 메소드들은 클래스로 봤을 때 클래스 생성자 또는 클래스 소멸자와 비슷한 역활을 하는 메소드들입니다. 즉 적시 활성화를 구현한 컴포넌트가 COM+ 서비스에 의해서 내부적으로 삭제되었다가 재생성될 때, COM+ 서비스에 의해서 이 두 메소드가 호출되어집니다. 이를테면 임의의 메소드가 호출을 마치고 삭제되거나 풀로 들어가기 직전에 Deactivate() 메소드가 호출됩니다. 반대로 재생성되거나 풀에서 개체가 나올 때 Activate() 메소드가 호출되는 것이죠. 제가 비주얼 베이직을 사용하여 테스트를 해보니 실제로는 이보다 약간 복잡한 과정을 거치기는 하지만 기본적인 컨셉은 이렇다고 생각하시면 됩니다.

따라서 Activate() 메소드와 Deactivate() 메소드 내부에서 컨텍스트 객체를 얻거나 해제하시는 것 까지는 좋은 접근 방법이긴 하지만 이 메소드 내부에서 SetComplete() 메소드나 SetAbort() 메소드를 호출하시는 것은 전혀 의미가 없는 작업입니다.

그리고 EnableCommit() 메소드와 DisableCommit() 메소드에 관해서도 참고하시라고 약간의 보충 설명을 드리도록 하겠습니다. 이 메소드들의 기능을 확실하게 말씀드리면 이렇습니다. EnableCommit() 메소드를 호출하는 경우는 COM+ 의 트랜젝션 처리에 성공을 했으나 개체의 사용이 끝났다고 하더라도 현재 인스턴스를 삭제하거나 풀로 돌려보내지 않겠다는 뜻입니다. 반면 DisableCommit() 메소드를 호출하면 트렌젝션에도 실패했으며 개체의 사용이 끝났다고 하더라도 삭제하거나 풀로 돌려보내지 않겠다는 뜻입니다. 즉 약간 다른 버전의 SetComplete() 메소드나 SetAbort() 메소드라고 말씀드릴 수 있습니다.

지금까지 말씀드린 내용들은 상당히 간략화된 내용들로서 제가 그 의미를 얼마나 잘 전달해 드렸는지 저도 확신이 서지 않습니다. 제가 COM+ 관련 서적을 한 권 추천해 드리고 싶은데 혹시 이미 읽어보셨을지도 모르겠네요. Understanding COM+ 라는 책으로 정보문화사에서 출판된 번역서입니다. 먼저 이 책을 한 번 읽어보시고 작업에 들어가시면 큰 소득이 있으실 것이라고 확신합니다. ^_^

그리고 마지막으로 다시 한 번 말씀드립니다. COM+ 컴포넌트를 만드실 때는 상태를 유지하지 않는다는 것을 명심하시기 바랍니다. 즉 일부 특이한 경우를 제외하고서는 COM+ 컴포넌트에 일반적인 프로퍼티나 내부 멤버 변수를 구현하는 것은 거의 무의미할 뿐더러 COM+ 의 기본 개념에도 위배된다는 사실을 기억하시기 바랍니다.

감사합니다.

IP 주소: 211.216.128.76
전체 276 건의 게시물, 12 페이지로 구성된 COM / COM+ by VB 6.0 게시판의 10 페이지입니다.
게시물
51

뉴스그룹에서 재미난 방법을 찾았습니다. [1]

zziuni

2004-10-20 5,746
50

이벤트 오류

홍완식

2004-08-21 2,984
49

re: 이벤트 오류

송원석

2004-08-21 2,972
48

트랜잭션 오류 문제

홍완식

2004-08-17 7,488
47

re: 트랜잭션 오류 문제

송원석

2004-08-18 3,474
46

해결방법 [1]

홍완식

2004-08-19 834
45

프로그램 배포

정보문

2004-07-29 2,887
44

re: 프로그램 배포

송원석

2004-07-29 2,708
43

아...3년전의 VB경험으로...서비스할 DLL을 만들라니...

권민수

2004-05-21 3,513
42

re: 아...3년전의 VB경험으로...서비스할 DLL을 만들라니...

송원석

2004-05-22 2,901
41

re: 아...3년전의 VB경험으로...서비스할 DLL을 만들라니...

권민수

2004-05-22 2,724
40

COM 개발시 Property Get 과 Let에 관해 알려주세요..

우기

2004-05-08 776
39

re: COM 개발시 Property Get 과 Let에 관해 알려주세요..

송원석

2004-05-08 2,985
38

송원석님 답변 정말 감사합니다.. 저에게는 재미있는(?) 일이기에 다시 글 올립니다. ^^*

우기

2004-05-08 769

re: 송원석님 답변 정말 감사합니다.. 저에게는 재미있는(?) 일이기에 다시 글 올립니다. ^^*

송원석

2004-05-08 3,019
36

따끔한 충고의말 정말 감사합니다. ^^ [1]

우기

2004-05-08 784
35

RDS 이용한 VBScript 문제입니다.

윤경민

2004-02-26 785
34

re: RDS 이용한 VBScript 문제입니다.

송원석

2004-02-26 3,001
33

[질문]com+ 프락시 사용 클라이언트 에러 발생!

궁금이

2004-02-01 982
32

re: [질문]com+ 프락시 사용 클라이언트 에러 발생!

송원석

2004-02-02 3,056
31

re: [질문]com+ 프락시 사용 클라이언트 에러 발생!

궁금이

2004-02-02 919
30

re: [질문]com+ 프락시 사용 클라이언트 에러 발생!

송원석

2004-02-02 2,874
29

RDS를 사용하여 사원인증을 쿼리하려고 하는데...

saint74

2003-11-03 3,258
28

re: RDS를 사용하여 사원인증을 쿼리하려고 하는데...

송원석

2003-11-03 3,284
27

감사합니다. 상세 구현 예상 방법입니다..

saint74

2003-11-04 3,211