login register Sysop! about ME  
qrcode
    최초 작성일 :    2001년 05월 30일
  최종 수정일 :    2001년 08월 20일
  작성자 :    LikeJazz (박상길)
  편집자 :    LikeJazz (박상길)
  읽음수 :    37,145

강좌 목록으로 돌아가기

필자의 잡담~

COM+ ... 몰랐다면 모르고 살아도 되지만, 안 이상 알아야만 하는....

두번째 시간이다.

이번에는 저번시간에 문제가 되었던 COM+ 의 State 에 대해서 다루어보도록 하겠다. 사실 그동안 COM+ 컴포넌트를 여러 번 만들어 오면서 State 문제에 봉착한 적이 없었는데 알고봤더니 그것은 무의식중에 전부 Stateless 한 컴포넌트를 만들어서 였다.

덕분에 State 에 대해 많은 공부를 하였고 태요님의 오픈소스 마인드를 본받아 그 노하우를 공개하도록 하겠다. 아울러 이자리를 빌어 저번강좌에 피드백 남겨주신 많은 분들게 감사의 말씀 드린다.

또한 이번강좌는 주제의 성격상 이론적인 설명이 대부분을 차지할것이다. 실무예제를 보여주며 실무에 바로 적용할수 있게끔 하겠다는 본인의 의도와는 조금 빗나가긴 하지만 가능한한 다양한 예제를 제시하며 최대한 실무에 근접하게끔 노력하겠다. 아무쪼록 이쁘게 봐주세요 *ㅡ_ㅡ*

우선 주제는 Stateful or Stateless 가 되며 그와 연관된다고 생각되는 Transaction, Just-in-Time (JIT) Activation (Windows 2000 에서 '적시활성화'라고 번역되어있다. ), Context, Shared Property Manager 등에 대해서도 언급해보도록 하겠다.

VB 의 관점에서 작성될것이므로 Object Pooling 은 다루지 않겠다. VC++ ATL 로 이를 구현할수 있지만 이는 지금의 강좌의 주제에서 벗어나고 내용또한 상당히 방대한 분량이 될수 있으므로 제외시키겠다.

* Object Pooling

그럼 VB 에서 왜 Object Pooling 이 되지 않는가? 그것은 VB가 STA(Single-Threaded Apartment)만을 지원하는 스레드 친화적(Thread Affinity) 인 문제점 때문이다.

그림1. VB 로 작성되어 개체풀링(Object Pooling)이 비활성화 되어있는 상태

Platform SDK Documentation on COM+ 을 보면 Poolable 한(즉, Object Pooling 이 가능한) 컴포넌트 작성을 위한 조건으로 크게 4가지를 제시하고 있다.

* They must be stateless :
   stateless 라고 ? 이제 낯익은 단어다. stateless 즉, 클라이언트간에 State 를 전달시켜줄수없다.

* They must have no thread affinity :
   바로 이점이 VB 가 Poolable 한 컴포넌트를 만들지 못하는 문제점이다.
   스레드 친화적이기 때문에 Poolable 한 컴포넌트를 작성할수 없다.

* They must be aggregatable :
   집합화(aggregatable)가 되어야한다. COM+가 wrapper를 Poolable 한 컴포넌트 주위를 감싸서
   집합화를 관리하기 때문이다.

* They must implement IObjectControl :
   지난강좌에서 이를 구현하였다. 단순히 상단에 Implements ObjectControl 을 적어주면 이 컨트롤의
   인터페이스를 사용하여 Object 의 수명(Life Time)과 State 를 관리할것이다.

현재의 VB 에서 Object Pooling 이 되지 않는 문제는 VB.NET 에서 말끔히 해결될것이다.

* Object ?

UML 에서 언급하는 Object 란 무엇인가 ? Object = State + Behavior 이다.

State 와 Behavior 를 구분하는 소스를 보자. Don Box 가 작성한것이며 C++ 의 형태이다. 아주 간단한 형태이므로 굳이 VB 로 재작성하지 않아도 이해할수있을것이다.


