게시판 본문 ASP, ASP.NET, IIS & Script - Read Only

re: CLS ID 에 대하여
작성자: 송원석
작성일시: 2004-09-03 09:59,  조회수: 3,220
말씀하신 내용을 깊이 있게 이해하시기 위해서는 먼저 COM 컴포넌트 전반에 걸친 이해가 필요하리라고 생각합니다. 이 자리에서는 일단 간단한 개념 정도로만 설명을 드리도록 하겠습니다. ^_^

먼저 GUID 라는 개념부터 알아보죠. 예를 들어서 선생님께서 직접 COM 컴포넌트를 하나 만든다고 가정해보도록 하겠습니다. 그리고 이름을 JComp 라고 이름을 붙입니다. 그런데 제가 다른 컴포넌트를 만들면서 똑같이 JComp 라는 이름을 붙인다고 생각해 보겠습니다. 선생님과 저는 서로 알지 못하고 한 명은 한국에 한 명은 미국이나 다른 나라에 있다고 생각해보죠. 그런데 우연히도 홍길동이라는 사람의 컴퓨터에 선생님이 만든 컴포넌트와 제가 만든 컴포넌트가 동시에 설치되었다고 생각해 본다면 그 결과는 어떻게 될까요? 보다 구체적으로 말해서 홍길동이라는 사람이 자신의 프로그램을 작성하면서 선생님의 JComp 컴포넌트를 사용하여 어떤 작업을 처리하려고 한다면 컴퓨터의 입장에서는 선생님의 JComp 컴포넌트를 말하는 것인지 제가 작성한 JComp 컴포넌트를 말하는 것인지 구분이 불가능합니다. 따라서 그 결과는 오류가 발생하거나 둘 중에서 원치않는 컴포넌트가 생성이 될 가능성이 높아지게 됩니다.

그래서 세상의 모든 COM 컴포넌트에는 유일하게 구분되는 이름이 지정될 필요가 생기게 되는데, 이때 사용되는 것이 바로 GUID 입니다. 이 GUID 는 구체적으로 말해서 다음과 같은 형태를 가지게 됩니다.
3718DEE1-5A83-11D3-BF83-00C04F990001
비주얼 베이직을 사용하여 COM 컴포넌트를 작성하는 경우 이 값은 자동적으로 세상에서 유일한 값이 생성됩니다. 프로젝트 속성에 보시면 '프로젝트 호환성' 이니 ''이진 호환성' 이니 하는 항목들이 모두 이 문제와 관련된 항목들입니다. 비주얼 스튜디오의 유틸리티 중에는 이 GUID 를 항상 유일한 값으로 생성해주는 것도 있구요. 원리는 저도 잘 기억이 나지 않지만 MAC 주소를 이용하여 몇 가지 처리를 거쳐서 얻어낸 값이라고 하네요. ^_^

그래서 비주얼 C/C++ 프로그래밍에서는 COM 개체에 지정된 고유의 GUID 를 사용하여 프로그래밍을 하게 됩니다. 그리고 이 GUID 는 사용처에 따라서 조금씩 다른 이름으로 불리우기도 합니다. 예를 들어서 인터페이스를 구분하기 위해서 사용되면 IID 라고 불리웁니다. 또는 COM 컴포넌트의 코클래스 (coClass) 를 구분하기 위해서 사용되면 CLSID 라고 불리죠. 또 타입 라이브러리를 구분하기 위해 사용되면 LIBID 라고 불리웁니다. 말씀하신 CLSID 가 코클래스를 구분하기 위한 것이죠. ^_^

그런데 비주얼 베이직이나 ASP 등에서 COM 컴포넌트를 생성할 때 보시면 이런 값들은 전혀 사용되지 않습니다. 예를 들어서 ADO 의 Connection 개체를 생성한다고 하면 다음과 같은 코드가 사용됩니다.
Set objConn = CreateObject("ADODB.Connection")
이 때 사용되는 'ADODB.Connection' 이라는 문자열을 '응용 프로그램 아이디' 라고 합니다. 이 응용 프로그램 아이디는 GUID 스타일의 긴 숫자 이름을 기억하기 어렵기 때문에 개발자들이 기억하기 쉽도록 그냥 이름을 붙여준 것이죠. 그래서 사실 이 응용 프로그램 아이디는 앞에서 말씀드린 것처럼 동일한 이름 때문에 충돌이 나는 경우도 종종 있습니다.

