소프트웨어 아키텍처
소프트웨어의 골격이 되는 기본 구조이자, 소프트웨어를 구성하는 요소들 간의 관계를 표현하는 시스템 구조
- 개발 시 적용되는 원칙과 지침, 의사소통 도구
- 좋은 품질을 유지하며 비기능적 요구사항으로 나타난 제약을 반영, 기능적 요구사항을 구현하는 방법을 찾는 과정
- 애플리케이션 분할 방법, 분할된 모듈에 할당될 기능, 모듈 간 인터페이스 등 결정
모듈화(Modularity)
시스템의 기능들을 모듈 단위로 나누는 것
- 프로젝트의 재사용성 향상
- 모듈의 크기를 작게 나누면 통합 비용이 많이 들고, 크게 나누면 하나의 개발 비용이 많이 듬
- 인터페이스가 단순해 짐
- 프로그램의 효율적인 관리 가능
- 오류의 파급 효과 최소화
추상화(Abstraction)
전체적이과 포괄적인 개념을 설계한 후 차례로 세분화하여 구체화 하는 것
- 완전한 시스템 구축 전 유사한 모델을 만들어 테스트
- 최소 비용으로 실제 상황 대처 및 시스템 구성 파악
추상화 유형
- 과정 추상화 : 전반적인 흐름만 파악하도록 설계
- 데이터 추상화 : 데이터 구조를 대표할 수 있는 표현으로 대체하는 방법
- 제어 추상화 : 이벤트 발생을 대표할 수 있는 표현으로 대체하는 방법
단계적 분해
문제를 상위 중요 개념에서 하위 개념으로 구체화시키는 분할 기법
- 추상화의 반복에 의해 세분화
- 기기능에서 시작해 구체화하고, 알고리즘, 자료 구조 등 상세 내역은 가능한 뒤로 미루어 진행
정보 은닉
한 모듈 내부에 포함된 절차와 자료들의 정보가 감추어 다른 모듈이 접근하거나 변경하지 못하도록 하는 기법
- 필요한 정보만 인터페이스를 통해 주고 받음
- 모듈을 독립적으로 수행할 수 있음
- 다른 모듈에 영향을 주지 않음 -> 수정, 시험, 유지보수 용이
소프트웨어 아키텍처 품질 속성
시스템 측면
- 성능 : 이벤트 발생 시 적절하고 빠르게 처리
- 보안 : 허용되지 않은 접근을 막고 허용된 접근은 적절한 서비스 제공
- 가용성 : 장애 없이 정상적으로 서비스 제공
- 기능성 : 사용자가 요구한 기능을 만족스럽게 구현
- 사용성 : 소프트웨어를 명확하고 편리하게 구현
- 변경 용이성 : 처음 목표와 다른 플랫폼에서도 동작할 수 있도록 구현
- 확장성 : 용량, 처리능력 등을 확장시켰을 때 효과적으로 활용할 수 있도록 구현
- 기타 : 테스트 용이성, 배치성, 안정성 등
비즈니스 측면
- 시작 적시성 : 정해진 시간에 맞춰 출시
- 비용과 혜택 : 비용을 더 투자하여 유연성 높은 아키텍처를 개발할 것인지. 유연성이 떨어지면 많은 비용 소모
- 예상 시스템 수명 : 시스템을 얼마나 오래 사용할 것인지
- 기타 : 목표 시장, 공개 일정 등
아키텍처 측면
- 개념적 무결성 : 전체 시스템과 구성 요소들 간 일관성 유지
- 정확성, 완결성 : 발생하는 제약사항을 모두 충족
- 구축 가능성 : 모듈 단위의 시스템을 적절히 분배해 유연하게 일정 변경
- 기타 : 변경성, 시험성, 적응성 등
소프트웨어 아키텍처 설계 과정
- 설계 목표 설정
- 시스템 타입 결정
- 아키텍처 패턴 적용
- 서브시스템 구체화
- 검토