class Dog { Int m_nHairs; public: void Shed(void) { m_nHairs -= 100; } };

이 Object 에서 m_nHairs 는 state 가 되고 Shed 는 behavior 를 나타내는 메소드가 된다. 물론 비즈니스 로직은 100을 빼는것이다. ㅡ_ㅡ

아래에 State Level 4 를 설명할 때 이에 대해 다시 한번 언급하도록 하겠다.

* Context

지난 시간에 우리는 Context 내에서 ASP 객체를 작동시켜보았다. 왜 ASP 객체를 Context 내에서 작동시켜야 하는지에 대해서는 지난번 소스에 직접 주석으로 달아놓았으니 지난시간의 강좌를 참조하면 되겠다.

개인적으로 Context 가 COM+ 컴포넌트의 가장 큰 특징이라고 생각한다. IIS 의 객체를 사용할수있게 해줄뿐만 아니라 트랜잭션관리, 보안등의 다양한 기능을 수행한다. 이 강좌의 주제인 State 도 사실은 Context 가 제일 먼저 가지게 된다. (Don Box 는 Level 0 의 단계라고 언급했다.)

* JIT(Just-In-Time) Activation

JIT 가 작동되면 클라이언트가 이 Object 를 참조하고 있더라도 COM+ 가 인스턴스를 반환해줄수있다. 즉 클라이언트에게 작동중이라고 사기치는것이다. 물론 메소드가 호출되면 COM+ 은 즉시(Just-In-Time) Object 를 클라이언트에게 재작동시켜줄것이다

그럼 이런 멋진 기능을 어떻게 사용하는가 ?

코드를 아니 그림을 보자.


그림2. JIT Activation (적시활성화) 를 간단히 체크만 하면 작동한다.

COM+ 에서 작동하고 있는 Transactional Components 라면 JIT 는 선택사항이 아니다. (JIT Activation 을 사용하지 않는 상태에서 SetComplete 혹은 SetAbort 문장이 호출되면 에러를 발생한다.)

저번 강좌에 피드백을 남겨주신 많은분들께서 JIT 옵션은 자유롭게 껏다가 켤수 있는것처럼 말씀해주셨는데 실제로 JIT 는 트랜잭션이 작동중일때는 필수사항이다. 끄면 에러가 난다는 말이다. (1. No Required 라고 설정한 경우라도 마찬가지다. SetComplete 가 호출되면 에러가 발생한다.)

좋은 기능인만큼 단점도 존재한다. 그것은 바로 트랜잭션이 종료되더라도 JIT 는 stub 와 wrapper 를 그대로 물고있기 때문이다. (다음 요청시 계속 작동되고 있었던것처럼 사기쳐야 되므로) 여기에 차지하는 메모리는 1KB 정도이다. 대략 stub 가 400bytes, wrapper 가 600bytes 정도를 물고 있다. 아래 그림을 참조하면 이해가 빠를것이다.


그림3. MTS(COM+) 와 Client 간의 연결상태. (JIT Activation 이 작동할시 Stub 와 Context Wrapper 는 그대로 물고있게 된다. 즉 1KB 정도의 메모리를 항상 점유하고 대기하게된다.)

만약 JIT 를 사용하지 않는다면 인스턴스를 소멸시키고 stub, wrapper 등을 다시 만드는 작업을 거쳐야 되므로 퍼포먼스 저하를 가져온다. 또한 SetComplete, SetAbort 가 호출되는 컴포넌트에는 JIT 는 선택이 아닌 필수사항이다. 대부분의 경우라면 이 옵션은 항상 활성화 해두도록 하자.

* Transaction

Transaction 하면 뭐가 생각나는가?

ACID 라고 대답한다면 당신은 Database 에 대해 어느정도 해박한 지식을 가지고 있는것이다.

