소프트웨어의 설계 (Design)
소프트웨어 설계 모델링
- 개념: 요구사항을 만족하는 소프트웨어의 내부 구조 및 동적 행위들을 모델링하여 표현하고 분석, 검증, 명세화하는 단계
- 목적: 무엇을(What) ~ 어떻게(How)로 관점을 전환하면서 최종 제작할 소프트웨어의 청사진을 만드는 것
- 설계 모델링 시 주의사항
- 요구사항 분석의 정확성
- 명확성 : 복잡한 시스템을 간결하게 표현
- 적절성 : 시스템의 구조를 명확하게 하고 각 모듈을 독립적으로 개발할 수 있게 함
- 일관성 유지
- 변화에 대한 대응
- SW 개발 단계에서 프로그래밍 언어 선택 시 고려사항
- 개발 정보시스템의 특성
- 사용자의 요구사항
- 컴파일러의 가용성
소프트웨어 설계
- 개념:
- 소프트웨어를 구성하는 뼈대를 정의하는 것
- 구분: 상위 설계(구조 설계), 하위 설계(기능 설계)
상위 설계 (High-Level Design)
- 개념: 전체 골조(뼈대)를 세우는 단계
- 아키텍처 설계: 시스템의 전체적인 구조
- 데이터 설계: 필요한 정보를 자료구조/데이터베이스 설계에 반영
- 시스템 분할: 여러 개의 서브 시스템으로 분리
- 인터페이스 설계: 시스템의 구조와 서브 시스템들 사이의 관계
- 사용자 인터페이스 설계: 사용자와 시스템의 관계
하위 설계 (Low-Level Design)
- 개념: 시스템의 내부 구조, 동적 행위 등을 결정해 제어와 데이터 간의 연결에 대해 구체적인 정의를 하는 단계
- 설계 방법: 절차기반(Procedure-Oriented), 자료위주(Data Oriented), 객체지향(Object-Oriented)
구분 | 상위설계 | 하위설계 |
---|---|---|
정의 | 기본 적인 모듈 구성 | 모듈 내부의 동작 및 세부적인 구현 방법 정의 |
관련 내용 | 기능적, 비기능적 요구사항 고려 | 알고리즘, 데이터 구조, 변수 등 |
결과물 | 아키텍처 다이어그램 | 클래스 다이어그램, 시퀀스 다이어그램 |
추상화 | 높은 수준의 추상화 | 낮은 수준의 추상화 |
구현 | 구현 단계에서 구체화 필요 없음 | 구현 단계에서 구체화 |
소프트웨어의 설계 대상과 방법
설계 대상
- 구조 모델링
- 소프트웨어를 구성하는 컴포넌트의 유형, 인터페이스, 내부 설계 구조 등 상호 연결 구조를 모델링
- 구성요소 : 프로시저, 데이터 구조, 모듈, 파일 구조
- 시스템 구조: 구성 요소들의 연결구조, 포함 관계
- 행위 모델링
- 구성요소들이 언제, 어떤 순서로 기능을 수행하고 상호작용하는지를 모델링 하는 것
- 입출력 데이터, 데이터의 흐름과 변환, 데이터의 저장, 실행 경로, 상태 전이, 이벤트 발생 순서 등
설계 방법
- 구조적 설계
- 자료 중심 설계
- 객체 지향 설계
소프트웨어 구조도 Structure Chart
- 개념
- 구조적 설계 방법 중의 하나로 시스템의 구조를 표현하는 방법
- 그래픽 다이어그램으로 각 모듈은 상자, 모듈 간의 관계는 선으로 연결됨
- 특징
- 각 모듈 간의 의존성을 최소화해
- 유지 보수성을 향상 시키고
- 시스템의 복잡도를 낮춤
- 대규모 소프트웨어 시스템의 설계와 개발에 효과적
용어 | 설명 |
---|---|
Fan-in | 주어진 한 모듈을 제어하는 상위 모듈수(”영향을 받는”) |
Fan-out | 주어진 한 모듈의 제어하는 하위 모듈 수(”영향을 주는”) |
예) 모듈 F 에서의 Fan-in: 3, Fan-out: 2
- Fan-in, Fan-out을 분석하면 시스템 복잡도 파악이 가능하다
- 복잡도 최적화를 위한 조건: Fan-in은 높이고 Fan-out은 낮추도록 설계
구조적 분석 도구
*구조적 시스템 방법론에서의 분석문서: DFD, 소단위 명세서, DD
자료 흐름도 (DFD: Data Flow Diagram)
- 개념
- 시스템 내의 노든 자료 흐름을 4가지 기본 기호(처리, 자료흐름, 자료 저장소, 단말) 로 기술
- 총체적인 데이터 흐름 표시
- 다차원적이고 자료 흐름 그래프 또는 버블 차트라고도 함
- 정의하는 방식이 명확해야 함
- 하향식 분할 원칙
💡 시간 흐름을 명확하게 표현할 수 있는 것은 DFD가 아닌 시퀀스 다이어그램
- 작성 원칙
- 자료 보존의 원칙 : 출력 자료 흐름은 반드시 입력 자료 흐름을 이용해 생성
- 최소 자료 입력의원칙
- 독립성의 원칙 : 프로세스는 오직 자신의 입력 자료와 출력 자료 자체에 대해서만 앎
- 지속성의 원칙
- 순차 처리의 원칙
- 영구성의 원칙
DFD 구성요소 | 의미 | 표기법 |
---|---|---|
Process | 자료를 변환시키는 시스템의 한 부분 | |
Data Flow | 자료의 흐름 | |
Data Store | 자료저장소(파일, 데이터베이스) | |
Terminator(단말) | 자료의 발생지, 종착지 시스템의 외부에 존재하는 사람이나 조직체 |
소단위 명세서 (Mini-Specification)
- 개념:
- 세분화된 DFD에서 최하위 단계 버블(프로세스)의 처리 절차를 기술한 것
- 분석가의 문서이며 DFD를 지원하기 위해 작성
- 사용되는 도구
- 구조적 언어, 선후 조건문,
- 의사 결정표: 복잡한 의사결정 논리 기술할 때, 자료 처리 분야에서 사용
- 의사 결정 나무: 불확실한 상황에서 의사결정할 때
자료 사전 (DD: Data Dictionary)
- 정의:
- 명세와 자료 속성을 파악할 수 있도록 조직화한 도구
- 표기법
- 역할: DFD의 모든 자료의 정의를 기술한 문서
- 기술해야 할 자료
- 자료 흐름을 구성하는 자료 항목, 자료 저장소를 구성하는 자료 항목, 의미, 단위 및 값
- 작성 시 고려 사항
- 자료의 의미 기술
- 자료 구성 항목의 기술
- 동의어(Alias): 동의어가 많아 혼동이 생길 수 있음, 동의어 간 서로 참조가 되는 관계 명시
- 자료 정의의 중복 제거
기호 | 의미 | 설명 |
---|---|---|
= | 자료의 정의 | ~로 구성(is compose of) |
+ | 자료의 연결 | 그리고(and, along with) |
( ) | 자료의 생략 | 생략할 수 있는 자료 |
[ ] | 자료의 선택 | 다중 택일(selection) 또는(or), 항목간 구분은 1 |
{ } | 자료의 반복 | $\{\}_n$ : 최소 $n$번 이상 반복 $\{\}^n$ : 최대 $n$번 이하 반복 $\{\}_m^n$ : $m$번 이상 $n$번 이하 반복 |
** | 자료의 설명 | 주석(comment) |
모듈과 결합도 응집도
모듈
- 개념: 전체 프로그램에서 어떠한 기능을 수행할 수 있는 실행 코드
- 특징
- 재사용 가능
- 자체적 컴파일 가능
- 노동력 절감
- 독립성은 결합도와 응집도에 의해 측정
- 기억장치를 유용하게 사용 가능
- 다른 모듈과의 과도한 상호 작용 회피
- 모듈화를 통해 얻을 수 있는 것
- 유지보수 용이성, 재사용성, 테스트 용이성, 확장성, 독립성
- 목적: 모듈 간 결합도의 최소화, 모듈 내 요소 간의 응집도 최대
결합도(Coupling)
- 개념: 소로 다른 두 모듈 간의 상호 의존도로 두 모듈 간의 기능적인 연관 정도를 나타냄
- 특징:
- 결합도를 약하게 하면 모듈 독립성 향상
- 자료 결합도가 설계 품질이 가장 좋음
정도 | 종류 | 설명 |
---|---|---|
약함 $\uparrow$ | 자료 결합도 (Data Coupling) | 모듈 간의 인터페이스가 자료요소로만 구성, 모듈 간의 내용을 알 필요 없음 |
스탬프 결합도 (Stamp Coupling) | ||
제어 결합도 (Control Coupling) | ||
외부 결합도 (External Coupling) | ||
공통 결합도 (Common Coupling) | ||
$\darr$ 강함 | 내용 결합도 (Content Coupling) | 한 모듈이 다른 모듈의 내부 기능 및 그 내부 자료를 조회하도록 설계 됨 |
응집도(Cohesion)
- 개념
- 모듈 안의 요소들이 서로 관련된 정도
- 모듈 간 최소한의 상호작용을 하여 하나의 기능 만을 수행하는 정도를 표현
- 특징
- “응집도가 높다” → 필요한 요소들로 구성됨
- “응집도가 낮다” → 요소 간의 관련성이 적음
정도 | 종류 | 설명 |
---|---|---|
강함 $\uarr$ | 기능적 응집도 (Functional Cohesion) | 모듈 내부의 모든 기능 요소가 한 문제와 연관 |
순차적 응집도 (Sequential Cohesion) | ||
교환적 응집도 (Communicational Cohesion) | ||
절차적 응집도 (Procedural Cohesion) | ||
시간적 응집도 (Temporal Cohesion) | ||
논리적 응집도 (Logical Cohesion) | ||
$\darr$ 약함 | 우연적 응집도 (Coincidental Cohesion) | 모듈 내부의 각 기능 요소가 서로 관련이 없는 요소로만 구성 |
모듈 설계 방법
- 효과적인 모듈화 설계 방법
- 출입구를 하나씩 갖게 해 복잡도, 중복성을 줄이고 일관성 유지
- 전반적인 기능과 구조를 이해하기 쉬운 크기로 설계
- 모듈 간 효과적인 제어를 위해 계층적 자료 조직이 제시되어야 함
- 모듈 설계 특징
- “모듈 독립성이 높다” → 단위 모듈을 변경해도 타 모듈에 영향이 적음을 의미
⇒ 오류 발견과 해결 쉬워짐
- “모듈 독립성이 높다” → 단위 모듈을 변경해도 타 모듈에 영향이 적음을 의미
모듈과 컴포넌트
모듈 vs 컴포넌트
- 모듈
- 자신 만으로 동작할 수 있는 명령의 집합
- 실질적으로 구현이 된 단위
- 바로 재사용 X
- 컴포넌트
- 독립적인 기능을 수행하는 모듈로 교체가 가능한 부품
- 실제로 동작하고 있는 엔티티
- 인터페이스를 통해 연결됨
구분 | 모듈 | 컴포넌트 |
---|---|---|
목적 | 소프트웨어 복잡도 해소 | 소프트웨어 재사용성 향상 |
재사용 단위 | 소스코드 | 실행 코드 |
독립성 | 구현 언어 종속적, 플랫폼에 종속적 | 구현 언어 종속적, 동일 플랫폼 기반 개별적 연계 |
응용 | 단일 애플리케이션 | 분산 애플리케이션 |
중심 사상 | 모듈화, 추상화 | 객체지향, CBD(Component Base Development) |
모듈 분할
- 특징: 유지보수 쉬움, 재사용 쉬움
- 모듈 분할 시 영향을 주는 설계 형태
- 추상화(Abstraction)
- 모듈화(Modularity)
- 정보은닉(Information Hiding)
- 복잡도(Complexity
- 시스템 구조(System Structure)
재사용과 공통 모듈
재사용
- 재사용 규모에 따른 구분
- 함수의 객체
- 애플리케이션
- 컴포넌트
공통 모듈
- 개념
- 재사용의 기본단위
- 각 서브 시스템에서 공통으로 사용하는 기능을 묶어 하나의 공통된 모듈로 개발
- 특징
- 모듈 재사용성을 높이고 중복 개발로 인한 낭비 없앰
- 정합성 유지 및 중복 개발 방지
- 명세 기법: 정확성, 명확성, 완전성, 일관성, 추적성
- 공통 모듈 테스트 종류
- 화이트박스 테스트(소스코드), 메소드 기반 테스트, 화면 기반 테스트
모듈 명세화 도구
- 명세화 도구의 종류
- Flowchart, N-S 도표, Pseudo Code, Decision Table, Decision Diagram, PDL, State Transition Diagram, Action Diagram
N-S 도표(Nassi-Schneiderman Chart)
- 구조적 프로그램의 순차, 선택, 반복의 구조를 사각형을 도식화해 알고리즘의 논리적 기술에 중점을 둔 도형식 표현 방법
- 박스 다이어그램을 사용해 논리적인 제어 구조로 흐름을 표현
- 임의의 제어 이동 어려움
- 이해하기 쉽고 코드 변환 용이
- 제어 구조: 순차, 선택 및 다중 선택, 반복
의사코드(Psedo Code)
- 개념
- 프로그래밍 언어로 작성한 코드가 아닌, 사람이 이해하기 쉽도록 약속된 형식으로 작성한 코드
- 특징
- 알고리즘을 구체적으로 나타내기 위해 사용
- 일반적으로 프로그래밍 언어와 비슷함
- 컴파일 되지 않음
- 의사 결정표(Decision Table)
- 모듈의 동작을 결정하는 조건과 결과를 표로 나타낸 문서
- 모듈의 동작을 명확하게 설명
- 모듈의 오류를 찾는 데 도움이 됨
- 명세화 방법: 동작을 분석, 모듈이 어떤 입력을 받고 어떤 출력을 생성하는지 파악
소프트웨어 아키텍처(Software Architecture)
소프트웨어 아키텍처
- 개념
- 요구사항을 기반으로 소프트웨어의 기본 틀을 만드는 것
- 다수의 이해 관계자가 참여하는 복잡한 개발에서 상호 이해, 타협, 의사소통을 체계적으로 접근하기 위한것
- 역할: 설계 및 구현을 위한 구조적/비 구조적인 특(Frame)을 제공
- Structure Frame : 컴포넌트의 구조모델
- Non Structure Frame : 구조모델 이외 다른 아키텍처 설계의 결정들
- 소프트웨어 아키텍처의 시스템 품질 속성
- 가용성, 변경 용이성, 성능, 보안성, 사용편의성, 시험 용이성
- 소프트웨어 아키텍처 특징
- 간략성, 추상화, 가시성
- 복잡도 관리 종류: 과정 추상화, 데이터 추상화, 제어 추상화
- 평가 기준
- 어떤 모듈로 구성?
- 시스템은 어떻게 행동하고 연결?
- 비 소프트웨어 구조와 어떻게 관계하고 있는 가?
아키텍처 프레임워크 구성 요소
- 아키텍처 프레임워크
- 복잡한 소프트웨어 문제를 해결하거나 서술하는 데 필요한 기본 구조를 제공함으로써 재사용이 가능하게 함
- 구성요소
- AD (Architecture Description) : 기록하기 위한 산출물
- 이해관계자 (Stakeholder)
- 관심사(Concerns)
- 관점(Viewpoint)
- View : 4+1 View
소프트웨어 아키텍처 설계
- 설계 원리: 단순성, 효율성, 분할(계층화), 추상화, 모듈화
- 설계 과정
- 설계 목표 설정 → 시스템 타입 결정 → 스타일 적용 및 커스터마이즈
→ 서브 시스템의 기능, 인터페이스 동작 작성 → 아키텍처 설계 검토
- 설계 목표 설정 → 시스템 타입 결정 → 스타일 적용 및 커스터마이즈
소프트웨어 아키텍처 평가 방법론
- 평가 방법론 유형
- Scenario Based : 미리 정의된 Profile에 의존해 평가, ATAM, SAAM
- Simulation Based : BMT(BenchMarking Test)
- Experience Based
- Mathematical Model Based : 수학적 기반 모델
- 평가 방법론의 종류 ⭐
- SAAM, ATAM, CBAM, ARID, ADR
소프트웨어 아키텍처 4+1 View Model
- 개념:
- 다양하고 동시적인 View를 기반으로 소프트웨어 위주 시스템의 아키텍처를 묘사하는 View 모델
- 다양한 측면을 고려하기 위해 다양한 관점을 바탕을 바탕으로 정의한 모델
- 5계층 분류
구성 | 설명 |
---|---|
Usecase View | 설계하는 작업 |
Logical View | 기능적인 요구사항이 어떻게 작동되는지 |
Process View | 비기능적인 속성(비동기, 이벤트 처리 등) |
Implementation View | 정적인 모듈의 구성, 구조와 의존성을 보여줌 |
Deployment View(배포뷰) | 배치 연결작업이 어떻게 실행되는지 매핑해서 보여줌 |
소프트웨어 아키텍처 패턴
아키텍처(Architecture) 패턴
- 개념:
- 소프트웨어 아키텍처를 설계하는 데 발생하는 문제점을 해결하기 위한 재사용 가능한 솔루션
- 디자인 패턴과 유사하나 더 큰 범위
- 종류 : Layered, Client-Server, Mater-Slave, Pipe-Filter, Broker, Peer to Peer, Event-Bus, MVC, Blackboard, Interpreter
- 장점: 개발 시간 단축, 고품질 소프트웨어, 간편한 의사소통, 유지보수에 유리
계층(Layered) 구조 패턴
- 소프트웨어를 계층단위(Unit)으로 나누며, N-tier 아키텍처 패턴이라고도 함
- 3계층
- Presentation Layer, Application Layer, Data Layer
- 4계층
- Presentation Layer, Persistence Layer, Business Layer, Data Layer
MVC(Model View Controller) 패턴
- Model, View, Controller로 구성되고 UI와 비즈니스 로직을 분리해 유지보수성과 재사용성을 향상
MVC 패턴의 구성 | 설명 |
---|---|
Model | 데이터와 비즈니스 로직 관리, 사용자가 편집하기 원하는 모든 데이터를 가지고 있어야 함 |
View | 레이아웃과 화면을 처리, 모델이 가지고 있는 정보를 따로 저장하면 안 됨 |
Controller | 명령을 Model, View 부분으로 라우팅, 모델이나 뷰에 대해서 알고 있어야 함 |
클라이언트 서버(Client Server) 패턴
- 하나의 서버와 다수 클라이언트로 구성
- 클라이언트가 서버에 서비스를 요청
- 서버는 응답을 위해 항상 대기 중
파이프 필터(Pipe-Filters) 패턴 ⭐
- 데이터 흐름(Data Stream)을 생성하고 처리하는 시스템을 위한 구조
- 필터:
- 파이프를 통해 받은 데이터 변경, 결과 파이프로 전송,어휘 분석, 파싱, 의미 분석, 코드 생성 수행
- 필터 컴포넌트 : 처리 과정
- 파이프:
- 처리되는 데이터 흐름, 버퍼링 또는 동기화 목적으로 사용
- 장점: 필터 교환과 재조합을 통한 높은 유연성, 확장성, 사용성
- 단점: 비용 소요, 데이터 변환에 과부화, 성능 저하, 복잡성, 의존성
- 활용: 컴파일러, 구문 분석, 의미 분석, 코드 생성
Peer to Peer 패턴
- 클라이언트-서버 + 대칭적 특징
- Peer가 하나의 컴포넌트로 대응됨
- 컴포넌트는 클라이언트, 서버 역할 모두 수행
- 분산 컴퓨팅 애플리케이션 구축 시 유연성 제공
브로커(Broker) 패턴
- 컴포넌트가 컴퓨터와 사용자를 역할
- 분산 시스템에 주로 사용
- 중앙 집중식 서버(Broker)가 존재해 Broker가 메시지 전달
블랙보드(Blackboard) 패턴
- 문제를 풀어가는 하나의 방식을 정의
이벤트 버스(Event-Bus) 패턴
- 소스 이벤트가 메시지를 발행하면 해당 채널 구독자가 메시지 수신 후 이벤트를 처리하는 방식
인터프리터(Interpreter) 패턴
- 특정 언어로 작성된 프로그램을 해석하는 컴포넌트를 설계할 때 사용
코드 설계
*프로그래밍 코드가 아닌 자료를 분류하기 위한 코드
- 개념
- 데이터의 사용 목적에 따라서 식별하고 분류 하기 위하여 사용하는 숫자, 문자, 또는 기호
- 그룹으로 분류, 순번으로 나열해 체계화함
- 설계 순서
- 코드 대상 선정 → 코드화 목적 명확화 → 코드 부여 대상 수 확인 → 사용 범위 결정 → 사용 시간 결정
→ 코드화 대상의 특정 분석 → 코드 부여 방식 결정 → 코드의 문서화 - 코드와 항복 선정 → 사용 범위와 사용 기간 결정 → 코드화 항목의 특성 분석 → 코드 설계와 체크
→ 코드의 번역, 코드표 작성 → 코드 파일의 작성 → 코드 파일과 코드표 관리
- 코드 대상 선정 → 코드화 목적 명확화 → 코드 부여 대상 수 확인 → 사용 범위 결정 → 사용 시간 결정
- 설계 시 고려사항 : 기계처리의 적합성, 편리성, 코드의 공통성, 체계성, 유연성
- 특성
- 고유성, 분류 편리성, 배열의 효율성, 간결성, 유지보수 편리성,
- 코드의 독립성, 코드의 편의성, 추가 및 삭제 편리성
코드의 기본적 기능 | 코드의 3대 기능 | 코드의 부가적 기능 |
---|---|---|
표준화 기능 | 분류 기능 | 연상 기능 |
간소화 기능 | 식별 기능 | 암호화 기능 |
배열 기능 | 오류 검출 기능 |
코드의 분류
순차 코드(Sequence Code)
어떤 일정한 배열로 일련번호를 배당
- 항목 수가 적고, 변경이 적은 자료에 적합
- 일정 순서대로 코드 할당
블록 코드(Block Code, 구분 코드)
미리 공통의 특성에 따라서 임의의 크기를 블록으로 구분해 각 블록 안에서 일련 번호를 배정
- 기계처리가 어려움
그룹 분류식 코드(Group Classification Code)
기준에 따라 대분류, 중분류, 소분류로 구분하고 순서대로 번호를 부여
10진 분류 코드(Decimal Code, DDC)
주로 도서 분류 코드에 사용
- 예) 100 : 국문학, 200 : 철학
표의 숫자 코드(Significant Digit Code, 유효숫자 코드) ⭐
길이, 넓이, 부피, 무게 등을 나타내는 문자나 숫자, 기호를 그대로 사용
- 추가 및 삭제가 쉬움
- 같은 코드를 반복 사용해 오류 적음
- 예) 127-890-1245 : 두께-127mm, 폭-890mm, 길이-1245mm의 강판
연상 코드(Mnemonic Code, 기호 코드)
품목 명칭 일부를 코드 속에 넣음
- 예) TV-39-C : TV 39인치 컬러
코드의 오류 종류
구분 | 의미 | 예 |
---|---|---|
필사 오류(Transcription Error) | 한 자리 잘못 기록 | 1234 → 1237 |
전위 오류(Transposition Error) | 좌우 자리 바꿈 | 1234 → 2134 |
이중 오류(Double Transposition Error) | 전위 오류가 두 개 이상 발생 | 1234 → 2143 |
생략 오류(Missing Error) | 한 자리 빼고 기록 | 1234 → 123 |
추가 오류(Addition Error) | 한 자리 추가해 기록 | 1234 → 12345 |
임의 오류(Random Error) | 두 가지 이상의 오류가 결합 | 1234 → 21345 |
'자격증 > 정보처리기사' 카테고리의 다른 글
[소프트웨어설계] 6. 시스템 인터페이스 설계 (0) | 2024.01.21 |
---|---|
[소프트웨어설계] 5. 객체지향 설계와 디자인 패턴 (0) | 2024.01.19 |
[소프트웨어설계] 3. UI설계 (1) | 2024.01.17 |
[소프트웨어설계] 2. 현행 시스템 분석과 요구 분석 (0) | 2024.01.16 |
[소프트웨어설계] 1. 소프트웨어공학과 개발 방법론 (0) | 2024.01.16 |