이해관계자들의 Concern(고려 사항)들을 반영하여
소프트웨어 시스템의 구조와 그 구성 요소 간의 관계, 기능/비기능 요구 사항과 제약 조건 등을 정의한 설계도
쉽게 말하면, 프로그램을 어떻게 나누고, 어떻게 연결하고, 어떻게 동작하도록 설계할지 큰 그림을 잡는 것
초기에 아키텍처 설계를 하지 않거나, 중요한 결정을 내리지 않고 무작정 개발을 시작한다면,
프로젝트 비용이 크게 증가할 수 있음
설계도 없이 강아지 집은 만들 수 있다.
허나, 설계도 없이 63빌딩을 지을 수 있겠는가?
시스템의 아키텍처에 중요한 영향을 미치는 요인들을 말함

Stakeholders의 Needs를 분석해서 AD(Architectural Driver)를 추출해내고,
시스템의 아키텍처에 결정적인 영향을 주는 핵심 요구사항(*ASR)을 분석하는 단계
ASR(Architecturally Significant Requirements)
아키텍처 설계에 결정적 영향을 주는 요구사항
- 즉, SRS(Software Requirements Specification) 중 아키텍처에 결정적인 영향을 미치는 요소들
- 주요 기능(Primary functionality): 시스템의 가장 중요하고 새로운 핵심 기능 (5% of FR)
- 품질 속성(Quality Attribute): 성능, 보안, 확장성 등 시스템의 품질 관련 속성 (100% of NFR)
- 기타 설계 제약사항(Constraints): 제약조건, 규칙, 표준 등 (~% of Constraints)
ASR을 중심으로 모든 AD를 만족시키는 구조와 컴포넌트 설계
품질 속성(QA, Quality Attribute) 중심으로 아키텍처를 설계하는 방법론인 *ADD 3.0를 주로 사용
다양한 Architectural View를 활용함
모든 결정에는 Design rationale(이론적 해석)이 충분히 뒷받침 되어야 한다!
Design Concepts
특정 상황에 적합한 설계 방식을 선택할 수 있도록 도와주는 개념적 도구
1. Reference Architecture
2. Deployment Pattern
3. Architecture Style
4. Tactics
5. Externally Developed Components좋은 설계란?
- 모든 AD(Architectur.e Drivers)를 만족시키는 설계
- 이해관계자들이 "Why this design?" 이라 물었을 때, 타당한 근거가 존재하는 설계
ADD(Attribute-Driven Design) 3.0
그냥 AD 하나씩 뽀개는 방법임
- Overall system 대강 만들기
- Design by Constraint
- Design by Primary functionality
- Design Concepts(Architecture style, tatic, pattern) 사용해서 남은 AD 하나씩 Design (~ Iteration)
ATAM (Architecture Trade-off Analysis Method)
시스템 아키텍처의 품질 속성(Quality Attribute)을 평가하고, 설계 상충(trade-off)을 발견하는 방법
설계 및 평가가 완료된 아키텍처를 구현
Low-level Design (Detailed Design)
Coding / Programming (구현)
성능/품질 최적화
“이 설계가 모든 이해관계자의 Concern(고려 사항)들을 잘 해결하고 있는가?”
→ Full Traceability로 답할 수 있어야 함
Traceability(추적 가능성)
설계의 완성도, 일관성을 판단하는 기준으로,
아키텍쳐 설계 과정에서의 모든 산출물이 첫 요구 사항, Constraint과 잘 연결된 정도
→ 즉, 빠진 거 없이 설계에 모두 반영되어야 한다.

생각보다 복잡했고
생각보다 재밌었다
실제 시스템의 첫 설계부터 구현, 테스트까지 전 과정을 경험해보고 싶다