이름 잘짓기로 소문난 MS 가 지었을것이다라고 생각할수 있겠지만 아쉽게도 이는 MS의 작품이 아니라 1980년에 Harder 와 Reuter 가 소개한것이다. 간략히 풀어보면 Atomicity, Consistency, Isolation, Durability 이다. 이에 대한 자세한 내용은 Database 책의 Transaction 부분을 참조하시면 된다. (억지로 붙인듯한 이름이라는 냄새가 없잖다.)

State 를 언급하기에 앞서 Transaction 을 언급한 이유는 바로 Transaction 이 State 와 밀접한 관련을 맺고 있기 때문이다. 특히 ACID 의 3번째 속성 Isolation 즉 고립성으로 인하여 트랜잭션 진행중에는 다른 트랜잭션으로부터 State 를 공유할 수가 없고 트랜잭션이 종결되면 (SetComplete 나 SetAbort 가 호출되면) 모든 State 를 반환한다.

쉽게 말해 COM+ 가 Stateless 를 강요하는 것은 (물론 David S. Platt 은 NO 라고 대답하지만) Transaction 의 Isolation 속성 때문인것이다.

* State

이번강좌의 주제인 State 에 대해 본격적으로 다루어 보도록 하겠다.

Microsoft System Journal (이하 MSJ, 2000년 3월호부터 MSDN 매거진에 통합되었다.) 1998년 3월호(벌써 3년전의 컬럼이다. 그당시 벌써 이런문제에 대해 고민하고 해결책을 제시했다는게 놀라울따름이다. 물론 이는.NET 이 아직 출시되지도 않았는데 벌써 1년전부터.NET 관련 컬럼들이 올라오는것과 같은 맥락이라 볼수있겠다. MS 직원(Technical Evangelist)이나 혹은 컨설턴트가 아니라면 당신이 필드에서 일하고있는 개발자라면.NET 은 최소한 1년후의 얘기가 될것이고 그동안에는 실무에서 쓸기회가 없을것이다. 당연히 그에 대한 문제점이나 노하우가 1년은 더 기다려야 발생할수 있을것이고 그때가 되면 2년전의 컬럼들을 뒤적이게 될것이다. 그렇죠 ? ^^;)

어쨋든 MSJ 98년 3월호 Don Box 의 컬럼에 이 문제에 대해서 최초로 제기되었고 그에대한 상세한 설명과 해결책(까지는 아니지만)이 제시되어있다.

아래는 98년 3월 MSJ 에 실린 Don Box 가 그린(직접 그렸을까 ?) State 를 보관하는 4가지 장소이다.


그림4. Don Box 가 언급한 State 가 보관되는 4가지 장소

Understanding COM+ 의 저자 David S. Platt 이 이를 좀더 구체화하여 표로 그렸다. 아래와 같다.


그림5. David S. Platt 이 정리한 Object State Location

그럼 이 4가지 State 의 보관방법에 대한 부연설명과 실제 VB 코드로 구현해보도록 하겠다.

1) Level1 : Client

이것은 지난강좌에 쓰인방법이다. 가장 무난한 방법이라고 볼수있겠다. 웹개발자라면 쿠키외에 별다른 대안이 없겠지만 Win32 응용프로그램의 형태라면 FileSystem 이 될수도 있겠고 Registry 가 될수도 있겠다.

이 부분에 대해선 소스를 생략하고 저번강좌에 쿠키에 쓰는 소스를 참조하시면 되겠다.

2) Level2 : Object's Member Variables

지난번 강좌를 쓸 때 분명히 컴포넌트내에서 Global Variable(전역변수)로 선언하고 메소드간에 인자값을 전달하려 했으나 값이 전달되지 않았다. 왜 일까 ?

이유는 SetComplete 문장 때문이었다. SetComplete 가 호출되면 모든 자원을 시스템으로 반환한다. 즉 전역변수는 한 트랜잭션내에서만 존재할수 있다는 얘기다. (앞서 언급한 트랜잭션의 Isolation 속성때문이다.) SetComplete 문장으로 (물론 SetAbort 해서 취소한 경우도 마찬가지이다.) 트랜잭션을 종료했을때는 모든 자원을 시스템으로 반환한다.

