3. 애플리케이션 설계
3-1. 소프트웨어 아키텍쳐
: 소프트웨어를 구성하는 요소들간의 관계를 표현하는 시스템의 구조 또는 구조체
- 비기능적 요구사항으로 나타난 제약을 반영 / 기능적 요구사항을 구현
- 기본원리
3-1-※ 상위 설계와 하위 설계
| 상위 설계 | 하위 설계 |
---|
별칭 | 아키텍쳐 설계, 예비 설계 | 모듈 설계, 상세 설계 |
설계 대상 | 시스템의 전체적인 구조 | 시스템의 내부 구조 및 정의 |
세부 목록 | 구조, DB, 인터페이스 | 컴포넌트, 자료구조, 알고리즘 |
3-1-1 모듈화
: 성능향상 , 소프트웨어의 수정 및 재사용, 유지 관리등이 용이하도록 시스템의 기능을 모듈 단위로 나눔
- 모듈을 작게 나누면 → 모듈 간 통합 비용 多 / 모듈으 크게 나누면 → 하나의 개발 비용 多
3-1-2 추상화
: 전체적이고 포괄적 개념 설계 → 세분화 하며 구체화
- 완전한 시스템 구축 이전에, 유사한 모델을 만들어서 기능 테스트
- 과정 추상화 : 전반적 흐름 파악
- 데이터 추상화 : 데이터 구조 파악 (세부적 속성이나 용도 정의 X)
- 제어 추상화 : 대표할 수 있는 표현으로 대체 (이벤트 발생 등을 정의 X)
3-1-3 단계적 분해
: 하향식 설계 전략
- 추상화의 반복에 의해 세분화 됨
- 소프트웨어의 기능 → 알고리즘 → 자료구조 →.... (상세한 내용일수록 뒤로 미뤄짐)
3-1-4 정보은닉
: 한 모듈 내에서 포함된 절차와 정보가 감추어져, 다른 모듈이 이를 변경하지 못하게함
- 모듈을 독립적으로 수행할 수 있음 (하나의 모듈이 변경 되더라도 다른 모듈에 영향을 주지 X)
- 수정, 시험, 유지보수 용이
3-1-5 소프트웨어 아키텍쳐의 품질속성
시스템 측면
- 성능 / 변경용이성 / 사용성 / 기능성 / 가용성 / 확장성 / 보안
- <u>***성능**을 **변경**했더니 용량 **사기가**를 **확보**했다.*</u>
비즈니스 측면
- 시장 적시성 / 비용과 혜택 / 예상 시스템 수명 / 기타 속성
아키텍쳐 측면
- 개념적 무결성(구성 요소들의 일관성 유지) / 정확성 완결성 / 구축 가능성 / 기타 속성
3-1-6. 소프트웨어 아키텍쳐의 설계과정
-
설계목표설정
-
시스템 타입 결정
-
아키텍쳐 패턴 적용
-
서브시스템 구체화
-
검토
※. 시스템 타입 / 협약에 의한 설계 : 선행 조건, 결과 조건, 불변 조건 을 포함한 효과적 설계
- ㅇ대화형 시스템 / 이벤트 중심 시스템 / 변환형 시스템 / 객체 영속형 시스템
3-2. 아키텍쳐 패턴
: 아키텍쳐를 설계할 때 참조할 수 있는 전형적인 해결 방식 또는 예제
3-2-1. 레이어 패턴
- 시스템을 계층 구분 하는 고전적 방법
- 상위 계층 (서비스 제공자) , 하위 계층 (클라이언트)
- 두개의 계층 사이에서만 상호 작용이 이루어져 변경 작업 용이 (특정 계층 만을 교체해서 시스템 개선하는 것이 가능)
- ex) OSI 참조 모델
3-2-3 클라이언트-서버 패턴
- 하나의 서버 : 다수의 클라이언트 컴포턴트 (사용자는 클라이언트와 소통, 클라이언트는 서버에 요청)
- 서버는 클라이언트의 요청을 대비해서 항상 대기 상태를 유지해야한다. (응답과정을 위해 동기화 될 때를 빼고는 독립적인 관계)
3-2-3 파이프-필터 패턴
- 데이터 스트림 절차의 각 단계를 컴포넌트로 캡슐화하여 파이프를 통해 데이터를 전송
- 재사용성 ↑ / 데이터변환, 버퍼링, 동기화 등에 주로 사용
- ex) UNIX의 쉘(Shell)
3-2-4 MVC 패턴
- 모델 : 서브시스템의 핵심 기능과 데이터 보관
- 뷰 : 사용자에게 정보를 표시
- 컨트롤러 : 사용자로부터 입력받은 입력을 처리
- 각각은 서로의 영향을 받지 않고 개발 작업을 수행할 수 있다.
- ex) 한개의 모델에 여러개의 뷰를 필요로 하는 대화형 애플리케이션에 적합
3-2-5 마스터-슬레이브패턴
- 마스터 컴포넌트 : 모든 작업의 주체 / 슬레이브 컴포넌트 : 마스터의 지시에 따라 작업을 수행하고 결과를 반환
- ex) 장애 허용 시스템, 병렬 컴퓨터 시스템에 활용
3-2-6 브로커 패턴
- 사용자가 원하는 특성을 브로커에 요청하고, 브로커가 연결해줌, 원격 서비스 호출에 응답하는 컴포넌트가 여러 개일때 적합
- ex) 분산환경 시스템에 주로 활용
3-2-7 피어 투 피어패턴
- 피어 : 하나의 컴포넌트 / 각 피어는 서비스를 호출하는 클라이언트or서버 무엇이든 될 수 있다.
- ex)전형적인 멀티 스레드 방식
3-2-8 이벤트-버스 패턴
- 소스가 특정 이벤트 메세지를 발행, 구독자들이 메세지를 받아 처리
3-2-9 블랙보드 패턴
- 모든 컴포넌트가 공유 데이터 저장소와 블랙보드 컴포넌트에 접근, 검색을 통해 원하는 데이터를 찾을 수 있음
- 해결책이 명확하지 않을 때 사용하기 좋음
- ex) 음성 인식, 차량 식별, 신호 해석 등등
3-2-10 인터프리터 패턴
- 프로그램 코드의 각 라인에 수행 방법을 지정, 기호마다 클래스를 구성
3-3. 객체지향(Object-Oriented)
- 유지보수 용이, 멀티미디어 데이터 및 병렬 처리를 지원
3-3-1 객체
- 데이터와 데이터를 처리하는 함수를 묶어놓은 하나의 소프트웨어 모듈
- 데이터 : 속성, 상태 변수, 상수, 자료 구조
- 함수 : 메소드, 서비스, 동작, 연산
- 객체는 독립적으로 식별 가능한 이름을 가진다
- 객체가 가질 수 있는 상태는 시간에 따라 변화한다
- 객체와 객체는 상호 연관성에 의한 관계가 형성된다
- 객체가 반응하는 메세지의 집합 = 행위, 객체는 행위의 특징을 나타낸다
- 객체는 일정한 기억장소를 가진다
3-3-2 클래스
- 객체들이 갖는 속성과 연산을 정의하고 있는 틀이자 데이터를 추상화 하는 단위
- 클래스에 속한 각각의 객체는 인스턴스라고 부르며 새로운 객체를 생성하는 것을 인스턴스화 라고함
3-3-3 캡슐화
- 인터페이스를 제외한 세부 내용이 은폐되어 외부의 접근이 제한저가, 외부 모듈에 영향을 적게 받음
- 재사용이 용이, 객체간의 결합도를 낮게한다
3-3-4 상속
- 하위클래스는 상위클래스의 모든 속성과 연산을 자신의 속성으로 사용 가능
- 하위클래스는 상속받은 이외의 새로운 속성과 연산을 첨가 가능
- 소프트웨어 재사용을 높이는 중요한 개념이다
3-3-5 다형성
3-3-6 연관성
종류 | 의미 | 특징 |
---|
is member of | 연관화(Association) | 2개 이상의 객체가 상호 관련됨 |
is instance of | 분류화(Classification) | 동일한 형의 특성을 갖는 객체들을 모아서 구성 |
is part of | 집단화(Aggregation) | 관련 있는 객체를 묶어 상위 객체 구성 |
is a | 일반화 / 특수화,상세화 | 상위 객체를 구체화하여 하위 객체를 구성 |
3-4. 객체지향 분석 및 설계
3-4-1 방법론
3-4-1-1 럼바우기법(: 객체 모델링 기법(OMT)) / ✏️객동기
: 객체 모델링 → 동적 모델링 → 기능 모델링
모델링종류 | 의미 |
---|
객체 모델링(Object Modeling) | 정보 모델링, 요구되는 객체를 찾아 속성과 연산 식별 및 객체들 간의 관계를 규정하여 객체 다이어그램으로 표시 |
동적 모델링(Dynamic Modeling) | 상태 다이어그램을 이용, 시간의 흐름에 따른 객체들의 행위를 표현 |
기능 모델링(Functional Modeling) | 자료흐름도(DFD)를 이용, 자료흐름을 중심으로 처리과정을 표현 |
3-4-1-2 부치방법
- 미시적 / 거시적으로 나뉨, 클래스와 객체들을 분석 및 식별하고 클래스의 속성과 연산을 정의
3-4-1-3 Jacobson방법
3-4-1-4 Coad와 Yourdon 방법
- E-R 다이어그램사용 / 객체 식별, 구조 식별, 구조 정의, 속성과 인스턴스의 연결 정의, 연산과 메시지 연결 정의 등
3-4-1-5 Wrifs-Brock 방법
- 분석과 설계의 구분X / 고객 명세서를 평가해서 설계까지 연속 수행
3-4-2 객체지향설계원칙(✏️SOLID)
- SRP (Solo Resopsibility Principle) : 객체는 단 하나의 책임만 가짐, 응집도↑ 결합도↓
- OCP(Open Closed Principle) : 코드 변경 없이 기능 추가 가능하도록 설계, 캡슐화가 대표적
- LSP(Liscok Substitution Principle) : 상속에 관한 내용
- ISP(Interface Segregation Principle) : 자신이 사용하지 않는 인터페이스와는 관계를 맺지 X,
- DIP(Dependency Inversion Principle) : 의존 관계가 성립할 때, 추상성이 낮은 클래스보단 추상성이 높은 클래스와 의존관계 on
3-5. 모듈
3-5-1 결합도(✏️자스제외공내)
3-5-2 응집도(✏️기순교절시논우)
3-5-3 팬인 팬아웃
- 팬인 : 어떤 모듈을 제어하는 모듈의 수
- 팬아웃 : 어떤 모듈에 의해 제어되는 모듈의 수
- 팬인↑ 재사용 측면에서 설계가 잘되어 있다, 단일장애점이 높을 수 있다.
- 팬아웃↑ 불필요하게 다른 모듈을 호출하는 건 아닌지 검토필요
- 팬인은 높고, 팬아웃은 낮을 수록 좋다
3-5-4 N-S차트
: 논리 기술에 중점을 둔 도형을 이용한 표현 방법. 박스 다이어그램, Chapin Chart 등
- 연속, 선택 및 다중 선택, 반복 등의 논리구조표현
- GOTO나 화살표를 사용X
- 시각적으로 명확히 식별하는데 적합, (선택과 반복구조를 시각적으로 표현)
- 총체적인 구조 표현과 인터페이스를 나타내기는 어려움
- 작성이 어렵고, 임의로 제어를 전의하는 것이 불가능
3-6. 공통모듈 (✏️완전(정)~명일추)
: 공통적으로 사용할 수 있는 모듈을 의미 (ex. 로그인 기능, 자주 사용되는 계산식 등)
-
명세 기법을 준수해야함
종류 | 의미 |
---|
완전성(Completeness) | 시스템 구현을 위해 필요한 모든 것을 구현 |
정확성(Correctness) | 시스템 구현시 해당기능이 필요함을 정확히 작성 |
명확성(Clarity) | 중의적 해석이 되지 않도록 명확히 작성 |
일관성(Consistency) | 공통 기능들 간 상호 충돌이 발생하지 않도록 작성 |
추적성(Traceablilty) | 기능에 대한 관계를 파악할 수 있도록 작성 |
-
재사용
- 함수와 객체 : 소스코드 재사용
- 컴포넌트 : 인터페이스 재사용
- 애플리케이션 : 애플레케이션을 공유하여 재사용
3-7. 코드 (✏️간식 분배표)
- 간소화 기능
- 식별 기능
- 분류 기능
- 배열 기능
- 표준화 기능
3-7-1. 코드의 종류
종류 | 의미 |
---|
순차코드(Sequence Code) | 순서 등 일정기준에 따라 차례로 일련번호 부여 ex) 1,2,3,4... |
블록 코드(Block Code) | 공통성이 있는 것끼리 블록으로 구분, 각 블록 내에서 일련번호 부여 ex) 1001 ~ 1100 총무부, 1101 ~ 1200 : 영업부 |
10진 코드(Decimal Code) | 0~9까지 10진분할 , 도서 분류식 코드라고도 함 ex) 1000 : 공학, 1100 : 소프트웨어 공학, 1110 : 소프트웨어설계 |
그룹 분류 코드(Group Classification Code) | 대분류,중분류,소분류로 구분하고 각 그룹 안에 일련번호 부여 |
연상 코드(Mnemonic Code) | 코드화 대상 항목 명칭이나 약호와 관계있는 숫자, 문자, 기호 등 ex) TV-40 : 40인치 TV |
표의 숫자 코드(Signification Digit Code) | 길이,넓이,부피,지름,높이 등의 물리적 수치 표현 ex) 120x720x1500 상판 |
합성 코드(Combined Code) | 2개이상의 코드를 조합 |
3-8. 디자인패턴
- 모듈의 세분화된 역할이나 인터페이스 같은 코드를 작성하는 수준의 세부 구현 방안을 설계할 때 참조하는
전형적인 해결 방식 또는 예제
- 문제 및 배경, 실제 적용 된 사례, 재사용이 가능한 샘플코드로 구성
: GoF 디자인 패턴 ( 생성패턴 5개 , 구조패턴 7개 , 행위 패턴 11개)
- 구조파악이 용이하고, 생산성을 높이는데 적합하며, 재사용을 통해 시간과 비용이 절감된다
- 초기 투자 비용은 부담될 수 있으며, 객체 지향 기반이 아닌 애플리케이션 개발엔 적합하지 X
3-8-1. 생성 패턴(Creation Pattern) ✏️빌더 추상 싱글 프메
종류 | 의미 |
---|
빌더(Builder) | 인스턴스를 건축하듯이 조립하여 객체 생성 생성과정과 표현방법을 분리, 동일한 환경에서도 서로 다른 결과 |
추상 팩토리(Abstract Factory) | 클래스에 의존 X, 인터페이스를 통해 연관 된 객체들을 그룹으로 생성해 추상적 표현 연관 된 서브 클래스를 한번에 묶어서 교체가 가능 |
싱글톤(Singleton) | 하나의 객체를 어디서든 참조 가능하지만, 여러가지가 동시에 참조는X 클래스 내에 인스턴스가 하나뿐임을 보장 |
프로토타입(Prototype) | 원본 객체를 복제하여 객체 생성 |
팩토리 메소드(Factory Method) | 객체 생성을 서브 클래스에 처리하도록 분리하여 캡슐화한 패턴 가상 생성자 패턴이라고도 함 상위클래스에서 객체를 생성하고 인터페이스를 정의, 하위에서 인스턴스를 생성 |
3-8-2. 구조 패턴(Structural Pattern) ✏️컴프브 데어퍼플
종류 | 의미 |
---|
컴포지트(Composite) | 복합 객체와 단일 객체를 구분없이 다루고자할때, 트리구조를 구성하여 복합 객체 안에 복합객체가 포함되는 구조 표현 |
프록시(Proxy) | 접근이 어려운 객체와 연결하려는 객체 사이의 인터페이스 역할 ex) 네트워크 연결, 메모리 대용량 객체의 접근 |
브릿지(Bridge) | 구현부의 추상층을 분리, 서로가 독립적으로 확장할 수 있도록 구성 기능과 구현을 두개의 별도 클래스로 구분 (다리 한쪽은 기능~ 다리 한쪽은 구현~) |
데코레이터(Decorator) | 객체간 결합으로 능동적으로 기능을 확장 부가기능 추가를 위해 다른 객체를 덧붙이는 방식 |
어댑터(Adaptor) | 호환성이 없는 클래스의 인터페이스를 다른 클래스가 이용할 수 있게 변환 기존에 구현되어 있는 클래스에 기능 발생시 키존 클래스를 재사용 할수 있도록 중간에서 맞춰줌 |
퍼싸드(Facade) | 상위에 인터페이스를 구성, 서브 클래스를 간편히 가용 가능하게함 Wrapper 클래스 필요 |
플라이웨이트(Flyweight) | 가능한 한 공유해서 사용함으로써 메모리를 절약, 다수의 유사 객체 생성 및 조작시 유용 |
3-8-3. 행위 패턴(Behavior Pattern)
- 책임연쇄(Chain of Responsibility) : 요청이 해결될 때 까지 고리를 책임에 따라 넘긴다
- 커맨드(Command) : 요청을 캡슐화하여 재이용하거나, 취소할 수 있도록 필요한 정보를 저장 혹은 로그에 남김
- 인터프리터(Interpreter) : 언어와 문법 표현을 정의 / SQL 등
- 반복자(Iterator) : 자료 구조와 같이 접근이 잦은 때 동일한 인터페이스를 사용하도록함
- 중재자(Mediator) : 상호작용을 캡슐화하여 객체로 정의하는 패턴, 객체간의 통제와 지시 역할 수행
- 메멘토(Memento) : 특정 시점에서 객체 내부 상태를 개체화, 이전 상태로 돌릴 수 있는 기능
- 옵서버(Observer) : 한 객체의 상태 변화를 ,상속된 다른 객체들에게 전달하는 패턴 / 이벤트 생성과 발생 등
- 상태(State) : 동일한 동작을 다르게 사용해야할때 사용
- 전략(Strategy) : 동일한 계열의 알고리즘을 개별적으로 캡슐화. 알고리즘의 선택 사용, 클라이언트에 영향 X
- 템플릿메소드(Template method) : 상위에서 골격 정의, 하부에서 세부처리 구체화 / 유지보수 용이
- 방문자(Visitor) : 처리기능을 분리하여 별도 클래스로 생성