소프트웨어 아키텍처 (Software Architecture) — “한 번 구현하고 나면 바꾸기 비싼 근본적 구조 결정들에 관한 것” (Wikipedia). RTOS와 자동차 SW처럼 수명이 길고 규모가 큰 시스템에서는 아키텍처 선택이 유지보수·확장성의 상한을 결정한다.

아키텍처의 3축

아키텍처 결정은 세 가지 직교하는 질문으로 분해된다.

질문선택지
시스템의 단위 Building block이 무엇인가?Function · Object · Component · Actor · Service
어떤 통신 구조를 사용하는가?Client-Server · Publish-Subscribe
어떤 실행 구조를 사용하는가?Time-Triggered · Event-Triggered

각 축의 선택이 조합되어 실제 아키텍처를 이룬다. 통신·실행 축은 실행·통신 아키텍처 패턴에서 상세.

Monolithic vs Modular

Monolithic Architecture

  • 전체 소프트웨어를 한 덩어리로 설계.
  • 제품 복잡도와 개발자 수가 늘어나면 유지보수 불가.
  • 전체 시스템이 highly cohesive — 한 조각을 떼어내기 어렵다.

Modular Architecture

  • 시스템을 기능별로 나눠 개별 개발 후 통합.
  • 초기 설계에 노력이 들지만 복잡도 관리에 유리.
  • 각 모듈은 highly cohesive, 전체 시스템은 loosely coupled.

대규모·장수명 시스템(자동차 SW 포함)은 사실상 모두 Modular로 간다.

Modular 설계 원리

복잡도 관리(Complexity Management)와 잘 설계된 인터페이스가 핵심.

  • 각 모듈의 내부 구현은 자주 변경되어도,
  • 모듈 간 인터페이스는 가능한 한 조기에 고정한다.

인터페이스가 흔들리면 모듈화의 이점이 무너진다. “내부는 바뀌어도 되고, 경계는 바뀌면 안 된다”가 원칙.

Building Block

가장 작은 Building Block부터.

Function / Procedure

int func(int in1, const char *in2, int *out1) {
    ...
}
  • in1: Input (Call-by-Value)
  • in2: Input (Call-by-Reference)
  • out1: Output (Call-by-Reference)
  • int: Return Value

더 상위 단위(Object/Component/Actor/Service)는 함수/프로시저를 묶어 재사용성과 경계를 강화한 형태.

대표 아키텍처 스타일

대표적인 두 가지 모듈형 스타일.

  • Layered Architecture — 추상화 기반, 하위 계층이 상위 계층에 기능을 노출. Function Call 중심의 동기식. Linux / Android / AUTOSAR 계층 구조가 대표 예.
  • Component-Based Architecture — 재사용성 기반. Component를 Port로 연결, 데이터 흐름 중심의 비동기식. AUTOSAR SW-C가 대표 예.

실행·통신 세부 패턴(Sync/Async, Event/Time-Driven, Pub-Sub, Client-Server, Time/Event-Triggered)은 실행·통신 아키텍처 패턴에서 다룬다.

같이 보기