그리하여 COM+ 컴포넌트가 사용한 자원들이 모두 시스템으로 반환되었기 때문에 두번째 메소드(지난번 강좌에서 페이지네비게이션)를 호출했을 때 인자값을 전달받지 못했던 것이다.

아래 예제 코드를 제시하겠다. VB Active-X Dll 에서 작성하면 된다.

' Title : COM+ Test P/G
' Feature : State 저장방법에 대해 Test 하는 App
' Author : 2001-05-28 by LikeJAzz
' 참조해야할것 :
' 1. COM+ Service Type Library
' 실제로 Transaction 은 사용하지 않을것이므로 MTSTransactionMode 를 1. No Required 로 설정한다.


Option Explicit

Implements ObjectControl

Private oContext As ObjectContext
' State 를 보관하기 위한 전역변수 선언
Dim strTestStateVariable As String

Public Function Method1() As Variant
    strTestStateVariable = "Hello World!"
    Method1 = strTestStateVariable
    oContext.SetComplete
End Function

Public Function Method2() As Variant
    ' Method1 에서 사용된 State 를 전달받는다.
    Method2 = strTestStateVariable
    oContext.SetComplete
End Function

Private Sub ObjectControl_Activate()
    Set oContext = GetObjectContext
    oContext.SetComplete
End Sub

Private Function ObjectControl_CanBePooled() As Boolean
    ObjectControl_CanBePooled = False
End Function


Private Sub ObjectControl_Deactivate()
    oContext.SetComplete
    Set oContext = Nothing
End Sub

빨갛게 표시한부분을 주의깊게 보기 바란다. 참고로 여기에서는 예제를 보여주기 위해 SetComplete 만 표시했지만 실무에 적용할때는 에러 핸들링을 하고 SetAbort 도 정의해 주어야 한다. 지난시간의 강좌에 작성되어져 있으니 참조하면 된다.

이에 대한 자세한 설명은 뒤로 미루고 우선 Presentation 코드부터 작성해보겠다. (asp 전문 사이트인만큼 asp 로 작성해 보도록 하겠다. 허나 실제로 asp 와 VB 코드는 큰 차이가 없다.)

<%
Set obj = Server.CreateObject ("COMplus.StateTest")
With obj
   Response.Write.Method1
   Response.Write "<br>"
   Response.Write.Method2
End With
Set obj = Nothing
%>

실행결과는 아래와 같이 될것이다.

Hello, World! 가 단 한번만 찍혔다. 이말은 2번째 Method 에 State 가 전달되지 않았다는 소리다. 이유가 뭘까 ? 앞에서 언급했듯이 SetComplete 문장 때문이다. 실제로 트랜잭션을 사용하지는 않지만 SetComplete 는 작동을 한다. 즉 SetComplete 명령을 받으면 모든 상황을 종료시키고 자원을 시스템에 반환해준다. 물론 State 도 포함이다.

그럼 소스를 어떻게 수정하면 될까 ? 위에서 빨간색으로 표시한 SetComplete 를 지우면 된다. (즉 트랜잭션 주기를 길게 잡으란 소리다.) Deactivate 이벤트에 SetComplete 는 지울 필요가 없다. 어짜피 컴포넌트가 비활성화되면 모든 State 가 반환되므로 그냥 놔두는것이 조을것이다.

SetComplete 를 지우고 해당 COM+ 을 시스템종료 시킨후 VB 에서 dll 을 이진호환성 설정하고 재컴파일 해보자. 그리고 다시 실행시켜보자.

두번 다 찍힌다. 즉 State 가 두번째 Method 로 전달된 것이다.

자 그럼 지난번 강좌에 쓰인 게시판 소스에서 ShowMeListPage 메소드와 ShowMePageNavigation 메소드간에 State 를 전달해 주려면 ?