그리고 사실 위와 같이 코딩을 해도 프로그램 내부적으로는 레지스트리의 HKEY_CLASSES_ROOT 하이브에서 'ADODB.Connection' 이라는 응용 프로그램 아이디를 찾고 그 하위의 CLSID 키에서 다시 그에 해당하는 실제 CLSID 의 값을 검색합니다. 컴퓨터에 설치되어 있는 ADO 의 버전에 영향을 받을 수도 있지만 제 컴퓨터의 ADODB.Connection 의 경우에는 00000514-0000-0010-8000-00AA006D2EA4 라는 CLSID 가 저장되어 있는데 다시 이 키를 찾아가야 되죠. 그러면 그 키의 하위 키들에는 실제로 DLL 파일이 위치한 경로, 멀티 스레드 모델, 버전등의 정보가 기록되어 있어서 이 정보를 사용하여 컴포넌트의 인스턴스가 만들어지게 됩니다. ^_^;;;

따라서 선생님의 레지스트리에 이런 키들이 많다는 말은 곧 컴포넌트가 그만큼 설치되었다는 의미와 같습니다. 특히나 최근 거의 모든 응용 프로그램들은 엄청난 수의 COM 컴퍼넌트를 사용하는 추세입니다. 마이크로소프트 오피스 하나만 설치해도 깔리는 컴포넌트의 종류가 엄청나죠. 그리고 단지 CLSID 하나만 놓고 봐도 DLL 파일의 갯수가 아니라 그 파일안에 포함된 코클래스의 갯수만큼 CLSID 가 등록되므로 그 수는 엄청날 것입니다. ^_^

결론적으로 GUID 를 생성하시기 위해서 누군가의 허락을 받을 필요는 없지만 특별한 도구를 이용하여 생성하셔야만 합니다. 비주얼 스튜디오 6.0 에는 GUIDGEN.EXE 이라는 유틸릴티가 있으므로 참고하시구요. 또한 .NET 프레임워크 기반에서는 이러한 메커니즘이 사용되지 않으므로 이 점도 참고하시기 바랍니다.

감사합니다.
IP 주소: 152.99.132.17
전체 2,095 건의 게시물, 84 페이지로 구성된 ASP, ASP.NET, IIS & Script 게시판의 58 페이지입니다.
게시물
695

re: [건의] 파일큐브 다운로드 로직..

송원석

2004-09-03 4,639
694

윈2003에서 다운로드 문제... [1]

ASaP

2004-09-03 741
693

안녕하세요~ 쿠키에 대해 질문요~ ^^

오마르

2004-09-03 635
692

re: 안녕하세요~ 쿠키에 대해 질문요~ ^^

송원석

2004-09-03 2,390
691

CLS ID 에 대하여

정보문

2004-09-03 2,306

re: CLS ID 에 대하여

송원석

2004-09-03 3,220
689

컴포넌트를 다른걸 쓰고싶네요

컴포넌트

2004-09-02 592
688

re: 컴포넌트를 다른걸 쓰고싶네요 [3]

송원석

2004-09-02 2,464
687

VB 역 컴파일러.. [1]

정보문

2004-09-01 878
686

정규식 도와주세효~

중생

2004-09-01 735
685

re: 정규식 도와주세효~

송원석

2004-09-01 2,332
684

re: 정규식 도와주세효~

중생

2004-09-01 571
683

안녕하세요~ dll 에 대한 질문인데요 ^^

오마르

2004-09-01 657
682

re: 안녕하세요~ dll 에 대한 질문인데요 ^^ [1]

송원석

2004-09-01 2,470
681

궁금증이 풀렸습니다. [1]

정보문

2004-09-01 582
680

re: 궁금증이 풀렸습니다. [1]

정보문

2004-09-01 612
679

안녕하세요~ 이미지 로드에 대한 질문인데요..^^ [1]

오마르

2004-08-31 638
678

re: 안녕하세요~ 이미지 로드에 대한 질문인데요..^^

송원석

2004-08-31 2,266
677

re: 안녕하세요~ 이미지 로드에 대한 질문인데요..^^

오마르

2004-08-31 603
676

re: 안녕하세요~ 이미지 로드에 대한 질문인데요..^^ [2]

오마르

2004-08-31 620
675

re: 안녕하세요~ 이미지 로드에 대한 질문인데요..^^ [1]

송원석

2004-08-31 2,385
674

성공했습니다. [1]

정보문

2004-08-27 2,543
673

다음과 같은 태그제한 어떻게 해야하죠?

가르쳐주세요

2004-08-27 694
672

re: 다음과 같은 태그제한 어떻게 해야하죠? [3]

송원석

2004-08-27 2,725
671

[교무/학사] 참조 [3]

정보문

2004-08-27 2,384