정의
컴포넌트는 기능의 불투명한 구현이면서, 제3자가 조립할 수 있고, 컴포넌트 모델을 따르는 소프트웨어 단위다.[1]
계층 아키텍처가 아래를 감추는 추상화를 겨냥한다면, 컴포넌트 구조가 겨냥하는 것은 조립이다. 이 방식이 그리는 이상은 속성이 인증된 컴포넌트들을 빠르게 조립해 시스템을 만들고, 부품의 인증된 속성으로 완성된 시스템의 속성을 미리 예측하는 것이다.[1] 부품의 성질에서 전체의 성질을 예측하는 일은 성숙한 공학 분야라면 어디서나 하는 일이지만, 소프트웨어에서는 여전히 어려운 목표로 남아 있다.
컴포넌트 모델
컴포넌트만으로는 조립이 성립하지 않는다. 컴포넌트 모델은 시스템에 등장하는 컴포넌트 타입들과 그 인터페이스, 그리고 타입 사이에 허용되는 상호작용 패턴까지를 함께 정한 명세다.[1] 컴포넌트 프레임워크는 그 모델을 지탱하고 강제하는 런타임 서비스를 제공하며, 훨씬 높은 추상 수준에서 돌 뿐 여러 면에서 특수 목적 운영체제를 닮았다.
모델을 따른다는 조건이 컴포넌트를 일반 상용 소프트웨어 제품과 가른다. 상용 제품은 무엇을 하는지(기능)와 바깥 세계와 어떻게 상호작용하는지(협조 방식)를 제품마다 제 방식대로 구현하지만, 컴포넌트는 상호작용 방식을 규정하는 인터페이스를 하나 이상 구현해야 한다. 컴포넌트 모델이 정하는 것은 결국 시스템 전역에 걸친 설계 제약이며, 그 덕분에 따로 개발된 컴포넌트들도 예측 가능한 방식으로만 상호작용한다.
불투명성
컴포넌트가 불투명하다는 조건에는 두 가지 이유가 있다.[1] 하나는 시장이다 — 컴포넌트를 사고파는 관행에서 구현은 지적 자본으로 보호되므로 소비자에게 컴포넌트는 블랙박스로 남는다. 다른 하나는 오래된 설계 원칙이다. 클라이언트는 바뀌기 쉬운 구현 세부에 의존해서는 안 되며, 불투명성은 정보 은닉이 하던 역할을 컴포넌트 수준에서 대신한다.
제3자 조립이라는 조건도 같은 방향을 가리킨다. 컴포넌트를 쓰는 데 공급자만 가진 도구나 지식이 필요해서는 안 되며, 그래야 서로 독립적인 여러 출처의 컴포넌트를 한 시스템에 모으고 공급자가 아닌 통합자가 시스템을 조립할 수 있다.
채택 동기
이 구조를 택하는 동기는 네 갈래로 정리된다.[1] 컴포넌트는 확장의 단위여서 모델이 정한 방식대로만 확장이 이뤄지므로 확장끼리 예상 밖으로 간섭하지 않고, 표준을 지킨 컴포넌트들이 공통 환경에 배포될 수 있어 시장이 성립하며, 핵심 설계 결정이 모델과 프레임워크에 이미 담겨 있어 설계 기간이 줄고, 모든 컴포넌트에 균일하게 강제되는 설계 규칙 덕분에 확장성이나 보안 같은 전역 속성을 시스템 수준에서 예측할 수 있다.
계층 구조와의 관계
두 구조는 배타적이지 않다. 아키텍처를 기록하는 일은 결국 관련된 여러 뷰를 각각 기록하는 일이고, 한 계층의 내부를 다른 스타일로 구현할 수도 있다 — 최상위 계층을 파이프와 필터로 구성하고, 필터 사이로 오가는 데이터가 너무 크면 그 아래 계층을 공유 메모리 스타일의 모듈들로 채우는 식이다.[2]
컴포넌트끼리 무엇을 주고받는지, 즉 요청·응답과 배포·구독 가운데 무엇을 쓰는지는 소프트웨어 아키텍처의 통신 구조 축에서 다룬다. 차량 제어기 소프트웨어가 이 구조를 어떤 컴포넌트 모델로 구체화했는지는 AUTOSAR 소프트웨어 컴포넌트의 몫이다.