ShowMeListPage 메소드에서 SetComplete 문장을 제거해주면 된다. 트랜잭션 주기를 길게 잡으면 된다. (트랜잭션이 길어짐으로 해서 발생하는 퍼포먼스 저하는 감안해야 할것이다. 하지만 지난강좌에는 실제로 트랜잭션은 걸지 않았으므로 아마 퍼포먼스 저하는 없을것이다.)

또한 JIT Activation 을 활성화 해두어야 한다. 그 이유는 앞서 언급했다. (비활성화된 상태에서는 SetComplete 에서 에러를 발생한다.)

3) Level3 : Resource dispencer (Shared Property Manager or Pooled Object)

Level 3 의 경우 2가지 방법이 제시되어있다. (이외에 ODBC 도 Resource dispencer 의 역할을 수행하지만 여기서는 언급하지 않겠다.) 앞에서도 여러 번 언급하였지만 VB 에서 Object Pooling 은 해당사항이 없기 때문에 Shared Property Manager (이하 SPM) 에 대한 경우만 설명해보겠다.

SPM 은 프로세스내에서(dllhost.exe) Object간에 State 를 공유할수있게 해주는놈이다. 이 말은 Client 간에도 State 를 공유할수 있다는 소리다. (Level2 이하는 Client 간에 State 공유는 할수 없다.)

지난 강좌에서 컴포넌트의 단점을 언급할 때 Dead-Lock(DB 의 Dead-Lock 이 아니다.), Access Violation, Serizable 등의 문제가 발생한다고 했는데 (물론 이는 VB 수준에서는 거의 일어나지 않지만) SPM 을 사용하면 이 문제가 해결된다. (Lock 을 제어하고 사용자간의 Shared Property 를 보호하는 신호등역활을 한다고 Platform SDK 에 쓰여있다.)

SPM 을 사용하면 트랜잭션위치 바깥에 State 를 위치 시킬수 있고 다른 트랜잭션에서 이 State 를 공유할수 있다.

이놈을 사용하려면 약간의 추가 코딩이 필요하다. 그렇다고 이렇게 대충 설명만 하고 얼렁뚱땅 넘어가면 안되겠죠? 아래 VB로 작성한 코드를 제시한다.


' Title : COM+ Test P/G
' Feature : State 에 상태저장방법에 대해 Test 하는 App
' Author : 2001-05-30 by LikeJAzz

' 참조해야할것 :
' 1. COM+ Service Type Library (NT 때와는 달리 2000에서는 이놈 하나만 참조하면 된다.)

Option Explicit

Implements ObjectControl

Private oContext As ObjectContext

Public Function Method1() As Variant
    Dim strValue As String
    Dim bGroupExists As Boolean
    
    ' Shared Property Group Manager 를 선언, 생성하고
    Dim spmMgr As New SharedPropertyGroupManager
    ' Shared Property Group 을 선언한다.
    Dim spmGroup As SharedPropertyGroup
    ' Hello 라는 Property Group 을 생성하고 
    Set spmGroup = spmMgr.CreatePropertyGroup("Hello", LockSetGet, Process, bGroupExists)

    Dim spmProperty As SharedProperty
    ' World 라는 Property 를 덧붙인다.
    Set spmProperty = spmGroup.CreateProperty("World", bGroupExists)
    
    strValue = "Hello World!"
    ' 즉 Hello 그룹의 World 프로퍼티에 "Hello World!" 라는 값을 집어넣는다.
    spmProperty.Value = strValue
    Method1 = strValue
    oContext.SetComplete
End Function


Public Function Method2() As Variant
    Dim bGroupExists As Boolean
    
    ' 여기에서는 값을 읽어내겠지만 문법은 위 메소드와 동일하다.
    Dim spmMgr As New SharedPropertyGroupManager
    Dim spmGroup As SharedPropertyGroup
    Set spmGroup = spmMgr.CreatePropertyGroup("Hello", LockSetGet, Process, bGroupExists)
    Dim spmProperty As SharedProperty
    
    ' Hello 그룹의 World 프로퍼티의 값을 읽어온다.
    Set spmProperty = spmGroup.CreateProperty("World", bGroupExists)
    
    ' 값이 존재한다면 GroupExists 는 True 가 되고 존재하지 않는다면 False 가 된다.
    If bGroupExists = False Then
        Method2 = "Property Does Not Exist"
    Else
        Method2 = spmProperty.Value
    End If
    oContext.SetComplete
