아키텍처? 다 똑같은 그림 아닌가요?
얼마전 소프트웨어 아키텍처를 주제로 한 팀 회의에서 있었던 이야기입니다. 차량용 제어기(Vehicle Control Unit, VCU) 개발을 목표로하는 팀 회의는 외부 감사에 대비하기 위해 아키텍처 문서를 정리하고 있었는데요. 이때 회의에 참석한 한 개발자들이 이런 의견들을 냈습니다.
"실제 코드 구조와 너무 달라요! 아키텍처와 코드 구조가 다르면 문서와 코드가 따로 노는건가요?"
"실제 배포는 이런 구조로 이루어지지 않아요! 현실과 너무 괴리가 큰데요?
“여기 있는 다이어그램이랑 표현만 다르고, 구현 구조가 비슷한거 같은데, 뷰가 왜 이렇게 많죠?"
"그냥 하나로 정리하면 안 되나요?”
"근데 아키텍처 뷰가 도대체 뭐죠?"
이런 상황은 복잡한 시스템일수록 다양한 시선에서 시스템을 구조화해서 설명해야 함에도 불구하고, 소프트웨어를 개발자들은 이에 대한 이해와 특히 활용에 있어 부족한 부분이 많다는 점을 시사한다고 생각합니다.
“소프트웨어는 하나의 목적을 갖고 수행하지만 아키텍처는 비슷하거나 또는 완전히 달라 보여도 각각의 뷰에 따라 목적이 완전히 다릅니다."
"논리 뷰는 기능 설계를 위해, 구현 뷰는 실제 코드 구조를 위해, 물리 뷰는 배포와 연결 구조를 위해 존재해요."
"하나로 합치면 아무도 그걸 완전히 이해할 수 없을 겁니다.”
이처럼, 아키텍처 뷰는 단순한 다이어그램이 아니라 서로 다른 시선으로 시스템을 바라보는 관점이며, 이 관점들을 통해 시스템을 입체적으로 이해할 수 있게 되는 것입니다.
1. 소프트웨어 아키텍처 뷰(View)의 개념과 목적
소프트웨어 아키텍처 뷰(Software Architecture View)란 시스템의 특정 관점에서 구조를 설명한 것입니다. 즉, 시스템 전반적인 구조와 구성 요소들을 각기 다른 관심사에 따라 나누어 설명한 것을 뷰(View)라고 합니다. 따라서 각 뷰는 이해관계자의 특정 관심사(Concern)를 반영하며, 시스템의 설계가 해당 관심사를 어떻게 충족하는지 보여주는 역할을 합니다.
소프트웨어 아키텍처 자체는 시스템의 상위 수준의 구조이며, 아키텍처 뷰는 그 구조를 여러 시선에서 이해하고 설명하기 위한 관점이라 할 수 있습니다.
예를 들어:
- 개발자는 모듈 간 의존성과 배포 구조에 관심이 있고,
- 운영자는 시스템이 어떻게 배포되고 네트워크 상에서 작동하는지에 관심이 있으며,
- 비즈니스 담당자는 기능 흐름과 사용자 경험에 관심이 있습니다.
하나의 뷰로는 이 모든 관심사를 만족시킬 수 없습니다. 그래서 우리는 여러 뷰를 중첩 또는 병렬적으로 사용하여 시스템을 보다 명확하게 설명합니다.
2. 왜 아키텍처 ’뷰(View)’가 필요한가
2-1. 복잡성 관리 (아키텍처 뷰가 필요한 가장 근본적인 이유)
소프트웨어 시스템은 점점 더 복잡해지고 있습니다. 수많은 모듈, 수천 줄의 코드, 다양한 사용자 요구사항, 실시간 처리, 외부 시스템과의 연동, 다양한 배포 환경 등이 얽혀 있어 하나의 시각으로 전체 시스템을 이해하거나 설명하는 것이 사실상 불가능합니다.
이러한 복잡성을 그대로 두면 다음과 같은 문제가 발생할 수 있습니다:
- 개발자마다 시스템을 이해하는 방식이 달라 설계 충돌 발생
- 변경이 어려워지고, 오류 발생 가능성 증가
- 설계 결정의 근거가 불명확하여 유지보수가 힘들어짐
아키텍처 뷰는 이러한 복잡한 시스템을 목적과 관심사에 따라 나누어 바라보게 함으로써, 각 구성 요소를 더 쉽게 이해하고 관리할 수 있도록 도와줍니다. 예를 들어 기능 흐름은 ‘논리 뷰’로, 배포 구조는 ‘물리 뷰’로, 실시간 동작은 ‘프로세스 뷰’로 나누어 설명함으로써, 복잡한 전체 시스템을 보다 단순하고 명료한 단위로 분해할 수 있습니다.
결국 아키텍처 뷰는 복잡한 시스템을 사람이 이해할 수 있는 구조로 ‘조망’하게 하는 기술이며, 이는 모든 시스템 설계의 시작이자 유지보수의 핵심입니다.
2-2. 문제 식별 및 설계 검토 (아키텍처 뷰의 실질적 가치)
복잡한 시스템은 처음부터 완벽하게 설계되기 어렵습니다. 설계 과정에서 기능 누락, 모듈 간 충돌, 과도한 의존성, 성능 병목, 보안 취약점 등 다양한 문제가 잠재적으로 존재합니다. 이러한 문제를 조기에 발견하고 해결하는 것이 바로 설계 검토(Design Review)입니다.
하지만 시스템 전체를 하나의 관점으로만 바라보면, 이런 문제들을 놓치기 쉽습니다. 예를 들어 코드 구조만 보면 성능 이슈를 파악하기 어렵고, 기능 흐름만 보면 배포 상의 병목을 알 수 없습니다.
아키텍처 뷰는 각기 다른 관점에서 설계를 들여다볼 수 있도록 하여 문제를 조기에 식별하고, 설계의 정합성과 일관성을 검토하는 데 매우 효과적입니다.
- 논리 뷰로는 기능 간 누락이나 중복을 확인할 수 있고,
- 프로세스 뷰로는 동시성 문제나 태스크 충돌을 점검할 수 있으며,
- 물리 뷰로는 네트워크 병목이나 배포 오류를 검토할 수 있습니다.
즉, 아키텍처 뷰는 단순한 문서가 아니라, 설계의 약점을 사전에 탐지하고, 검토를 통해 품질을 높이는 도구입니다. 개발 이후가 아닌, 설계 단계에서 문제를 발견할 수 있다는 점에서 그 중요성은 매우 큽니다.
2-3. 같은 시스템을 다른 시선으로 설명하는 도구 (이해관계자와의 커뮤니케이션)
소프트웨어 개발에는 다양한 이해관계자가 참여합니다.
예를 들어,
- 개발자는 코드 구조와 인터페이스에 관심이 있고,
- 테스터는 기능 흐름과 경계 조건에 집중하며,
- 운영자는 시스템의 배포 구조와 네트워크 구성을 중요하게 생각합니다.
- 비즈니스 책임자는 사용자 관점의 시나리오와 가치 흐름에 주목합니다.
이처럼 이해관계자마다 바라보는 관점과 사용하는 언어가 다르기 때문에, 하나의 설명으로 모두를 만족시키는 것은 거의 불가능합니다.
아키텍처 뷰는 각 이해관계자의 관심사를 반영한 시각적 표현을 제공함으로써, 의사소통을 원활하게 하고, 오해를 줄이며, 협업을 가능하게 만드는 도구입니다.
- 논리 뷰는 설계자와 개발자 간의 기능적 소통을 돕고,
- 물리 뷰는 운영자와 인프라 팀 간의 배포 전략 논의에 유용하며,
- 유스케이스 뷰는 기획자와 QA팀 간의 시나리오 기반 검토를 가능하게 합니다.
결국 아키텍처 뷰는 서로 다른 배경을 가진 사람들이 같은 시스템을 공통의 언어로 이해할 수 있게 해주는 다리 역할을 합니다.
2-4. 왜 그렇게 했는가를 설명하는 체계 (설계 의사 결정의 근거)
소프트웨어 아키텍처 설계는 수많은 의사결정의 결과물입니다. 예를 들어,
- 왜 특정 모듈을 분리했는지,
- 왜 이 통신 방식(CAN vs Ethernet)을 선택했는지,
- 왜 특정 기능을 실시간 태스크에 넣었는지 등은 모두 설계자의 판단과 근거가 담긴 결정입니다.
이러한 의사결정은 시간이 지나면 잊히기 쉽고, 다른 개발자에게는 설명되지 않은 ‘암묵지’로 남기 쉬운데, 이럴 경우 시스템 변경 시 큰 혼란이나 오류로 이어질 수 있습니다.
아키텍처 뷰는 설계 결정을 문서화하고 시각화함으로써, 왜 그런 구조가 선택되었는지를 명확하게 보여주는 역할을 합니다.
- 논리 뷰는 모듈 분할과 책임 분배의 이유를,
- 프로세스 뷰는 실시간성이나 병렬 처리 전략의 정당성을,
- 물리 뷰는 하드웨어 제약이나 네트워크 선택의 이유를 드러냅니다.
결국 아키텍처 뷰는 단순한 결과가 아니라, 의사결정 과정을 투명하게 기록하고 공유함으로써, 미래의 설계 변경이나 리뷰 시 중요한 판단 근거가 됩니다.
다음표는 위 4가지 필요성을 정리한 표입니다.
목적 | 설명 | 기대효과 |
복잡성 관리 | 복잡한 시스템을 관심사별로 분할하여 각 뷰에서 단순하고 명확하게 표현 | 시스템 구조에 대한 이해 용이, 설계 오류 예방 |
문제 식별 및 설계 검토 | 각 뷰를 통해 기능 누락, 병목, 구조적 충돌 등 설계상의 문제를 조기에 발견 | 개발 초기 문제 탐지, 품질 향상, 재작업 비용 절감 |
커뮤니케이션 | 다양한 이해관계자의 관점에 맞는 뷰를 제공하여 소통을 명확하게 지원 | 팀 간 협업 촉진, 요구사항 해석 오류 감소 |
의사결정 근거 | 구조, 모듈화, 기술 선택 등의 설계 결정에 대한 이유와 맥락을 문서화 및 시각적으로 표현 | 추적 가능성 확보, 변경 대응 용이, 설계의 일관성과 지속 가능성 확보 |
3. 실무에서의 소프트웨어 아키텍처 뷰 활용
3.1 요구사항 분석 및 기능 분할
요구사항 분석 단계에서 논리 뷰(Logical View)를 사용하면, 기능별로 시스템을 분할하고 그 역할을 명확히 정의할 수 있습니다. 예를 들어 자동차 구동 제어기(DCU) 시스템에서는 다음과 같이 구분할 수 있습니다:
- 입력 처리 모듈: 센서 값 수신
- 제어 로직 모듈: 토크 연산, 안전 검증
- 출력 제어 모듈: 인버터 명령 송신
이러한 구조를 논리 뷰로 표현하면, 설계 논리의 누락이나 충돌을 사전에 발견할 수 있으며, 요구사항 간 경계를 명확히 할 수 있습니다.
3.2 개발 계획 및 코드 구조 정리
개발 뷰(Development View)는 실질적인 코드 작성과 팀 분담을 위한 기준을 제공합니다. 모듈 단위로 디렉토리 구조를 정리하고, 인터페이스와 의존성을 시각화함으로써 다음과 같은 이점을 얻을 수 있습니다:
- 팀 간 작업 경계 명확화
- 모듈 간 중복 또는 순환 의존 예방
- Git 저장소 구조 설계 기준 제공
개발 뷰는 또한 코드 리뷰 기준을 정의하는 데에도 유용하며, 아키텍처 규칙에 따른 소스 구조 준수를 쉽게 점검할 수 있습니다.
3.3 성능 및 실시간 제약 검토
프로세스 뷰(Process View)는 태스크 구조와 실시간 성능을 설계하는 데 필수적인 역할을 합니다. 예를 들어 제어주기가 10ms인 태스크에서 처리해야 할 로직이 너무 많다면, 해당 모듈을 더 느린 주기의 태스크로 옮기거나 분리하는 판단이 필요합니다.
이 뷰를 통해 다음과 같은 결정을 지원할 수 있습니다:
- CPU 부하 균형 설계
- 우선순위 기반 태스크 스케줄링
- 병렬 실행 시 동기화 문제 확인
또한, 실제 실행 흐름과 메시지 큐, 공유 리소스 등을 도식화함으로써 데드락이나 레이스 컨디션 등의 문제를 설계 단계에서 사전에 파악할 수 있습니다.
3.4 시스템 통합 및 배포 전략 수립
물리 뷰(Physical View)는 시스템의 배포 구조와 하드웨어 환경을 설명합니다. 예를 들어 여러 제어기 간 CAN 네트워크를 통해 데이터가 어떻게 흐르고, 각 제어기가 어떤 센서 또는 액추에이터와 연결되는지를 시각적으로 표현할 수 있습니다.
이 뷰는 다음의 작업에서 중요한 기준이 됩니다:
- 배포 아키텍처 설계
- 네트워크 대역폭 분석
- 고장 격리(Fault Isolation) 설계
또한 실제 하드웨어 시뮬레이션 및 테스트 환경을 구성할 때 이 뷰가 기준 자료로 활용됩니다.
3.5 테스트 및 검증 활동 지원
유스케이스 뷰(Use Case View)는 사용자 시나리오나 외부 이벤트에 따라 시스템이 어떻게 반응하는지를 설명합니다. 테스트 시나리오 설계나 테스트 케이스 추출, 그리고 요구사항 기반 검증 활동에서 유용하게 사용됩니다.
예를 들어 “운전자가 가속페달을 밟는다”는 유스케이스는 다음 흐름으로 설명될 수 있습니다:
- 페달 센서 → DCU → 토크 연산 → 모터 제어 → 차량 가속
이 시나리오는 요구사항 추적성과 테스트 커버리지 확보 측면에서도 매우 중요합니다.
3.6 Kruchten의 4+1 View Model 기반 예
- 논리 뷰: 초기 설계 회의에서 주요 기능별 블록을 나누고, 각 블록별 책임을 정의함
- 개발 뷰: GitLab 저장소에 맞춰 모듈별 디렉토리 구조를 설계하고, 코드 리뷰 룰을 설정
- 프로세스 뷰: 실시간 제약 조건을 기준으로 태스크별 실행 주기를 조정하고, MCU 자원 계획 수립
- 물리 뷰: 차량 네트워크 상의 통신 경로를 정의하고, 배포 중인 ECU의 병렬 운용 전략을 설계
- 유스케이스 뷰: 운전자 시나리오 기반의 테스트 항목 도출 및 품질 검증 문서화
이러한 뷰들은 단지 문서로 끝나는 것이 아니라, CI/CD 파이프라인, 요구사항 관리 도구, 기능안전 분석 도구와 연동되어 실시간으로 갱신되며 프로젝트 전반의 의사결정과 품질 확보에 직접 활용될 수 있습니다.
4. 소프트웨어 아키텍처 뷰가 실패하는 경우
4.1 목적 없는 문서화: 누구를 위한 뷰인가?
아키텍처 뷰가 가장 흔히 실패하는 이유는 ‘대상이 없는 문서’가 되는 경우입니다.
- 개발자에게도 어렵고, 운영자에게도 쓸모없으며, 리뷰어조차 이해하지 못하는 복잡한 다이어그램
- ‘상위 보고용’ 또는 ‘감사용’ 문서로만 존재하며, 실제 설계와 동떨어진 형식적인 산출물
- 프로젝트 관리자의 요구로만 작성되었고, 실질적인 사용자가 없는 경우
결과적으로 뷰는 누구의 문제도 해결하지 못하고, 아무도 사용하지 않는 문서가 됩니다.
아키텍처 뷰는 특정 이해관계자의 ‘관심사’를 해결하기 위해 존재해야 합니다. 뷰를 만들기 전, 반드시 “이 뷰를 통해 누가 어떤 결정을 내릴 것인가?”를 정의해야 합니다.
4.2 뷰 간 불일치: 시스템은 하나인데 그림은 여러 개
논리 뷰에서는 모듈이 5개인데, 개발 뷰에서는 7개, 배포 뷰에서는 또 다른 구조로 표현된다면 어떻게 될까요? 이처럼 뷰 간의 불일치는 설계 신뢰도를 떨어뜨리고, 오히려 혼란을 가중시킵니다.
- 설계자가 설계한 구조와 실제 코드 구조가 다름
- 물리 뷰 상의 통신 경로가 논리 뷰에서 반영되지 않음
- 프로세스 뷰의 태스크 구조가 코드 상에는 존재하지 않음
이는 시스템이 실제로 어떻게 동작하는지를 이해하기 어렵게 만들고, 리팩토링, 문제 분석, 검증 모두를 어렵게 만듭니다.
뷰는 분리되어 있지만 일관된 설계 원칙과 데이터 흐름을 공유해야 합니다. 서로 다른 뷰가 ‘같은 시스템’을 설명하고 있다는 것을 잊지 말아야 합니다.
4.3 형식에 갇힌 표현: 보기 좋은 그림이 설계를 가리는 경우
뷰를 UML 도구로 자동 생성하거나, 템플릿에 맞춰 형식적으로 작성하는 경우가 많습니다. 하지만 이런 방식은 다음과 같은 함정에 빠지기 쉽습니다.
- 다이어그램은 복잡하고 멋지지만 핵심 설계 의도가 보이지 않음
- 구조는 맞지만 왜 그런 구조가 필요한지 설명이 없음
- 필드에서는 적용되지 않거나, 실제 시스템과 괴리된 추상적 구조만 존재함
결국, 뷰는 ‘설계의 표현’이 아니라 ‘형식의 복제물’이 되어 버립니다. 이는 설계의 본질을 감추는 껍데기가 될 수 있습니다.
뷰는 정보를 담기 위한 그릇이지, 그 자체가 목적이 아닙니다. 뷰는 설계의 맥락과 의도를 직관적으로 전달해야 하며, 필요시 텍스트와 설명이 병행되어야 합니다.
4.4 유지되지 않는 문서: 죽은 뷰는 오류를 낳는다
처음엔 잘 만들어졌던 아키텍처 뷰도 프로젝트가 진행되며 점점 현실과 멀어지는 경우가 많습니다.
- 시스템이 진화했지만 뷰는 업데이트되지 않음
- 설계 변경 사항이 뷰에 반영되지 않음
- 오래된 뷰를 기준으로 신입 개발자가 오해를 하고 잘못된 설계를 이어감
이처럼 ‘살아 있지 않은 뷰’는 오히려 프로젝트의 오류를 유발하는 근거가 됩니다. 특히 유지보수 단계나 신규 개발자 온보딩 시에 큰 문제를 일으킵니다.
아키텍처 뷰는 지속적으로 갱신되어야 하는 살아있는 문서입니다. 변경 이력 관리와 함께, 주요 변경 사항이 뷰에 즉시 반영되도록 해야 합니다.
4.5 조직 문화와 뷰의 실패: 소통 없는 설계는 설계가 아니다
아키텍처 뷰의 실패는 단순히 개인의 역량 부족이 아니라, 종종 조직 문화와 개발 방식의 문제에서 비롯됩니다.
- 아키텍처 설계가 폐쇄적으로 이루어지고, 팀원들과 공유되지 않음
- 뷰에 대해 팀 내 교육이나 설명이 부족하여 실사용자가 없음
- 설계 의사결정이 문서화되지 않고 구두로만 전해지는 관행
결과적으로, 아무리 뷰가 있어도 그것을 사용하는 사람이 없거나, 사용법을 모르면 무용지물이 됩니다.
아키텍처 뷰는 팀 전체가 ‘공동으로 이해하고, 토론하고, 사용하는 도구’가 되어야 합니다. 공유 문화와 교육이 병행되지 않으면, 그 어떤 뷰도 역할을 하지 못합니다.
마치며... 아키텍처 뷰.. 지금은 불필요해 보여도, 결국 강력한 무기가 된다.
소프트웨어 개발 현장에서 아키텍처 뷰에 대한 이해가 부족한 모습을 자주 마주합니다. “이걸 그려서 뭐가 달라지느냐”, “지금은 코딩이 우선인데, 문서는 나중에 해도 되지 않느냐”, “결국 아무도 보지 않는 문서 아닌가”라는 회의적인 반응은 생각보다 흔합니다. 특히 빠듯한 일정 속에서 기능 개발에 집중해야 하는 상황에서는, 아키텍처 뷰 작성이 시간을 잡아먹는 불필요한 작업처럼 느껴지기 쉽습니다.
하지만 이런 인식은 단기적 효율성에만 초점을 맞춘 결과이며, 장기적인 시스템 생존성이라는 본질에서 벗어난 오해입니다. 아키텍처 뷰는 단순한 다이어그램이나 문서가 아니라, 설계 의도를 기록하고, 시스템을 다양한 관점에서 해석할 수 있도록 도와주는 구조화된 사고 도구입니다. 그것은 개발자의 직관을 설계 언어로 바꾸고, 팀의 논리를 공유 가능한 형태로 시각화하며, 시스템의 복잡함을 분해하고 설명할 수 있게 해주는 ‘설계의 지도’입니다.
지금 당장은 효용이 보이지 않을 수 있습니다. 당장의 개발 속도에는 도움이 되지 않을 수도 있습니다. 그러나 시스템이 커지고, 요구사항이 변화하고, 팀원이 바뀌고, 유지보수가 반복되는 시점이 오면 — 우리는 반드시 다시 묻게 됩니다.
- 이 시스템은 왜 이렇게 구성되었는가?
- 변경하려면 어디를 손봐야 하는가?
- 새로운 기능이 어떤 영향을 줄 수 있는가?
그리고 이 질문들에 명확하고 논리적으로 답할 수 있는 유일한 도구가 바로 ‘아키텍처 뷰’입니다.
아키텍처 뷰는 설계 결정을 되짚을 수 있는 근거가 되고, 기능 간의 경계를 명확히 해주며, 협업 시 혼란을 줄이고, 품질 확보와 인증 대응에도 중요한 기반이 됩니다.
결국 아키텍처 뷰는 ‘문서’가 아니라 ‘구조’입니다.
시스템의 복잡성을 이해 가능한 단위로 나누고, 각기 다른 이해관계자가 공통된 언어로 소통하게 만들며, 시스템이 지속적으로 진화할 수 있도록 돕는 가장 기초적이면서도 강력한 아키텍처 지원 도구입니다.
아키텍처 뷰는 당장의 성과를 위한 것이 아닙니다. 그것은 변화를 견디고, 시스템을 유지하고, 미래를 설계할 수 있도록 도와주는 설계의 기반입니다.
지금은 눈에 띄지 않을지라도, 시간이 흐를수록 그 가치는 반드시 드러납니다.
그래서 우리는 질문을 바꿔야 합니다.
“이걸 왜 해야 하지?”가 아니라,
“이걸 하지 않고도 시스템을 지탱할 수 있을까?”
'Software Engineering > Architecture' 카테고리의 다른 글
SW 아키텍처 모듈화: 객체지향 설계 품질 향상 - CBO(객체 간 결합도) 메트릭 완벽 가이드 (2) | 2024.12.18 |
---|---|
Software Architect Architecting Architecture: 소프트웨어 아키텍처와 설계의 역할 (0) | 2024.11.28 |
High Level Architecture 오해 : 추상적이고 실제 개발과 동떨어져 있다. (0) | 2024.11.28 |
SW 아키텍처 모듈화: 아키텍처 결합도 측정 기법 (Afferent and Efferent Coupling) (0) | 2024.09.03 |
SW 아키텍처 모듈화: 아키텍처 응집도 측정 기법 (Lack of Cohesion in Methods, LCOM) (1) | 2024.09.02 |