COM 객체 생명주기 완전 정복

이 논문은 COM(Component Object Model)의 객체 생명주기 전 과정을 단계별로 설명한다. 클라이언트 요청부터 서버 위치 파악, 객체 생성, 인터페이스 호출, 최종 해제까지 각 단계에 관여하는 COM 런타임, 레지스트리, 클래스 팩터리, IUnknown 등 핵심 요소를 간략히 소개한다.

COM 객체 생명주기 완전 정복

초록

이 논문은 COM(Component Object Model)의 객체 생명주기 전 과정을 단계별로 설명한다. 클라이언트 요청부터 서버 위치 파악, 객체 생성, 인터페이스 호출, 최종 해제까지 각 단계에 관여하는 COM 런타임, 레지스트리, 클래스 팩터리, IUnknown 등 핵심 요소를 간략히 소개한다.

상세 요약

COM은 바이너리 수준에서 서로 다른 프로세스와 언어 간에 객체를 투명하게 교환하도록 설계된 마이크로소프트의 인터페이스 기반 기술이다. 논문은 COM 객체의 생명주기를 다섯 개 핵심 단계로 구분한다. 첫 번째 단계인 클라이언트 요청에서는 애플리케이션이 CoCreateInstance 혹은 CoGetClassObject와 같은 API를 호출해 객체를 얻고자 하는 의도를 전달한다. 이때 전달되는 CLSID는 레지스트리 혹은 매니페스트에 등록된 클래스 팩터리 정보를 식별한다.

두 번째 단계인 서버 위치는 CLSID에 매핑된 서버(인프로세스 DLL, 아웃오브프로세스 EXE, 혹은 원격 서버) 를 찾는 과정이다. COM 런타임은 레지스트리 키(HKEY_CLASSES_ROOT\CLSID{…}\InprocServer32, LocalServer32 등)를 조회해 해당 모듈의 경로와 실행 모델을 결정한다. 또한 DCOM 환경에서는 네트워크 주소와 보안 토큰을 통해 원격 서버와의 연결을 설정한다.

세 번째 단계인 객체 생성에서는 실제 클래스 팩터리가 로드되고, IClassFactory 인터페이스를 통해 객체 인스턴스가 생성된다. 여기서 핵심은 IUnknown 인터페이스의 구현이다. 객체는 IUnknown의 AddRef, Release, QueryInterface 메서드를 제공함으로써 참조 카운트 기반 메모리 관리와 인터페이스 탐색을 가능하게 한다. 객체가 인프로세스 서버라면 DLLMain에 의해 모듈이 초기화되고, 아웃오브프로세스 서버라면 COM 런타임이 별도 프로세스를 시작하고 메시지 루프를 가동한다.

네 번째 단계인 상호 작용은 클라이언트가 얻은 인터페이스 포인터를 통해 메서드를 호출하는 단계이다. COM은 인터페이스 기반 호출을 강제함으로써 구현 세부 사항을 은닉하고, 스레드 모델(APARTMENT, FREE, BOTH)과 마샬링을 통해 호출이 올바른 스레드 컨텍스트에서 실행되도록 보장한다. 특히 아파트 모델에서는 COM이 자동으로 호출을 해당 아파트의 메시지 큐에 전달해 스레드 안전성을 확보한다.

마지막 연결 해제 단계에서는 클라이언트가 Release를 호출해 참조 카운트를 감소시킨다. 카운트가 0이 되면 객체는 자체적으로 메모리를 해제하고, 아웃오브프로세스 서버는 마지막 객체가 해제될 때 서버 프로세스를 종료한다. DCOM 환경에서는 네트워크 연결도 정리되며, 보안 컨텍스트가 해제된다. 논문은 각 단계에서 발생할 수 있는 오류(예: CLASS_E_CLASSNOTAVAILABLE, REGDB_E_CLASSNOTREG, CO_E_NOTINITIALIZED 등)와 그에 대한 처리 방안을 간략히 언급한다. 전체 흐름을 이해하면 COM 기반 애플리케이션의 디버깅과 성능 최적화, 그리고 보안 설계에 큰 도움이 된다.


📜 논문 원문 (영문)

🚀 1TB 저장소에서 고화질 레이아웃을 불러오는 중입니다...