4장 서버프로그램 구현
소프트웨어 아키텍처 : 소프트웨어를 구성하는 요소들간의 관계를 표현하는 시스템의 구조 또는 구조체
소프트웨어 아키텍처 설계의 기본 원리
-
모듈화
소프트웨어의 성능향상, 시스템의 수정 및 재사용, 유지관리 등이 용이하도록 시스템의 기능을 모듈단위로 나누는 것.
-
추상화
문제의 전체적이고 포괄적인 개념을 설계한 후 차례로 세분화하여 구체화시켜 나가는 것.
-
단계적 분해
상위의 중요한 개념으로부터 하위의 개념으로 구체화시키는 분할 기법.
-
정보은닉
한 모듈 내부에 포함된 절차와 자료들의 정보가 감추어져 다른 모듈이 접근하거나 변경하지 못하도록 하는 것.
소프트웨어개발 설계 단계
- 상위설계 : 시스템의 전체적인 구조를 정의. ( 시스템의 뼈대 )
시스템의 구성요소들 간의 상호작용 결정. ( 모듈화를 중점으로 다룸 )
주로 UML(Unified Modeling Language)를 사용.
- 하위설계 : 시스템의 내부구조, 행위를 정의.
상위설계에서 정의된 구조를 더 구체적으로 세분화하고 구현 가능한 단계로 변환.
주로 구체적인 프로그래밍 언어와 라이브러리에 의존.
협약에 의한 설계 : 컴포넌트 간의 상호작용을 정의하는 방법론 중 하나. ( 상위 설계 )
컴포넌트 간의 명확한 인터페이스를 제공하고, 각 컴포넌트가 서로에 대해 어떤 기대를 가지는지를 명시적으로 정의. 이를 위해 다음 3가지 주요 요소를 사용.
-
선행 조건 : 오퍼레이션이 호출되기 전에 참이 되어야 할 조건
ex) 함수가 양의 정수만을 받아들이는 경우, 그 함수의 선행 조건은 입력값이 양수여야 한다는 것.
-
결과 조건 : 오퍼레이션이 수행 된 후 만족되어야 할 조건
ex) 함수가 두 정수를 더하는 경우, 결과 조건은 함수의 반환값이 두 정수의 합이 되어야 한다는 것.
-
불변 조건 : 오퍼레이션이 실행되는 동안 항상 만족되어야 할 조건
ex) 객체의 특정 속성이 항상 양수여야 한다면, 해당 속성에 대한 불변 조건은 그 값이 음수가 되지 않아야 한다는 것.
아키텍처패턴
: 소프트웨어 시스템을 설계할 때 사용되는 구조적인 설계 방법론
- 레이어 패턴 : 시스템을 계층으로 구분하여 구성
- 클라이언트-서버 패턴 : 하나의 서버 컴포넌트와 다수의 클라이언트 컴포넌트로 구성되는 패턴
- 파이프필터 패턴 : 데이터 처리를 필터로 캡슐화하여 파이프를 통해 전송하는 패턴
- 모델-뷰-컨트롤러 패턴 : 서브시스템을 모델, 뷰, 컨트롤러로 구조화하는 패턴
- 마스터-슬레이브 패턴 : 슬레이브 컴포넌트에서 처리된 결과물을 다시 돌려받는 방식으로 작업을 수행하는 패턴
- 브로커 패턴 : 사용자가 원하는 서비스와 특성을 브로커 컴포넌트에 요청하면 브로커 컴포넌트가 요청에 맞는 컴포넌트와 사용자를 연결해주는 패턴
- 피어 투 피어 패턴 : 피어라고 불리는 하나의 컴포넌트가 클라이언트가 될 수도, 서버가 될 수도 있는 패턴
- 이벤트 버스 패턴 : 소스가 특정채널에 이벤트 메시지를 발행하면 해당 채널을 구독한 리스너들이 메시지를 받아 이벤트를 처리하는 패턴
- 블랙보드 패턴 : 모든 컴포넌트들이 공유 데이터와 블랙보드 컴포넌트에 접근 가능한 패턴
- 인터프리터 패턴 : 프로그램 코드의 각 라인을 수행하는 방법을 지정하고, 기호마다 클래스를 갖도록 구성된 패턴
객체지향
- 객체 : 데이터와 이를 처리하기 위한 함수들을 묶어놓은 소프트웨어 모듈
- 클래스 : 공통된 속성과 연산을 갖는 객체의 집합
- 메시지 : 객체들간의 상호작용에 사용되는 수단
- 캡슐화 : 외부에서의 접근을 제한하기 위해 인터페이스를 제외한 세부 내용을 은닉하는 것
- 상속 : 상위클래스의 모든 속성과 연산을 하위클래스가 물려 받는 것
- 다형성 : 하나의 메시지에 대해 각각의 객체가 가지고 있는 고유한 방법으로 응답할 수 있는 특성
연관성
: 두개 이상의 객체들이 상호 참조하는 관계
- 연관화 : 2개 이상의 객체가 상호 관련 있음을 의미
- 분류화 : 동일한 특성을 갖는 객체들을 모아 구성하는 것
- 집단화 : 관련있는 객체들을 묶어 하나의 상위객체를 구성하는 것
- 일반화 : 공통적인 성질들로 추상화한 상위 객체를 구성하는 것
- 특수화/상세화 : 상위객체를 구체화하여 하위 객체를 구성하는 것
객체지향 분석의 방법론
- 럼바우 방법 : 분석활동을 객체모델, 동적모델, 기능모델로 나누어 수행
- Booch 방법 : 클래스와 객체들을 분석 및 식별하고 클래스의 속성과 연산을 정의
- Jacobson 방법 : 유스케이스를 강조하여 사용
- Coad와 Yourdon방법 : E-R다이어그램을 사용하여 객체의 행위를 모델링 함
럼바우 분석 기법
: 모든 소프트웨어 구성요를 그래픽 표기법을 사용하여 모델링하는 기법
객체모델링 > 동적모델링 > 기능모델링
-
객체모델링 : 정보모델링. 시스템에서 요구되는 객체를 찾아내어 속성과 연산 식별 및 객체들간의 관계를 규정하여 객체 다이어그램으로 표시하는 것
-
동적모델링 : 상태다이어그램을 이용하여 시간의 흐름에 따른 객체들간의 제어흐름, 상호작용, 동작순서 등의 동적인 행위를 표현하는 모델링
-
기능모델링 : 자료흐름도를 이용하여 다수의 프로세스들 간의 자료 흐름을 중심으로 처리 과정을 표현한 모델링
객체지향 설계 원칙
: 변경이나 확장에 유연한 시스템을 설계하기 위해 지켜져야 할 원칙
- 단일책임 원칙(SRP) : 객체는 단 하나의 책임만 가져야한다는 원칙
- 개방-폐쇄 원칙(OCP) : 기존의 코드를 변경하지 않고, 기능을 추가할 수 있도록 설계해야한다는 원칙
- 리스코프 치환 원칙(LSP) : 자식클래스는 최소한 부모클래스의 기능은 수행할 수 있어야한다는 원칙
- 인터페이스 분리 원칙(ISP) : 자신이 사용하지 않는 인터페이스와 의존관계를 맺거나 영향을 받지 않아야한다는 원칙
- 의존 역전 원칙(DIP) : 의존관계 성립시 추상성이 높은 클래스와 의존관계를 맺어야 한다는 원칙