End Function

Private Sub ObjectControl_Activate()
    Set oContext = GetObjectContext
    oContext.SetComplete
End Sub

Private Function ObjectControl_CanBePooled() As Boolean
    ObjectControl_CanBePooled = False
End Function


Private Sub ObjectControl_Deactivate()
    oContext.SetComplete
    Set oContext = Nothing
End Sub

OK , 끝이다. 이제 State 를 메소드끼리 전달할수있을뿐만 아니라 Client 끼리도 State 를 전달할수 있다. 말 그대로 Shared 가 되는것이다.

그렇다면 정말 Client 끼리 State 가 전달될까 ? 간단한 테스트를 해보겠다. 아래 2종류의 asp 페이지가 있다.

Test1.asp

<% Set obj = Server.CreateObject ("COMplus.StateTest") With obj Response.Write.Method1 Response.Write "<br>" Response.Write.Method2 End With Set obj = Nothing %>

Test2.asp

<% Set obj = Server.CreateObject ("COMplus.StateTest") With obj Response.Write.Method2 End With Set obj = Nothing %>

Test1.asp 부터 실행시켜야 된다. 결과는 ?

메소드간에 State 가 전달되었다. (정확히 말하면 SPM 에 저장한 State 를 공유한 것이다.)

이제 우리가 만든 COM+ 는 작동을 시작할것이다. 아래처럼..


그림6. 위에서 SPM 을 사용하여 만든 COM+ 가 2048 번 프로세스ID 에서 작동을 시작한다.

이제 Test2.asp 를 실행시켜보자. 결과는 ?

State 가 Client 끼리도 공유가 되었다. 이 State 는 2048 번 프로세스가 작동하고 있는한 유효할것이다. (2048번 dllhost.exe 가 작동하는한)

즉 컴포넌트내에서 아무리 SetComplete 을 호출하여도 State 는 사라지지 않는다는 말이다. 왜냐면 SPM 으로 도망간 State 는 트랜잭션의 바깥에 위치하기 때문이다.

엄밀히 말하면 트랜잭션의 ACID 속성을 위배한것이라고 말할수 있다. 하지만 우리에게 중요한건 법칙이나 규칙이 아니다. 원하는 퍼포먼스를 발휘하고 원하는 결과를 도출해 낸다면 그걸로 끝이다. 최소한 개발자인 우리에겐..

4) Level4 : Resource Manager

Resource Manager (이하 RM) 가 머지 ? 처음 RM 이란 단어를 접했을 때 이게 뭘까 한참 고민했었다.

RM 이란 COM+ 의 Resource 를 관리해 줄 수있는 제품들이다. 현재 이에 해당하는 제품들에는 MS-SQL 서버 6.5,7.0,200, MSMQ , Windows 오라클 7.3 이상, 유닉스 오라클 8이상, DB2, Informix 등을 언급할 수가 있다.

쉽게 말해 우리는 Database 를 RM 이라고 생각하면 된다. 즉 DB 에 State 를 저장한다는 소리다. 가장 견고하고 가장 확실한 방법이 되겠지만 반면에 성능저하는 가장 심할것이다. (DB 접근을 최소화 해야 퍼포먼스가 조아진다는건 다들 잘 아시리라 생각한다.)

당연한 말이지만 DB 에 저장된 State 는 모든 Client 끼리 공유할수 있다.

