Software Architecture
- 소프트웨어 구성 요소들 간의 관계 표현하는 시스템 구조
- 소프트웨어 아키텍쳐 설계는 사용자의 기능적 요구사항
- 기능적 요구사항으로 나타난 제약조건
기본원리
모듈화
소프트웨어 성능을 향상시키거나 시스템의 수정 및 재사용, 유지관리 작업이 용이하도록 기능들을 모듈단위로 나누는 작업
모듈 크기가 작으면 모듈 간 통합 비용발생. 크면 비용은 적으나 모듈달 개발비용 증가
추상화
문제의 전체적이고 포괄적인 개념 설계 후 차례로 세분화하여 구체화시키는 작업
(불필요한 부분 생략하고 필요한 부분만 강조화하여 모델화)으로 과정 추상화, 데이터 추상화, 제어 추상화로 분류 가능
단계적 분해
하향식 설계 전략으로 문제를 상위의 중요 개념으로부터 하위의 개념으로 구체화시키는 분할 기법
정보 은닉
한 모듈 내에 포함된 절차와 자료들의 정보가 감추어져 다른 모듈이 접근하거나 변경하지 못하도록 하는 기법
Architecture Pattern
소프트웨어 아키텍처를 설계할 떄 참조할 수 있는 전형적인 해결방식을 의미하며 구조를 구성하기 위한 기본적인 윤곽을 제시한다.
서브 시스템들과 그 역할이 정의되어 있으며, 서브시스템 사이의 관계와 여러 규칙/지침이 포함되어 있다.

layer pattern
- 시스템을 계층으로 구분하여 구성
- 각각의 서브시스템들이 계층 구조
- 상위 계층은 하위계층에 대한 서비스 제공자, 하위계층은 상위 계층의 클라이언트
- 서로 마주보는 두 개의 계층 사이에서만 상호작용이 이루어지므로 변경 사항 적용시에도 두 개 계층에만 영향을 미침
- 특정 계층만을 교체해 시스템 개선이 가능
- 활용 예) OSI참조모델

Client-server pattern
- 하나의 서버와 다수의 클라이언트, 두 부분으로 구성
- 클라이언트가 서버에 서비스를 요청하면 서버는 클라이언트에게 적절한 서비스 제공
- 서버는 계속 클라이언트로부터의 요청을 대기
- 클라이언트나 서버는 요청과 응답을 받기 위해 동기화되는 경우를 제외하고는 독립적
- 활용 예) 이메일, 문서공유 애플리케이션

master slave pattern
- 마슽 컴포넌트는 슬레이브 컴포넌트들로 작업을 분산시킨 후, 슬레이브가 처리한 결과값을 다시 반환 받는 방법으로 작업을 수행하는 패턴
- 활용 예) 장애허용 시스템, 병렬 컴퓨팅

pipe-filter pattern
- 데이터 스트림을 생성하고 처리하는 각 과정은 filer 컴포넌트에서 캡슐화하여 이루어지며, 처리되는 데이터는 pipe 를 통해 데이터를 전송
- filter 컴포넌트는 재사용성이 좋고 추가가 쉬워 확장이 용이
- filter 컴포넌트들을 재배치하여 다양한 파이프라인 구축 가능
- 활용 예) 데이터 변환, 버퍼링, 동기화, UNIX shell

model-view-controller pattern
- 서브시스템을 3개 부분으로 구조화하는 패턴
- 모델 : 데이터와 비즈니스 로직 관리
- 뷰 : 레이아웃과 화면 처리하여 사용자에게 정보 표시
- 컨트롤러 : 뷰로부터 받은 명령 처리
- 각 부분은 별도의 컴포넌트로 분리되어 있으므로 서로 영향을 받지 않고 개발작업 수행
- 활용 예) 대화형 애플리케이션(여러 개 뷰를 만들 수 있으므로 한 개 모델에 대해 여러 개 뷰를 필요로 하는)

event-bus pattern
- 4가지 컴포넌트로 구성되는 패턴
- event source : 이벤트 생성
- event listener : 이벤트 실행
- channel : 이벤트 종료
- bus
- 활용 예) 안드로이드, 알림 서비스

broker pattern
- 사용자가 원하는 서비스와 특성을 브로커에 요청
- 브로커 컴포넌트가 요청에 맞는 컴포넌트와 사용자 연결
- 원격서비스 호출에 응답하는 컴포넌트들이 여러개일 경우 적합
- 활용 예) 분산시스템에 사용

blackboard pattern
- 해결전략이 명확하지 않은 무제 처리에 유용
- 모든 컴포넌트들이 공유 데이터 저장소와 블랙보드 컴포넌트에 접근이 가능한 형태
- 컴포넌트들은 검색을 통해 블랙보드에서 원하는 데이터 찾을 수 있다
- 컴포너트는 블랙보드에 추가되는 새로운 데이터 객체 생성 가능
- 특정 종류의 데이터를 찾으며, 기존의 지식 소스와의 패턴 매칭으로 데이터 찾음
- 활용 예) 음성인식, 차량 식별, 신호 해석 등

interpreter pattern
- 특정 언어로 작성된 프로그램 해석하는 컴포넌트 설계 시 사용
- 프로그램 각 라인을 수행하는 방법을 지정
- 언어의 각 기호에 대해 클래스 생성
- 활용 예)sql 과 같은 DB 쿼리 언어

peer to peer pattern
- 피어를 하나의 컴포넌트로 간주
- 각 피어는 클라이언트 혹은 서버가 될 수도 있는 패턴
- 활용 예) 파일 공유 네트워크, 멀티미디어 프로토콜