COM Threading Model์ ํ์์ฑ
โข
in-process server๋ฅผ ์ ์ธํ COM ์๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ์ผ COM ๊ฐ์ฒด์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ์ค๋๋๊ฐ ์ ๊ทผ ๊ฐ๋ฅํ ๋ค์ค์ค๋๋ ํ๊ฒฝ์ ๋
ธ์ถ๋์ด ์๋ค. ๋ฐ๋ก ์ด ํด๋ผ์ด์ธํธ์ ์ ๊ทผ ๋๊ธฐํ๋ฅผ ์ํด COM threading model์ด ์กด์ฌํ๋ค.
COM Threading Models
โข
single-threading model,ย apartment-threading model,ย free-threading(multi-threaded) model,ย mixed-threading(apartment ๋ฐ free-threading ์ง์) model, neutral model์ ์ด 5๊ฐ์ง ๋ชจ๋ธ์ด ์กด์ฌํ๋ค(๋ช
์นญ์ด ํผ๋์ค๋ฝ๋ค. free-threading, mixed-threading model, neutral model ์ญ์ apartment๋ฅผ ํตํ threading ๋ชจ๋ธ์ด๋ค. ์ฌ๊ธฐ์๋ apartment-threading model๊น์ง ํฌํจํ ์ด๋ค์ ๊ฐ๋ฆฌ์ผ Apartment ์ฐ๊ด ๋ชจ๋ธ์ด๋ผ ์ง์นญํ๊ฒ ๋ค).
โข
COM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฐ๋์ ํธ์ถํด์ผ ํ๋ CoInitializeEx()์ด ๋ฐ๋ก ์ด ๋ชจ๋ธ ์ง์ ์ ์ฌ์ฉ๋๋ค.
โข
ํด๋ผ์ด์ธํธ์ COM ์๋ฒ์ threading model์ด ์๋ก ๋ค๋ฅด๋๋ผ๋ COM run-time ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด๋ค ๊ฐ ํต์ ์ thread-safeํ๊ฒ ์กฐ์ ํ์ง๋ง, ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ๋ค.
Single-Threading Model
๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋จ์ผ ์ค๋๋ ํ์ ์์ธ๋ค. ์ค์ง ๋จ์ผ ์ค๋๋ application์๋ง ์ ํฉํ๋ฐ, ํด๋น COM ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ค๋๋ ์ด์ธ์ ์ค๋๋์์๋ ์ธํฐํ์ด์ค ํฌ์ธํฐ์ ์ง์ ์ ์ธ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ค ํ ์ค๋๋์์์ ํธ์ถ, ์ฆ proxy/stub์ ๊ฒฝ์ ํ ํธ์ถ์ ๋ฉ์์ง ํ์ ์์ด๊ณ , ์ธ์ ๋ ์ฐ์ ์์๊ฐ ๋ค๋ก ๋ฐ๋ฆฐ๋ค(ํด๋น COM ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ค๋๋์ ๋นํด).
Apartment ์ฐ๊ด ๋ชจ๋ธ
โข
๋ณธ ๋ชจ๋ธ์์์ ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ proxy/stub ๊ฒฝ์ ์์ด ์ง์ ์ ์ผ๋ก ์ธํฐํ์ด์ค ํฌ์ธํฐ๋ฅผ ์ป์ ์ ์๋ค. apartment๋ ์ค๋๋ ๋ณํ์ฑ(concurrency)์ ์ํ ๋
ผ๋ฆฌ์ ๊ตฌ์กฐ๋ฌผ์ผ๋ก์, ์ค๋๋๊ฐ CoInitializeEx()๋ฅผ ํธ์ถํ ๋ ์์ฑ๋๋ค. apartment๋ ํ๋ ๋๋ ๊ทธ ์ด์์ ์ฐ๋๋์ ํ๋ ๋๋ ๊ทธ ์ด์์ COM ๊ฐ์ฒด์ ์ฐ๊ด๋์ด, apartment๋ด์ ๋ชจ๋ ์ฐ๋๋๋ ํด๋น apartment์์ ์์ฑ๋ ๋ชจ๋ COM ๊ฐ์ฒด๊ฐ ๋
ธ์ถํ๋ ์ธํฐํ์ด์ค ํฌ์ธํฐ์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ํ๋ก์ธ์ค๋ ์ฌ๋ฌ STA(Single Threaded Apartment: ํ๋์ ์ฐ๋๋๋ง ํฌํจ)๋ฅผ ๊ฐ์ง ์ ์์ง๋ง MTA(Multi Threaded Apartment: ์ฌ๋ฌ ์ฐ๋๋ ํฌํจ ๊ฐ๋ฅ)๋ ๋จ ํ๋๋ง ๊ฐ์ง ์ ์๋ค.
Apartment-Threading Model(STA)
COM ๊ฐ์ฒด๋ฅผ ์์ฑ ๋ฐ ํธ์ถํ๋ ์ฐ๋๋๊ฐ ์ค์ง ํ๋์ด๋ฉฐ, COINIT_APARTMENTTHREADED๋ฅผ ๋งค๊ฐ๋ณ์๋ก CoInitializeEx()์ ํธ์ถํ ๋ ์์ฑ๋๋ค. STA์์ ์์ฑ๋ COM ๊ฐ์ฒด์ ์ธํฐํ์ด์ค ํฌ์ธํฐ๋ ์ค์ง ํด๋น STA์ ์ฐ๋๋์์๋ง ์ ๊ทผ ๊ฐ๋ฅํ๋ฉฐ,ย ํ ์ฐ๋๋๋ marshaling์ ํตํด ๋
ธ์ถ๋ ์ธํฐํ์ด์ค ํฌ์ธํฐ๋ฅผ ํตํด์๋ง ํด๋น COM ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ์ด ๊ฒฝ์ฐ, ๊ฐ ํธ์ถ๊ฐ ๋๊ธฐํ๋ STA ์ฐ๋๋์ (window) message queue๋ฅผ ํตํด ์ด๋ฃฌ๋ค.
Free-Threading Model
MTA๋ก ๊ตฌํํ๋ ๋ณธ ๋ชจ๋ธ์ ํ๋์ apartment์ ์ฌ๋ฌ ์ฐ๋๋๊ฐ ์
์ฃผ ๊ฐ๋ฅํ๋ฉฐ COINIT_MULTITHREADED ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ๋ค. COM ๊ฐ์ฒด ์ฌ์ฉ์ marshaling์ด ํ์์์ด ์ต๊ณ ์ ์ฑ๋ฅ์ ๋ณด์ด์ง๋ง, ๋ณธ ๋ชจ๋ธ์ ์ง์ํ COM ๊ฐ์ฒด๋ thread-safeํ๊ฒ ๊ตฌํ๋์ด์ผ ํ๋ฉฐ ๋๊ธฐํ ์ฝ๋๊ฐ ๋ด์ฅ๋์ด ์์ด์ผ ํ๋ค.
Mixed-Threading Model
์ฌ๋ฌ STA์ ํ๋์ MTA๊ฐ ์๋ฆฌ์ก๋ ๊ตฌ์กฐ์ด๋ค.
Neutral Model
์์ ๋์จ apartment ๋ชจ๋ธ๊ณผ๋ ๋ฌ๋ฆฌ ์ฐ๋๋๊ฐ apartment์ ์ฐธ์ฌํ์ง ์๋ COM ๊ฐ์ฒด๋ง ์
์ฃผํ ๋ชจ๋ธ์ด๋ค. ๋ฐ๋ผ์ ์ด๋ apartment์ ์ฐ๋๋๊ฑด NA ์์ COM ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ์ด์ ๊ฐ์ apartment๋ฅผ ๊ฐ๋ฆฌ์ผ NA(Neutral Apartment)๋ผ ์นญํ๋ฉฐ, ์์ ๋์จ ๋ชจ๋ธ ๊ตฌํ์ ๋ณต์ก์ฑ์ ์ค์ด๊ธฐ ์์ COM+์์ ๋์
๋์๋ค. COM ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ฐ๋๋๋ ํญ์ ๊ฒฝ๋์ proxy๋ฅผ ๋ฐ์ ์ด๋ฅผ ํตํด ํธ์ถ์ ํ๋ค. ํญ์ ์์ ์ ํธ์ถํ ์ฐ๋๋์์ ํธ์ถ์ ๋ฐ์ผ๋ฏ๋ก ์ฐ๋๋ ์ ํ์ด ํ์์์ด ์ฑ๋ฅ ํฅ์๋๋ฉฐ, ๋๊ธฐํ๋ COM+์์ ์ง์ํ๋ค. ๋ณธ ๋ชจ๋ธ์ด ๋์จ ์ด์ free๋ mixed ๋ชจ๋ธ์ ์ฌ์ฉํ ํ์๊ฐ ์์ด์ก๋ค.
Threading Model ๊ด๋ จ Registryย ํค
in-proces ์๋ฒ๋ registry์ ์์ ์ threading model์ ์ง์ ํด์ผ ํ๋๋ฐ, ๋ณดํต in-proces server๋ย CoInitializeEx()ย ํธ์ถ์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ํด๋ผ์ด์ธํธ๋ in-process ์๋ฒ๋ฅผ ์์ฑํ ๊ฒฝ์ฐ registry๋ฅผ ๋ค์ ธ marshaling ์ฝ๋๊ฐ ํ์ํ์ง ์ฌ๋ถ๋ฅผ ์์๋ธ๋ค. ๋ค์๊ณผ ๊ฐ์ ์์น์ ํด๋น ์น์
์ด ์กด์ฌํ๋ค.
HKEY_CLASSES_ROOT\CLSID\[component CLSID]\InProcServer32
C++
๋ณต์ฌ
์ ์น์
์ ThreadingModel ํค ๊ฐ์ผ๋ก๋ None (Single-threading model), Apartment (STA), Free (MTA), Both (mixed model), ๊ทธ๋ฆฌ๊ณ neutral์ด ์ฌ ์ ์๋ค.
References
โข
Desktop Applications with Microsoft Visual C++ 6.0 MCSD Training Kit,
โข
Understanding COM+, David S. Platt
โข
MSDN