David S. Platt 은 이 방식이 가장 어렵다고 말했다. 하지만 우리가 늘상 하는일이 ADO 를 사용하여 DB 를 읽고 쓰는일이 아닌가 ? 굳이 예제를 제시하지 않아도 충분히 이해하고 적용할수 있을것이다. (따로 예제코드를 제시하지 않겠다.)

참고로 RM 을 사용하는 방식은 UML 에 어긋난다.

왜 ?

앞에서도 언급했듯이 Object = State + Behavior 이기 때문이다.

State 를 분리하는것은 방법론에 어긋난다. 하지만 RM 을 사용하는 것이 가장 견고하게 State 를 보관할수있다. 물론 성능저하는 가장 심하다. (모든 사용자의 State를 DB 에 저장한다고 생각해보라)

어쨋거나 우린 아키텍트가 아닌 개발자이고 가급적이면 더욱 안전한 더욱 고성능을 내기 위해 방법론을 위배하더라도 그것은 방법론을 따라가지 못하는 현재의 기술수준을 탓해야 될것이다.

* Conclusion

이론적인 설명은 장황했지만 실제로 소스로 구현해보면 별거 아니네 ? 라고 생각되는 사람이 많을것이다. 그만큼 COM+ 의 내부구조가 잘 설계되어있고 직관적인 UI 를 가지고 있으며 Visual Basic 이라는 언어가 번거로운 작업을 도맡아 처리해주며 개발자에게 생산성을 제공해준다는 뜻이다.

UI 에 대해 오랫동안 프로그래밍 해온 사람이라면 잘 설계된 , 직관적이고 편안한 UI 를 표현하기 위해 그 기반구조는 얼마나 복잡해져야 하는지 잘 알것이다.

간략하게 한두줄의 코드로 표현되지만 그 밑바탕에서 어떡 작업들이 수행되는지 이번기회를 통하여 많이들 공부하셨으면 하는 바램이다.

아울러 본 강좌의 주제인 State 에 대해서 확실히 이해하셨으면 한다. (본인 역시 이번기회를 통하여 많이 공부하였다. ^^*)

asp 를 전문으로 다루는 이 사이트에서 자꾸 COM+ 얘기만 하니 미안한감이 든다.

하지만 asp 만으로 할 수 있는 기술들은 이미 태요님의 친절하고 자세한 강좌와 책등을 통하여 대부분 공개되었다. 이제는 asp 는 디자이너의 영역으로까지 확대되고 있으며 asp 는 다른 기술들과의 매개체로서 그 역할을 수행하고 있다.

웹개발자로서 웹프로그래머서 한단계 올라서길 원한다면 물론 Win32 개발자(VB 등의 RAD 툴, MFC 등의 툴을 사용하여 주로 UI 를 구현해내는데 집중했던 개발자) 역시 마찬가지다.

COM+ 은 반드시 거쳐야할 관문이다. 또한 앞으로 다가올.NET 환경에서 적응하려면 COM+ 을 배제하고선 살아남을수 없을것이다.

꾸준히 노력하여 뒤쳐지지 않는 한단계 앞서나가는 개발자가 되자!

자 그럼 다음에 만날때까지 Happy Programming!

참조서적 :

Understanding COM+ (Microsoft Press)

참조사이트 :
Microsoft System Journal 98년 3월호 ActiveX/COM 컬럼
http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0398/activex0398.htm&nav=/msj/0398/newnav.htm
Microsoft System Journal 99년 12월호 Basic Instincts 컬럼
http://www.microsoft.com/msj/defaultframe.asp?page=/msj/1299/Instincts/Instincts1299.htm
MSDN Magazine 2000년 12월호 Ten Tips for Maximizing COM+ Performance
http://msdn.microsoft.com/msdnmag/issues/1200/comtips/comtips.asp
Knowledge Base : Q191235 Use the Shared Property Manager in MTS through VB Code
http://support.microsoft.com/support/kb/articles/Q191/2/35.ASP
Platform SDK Documentation on COM+
http://msdn.microsoft.com/library/default.asp?URL=/library/psdk/cossdk/complusportal_9o9x.htm

authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})