Search
🏫

[소프트웨어 공학] 7. 소프트웨어 설계

Tags
CS
Software Engineering
Last edited time
2023/06/17 07:06
2 more properties
Search
[소프트웨어 공학] 12. 상호작용 다이어그램
CS
Software Engineering
2023/06/11 15:16
[소프트웨어 공학] 12. 상호작용 다이어그램
CS
Software Engineering
2023/06/11 15:16

1. 설계 개요

소프트웨어 설계
명세에 구현을 위한 방법을 명시

1.1. 설계 프로세스

반복적 프로세스
초기 버전을 만들고 지속적으로 수정하며 세세하게 기술

1.2. 설계 원리 - 문제의 분할

Divde and Conquer
분할 후 정복
수평 분할
기능들을 분리된 가지에 할당함
주요 기능을 분리하여 수평으로 잘라서 할당
입력 작업, 데이터 변환, 출력 작업
수직 분할
제어 모듈과 작업 모듈을 위 아래로 분산
상위 수준 모듈 - 제어 기능
하위 모듈 - 실제 작업 수행
작업 모듈이 변경되기 쉬우며 제어 무듈 변경이 되면 부작용이 큼

1.3. 설계 원리 - 추상화

추상화
블랙박스
정보 은닉
내부 상세 내용 생략하고 외부 행위만 기술
종류
기능 추상화
수행하는 기능으로 모듈 명세
전체를 작은 기능으로 분해 (기능 중심 분할)
데이터 추상화
데이터와 데이터 조작을 필요한 오퍼레이션을 함께 묶음
객체 상세 내용 감추며, 공개된 오퍼레이션을 통해만 조작 가능

1.4. 설계 원리 - 하향식 / 상향식 설계

하향식
주요 컴포넌트 → 낮은 수준 컴포넌트로 분해
단계적 정제
메인 모듈 부터 설계 시작
새로 개발에 적합
상향식 설계
기본 컴포넌트 머저 설계 이후 상위 수준 컴포넌트 설계
기존 컴포넌트 조합하여 개발할 때 적합

2. 아키텍처 설계

아키텍처
시스템의 구조를 정하는 것 (초기 설계)
개발이 진행된 후 시스템 구조 변경이 어려우므로 아키텍처가 중요함
아키텍처 스타일 (패턴)
유사한 애플리케이션에서 사용되는 공통적인 아키텍처 패턴
미리 만들어진 시스템 설계 모델

2.1. 데이터 중심 아키텍처

저장소 모델
서브 시스템 간 대규모 데이터 공유하는 소프트웨어 시스템
공유된 데이터베이스 기반한 아키텍처로 저장소를 통해 상호 작용
서브 시스템은 중앙 통합 관리되는 데이터베이스를 통해 상호 작용
장점
데이터 관리 효율적
데이터 생성 서브시스템과 사용 서브시스템 독립적
공유 데이터 모델 사용시 시스템 확장 용이
단점
서브시스템이 공통의 데이터 모델 사용해야함
중앙 저장소 성능 저하에 병목 현상발생
모든 서브 시스템에 동일한 정책적용
데이터 모델 변경시 큰 비용 발생
예시
학사 관리
ERP

2.2. 데이터 흐름 아키텍처

파이프 필터 구조
데이터 요소에 대한 개별 변환 작업들을 연결하여 시스템 구성
사용자 간섭 없이 데이터 스트림에 일련의 변환 작업을 적용하는 시스템에 적합
구성요소들 간의 복잡한 상호작용 요구시 적합 X

2.3. 클라이언트-서버 아키텍처

서버의 집합과 클라이언트들로 시스템 구성
분산 시스템의 아키텍처. 서버와 클라이언트는 네트워크로 연결
장점
데이터와 데이터 처리 분산
분산된 프로세스 효율적 사용 가능
새로운 서버 추가 쉬움
단점
공유 데이터 모델이 없음 → 데이터 교환 비효율적
모든 서버가 각각 데이터 관리 책임 가짐

2.4. 계층형 아키텍처

추상 기계 모델. 시스템을 계층별로 구성
하위 계층이 제공하는 서비스를 상위 계층이 이용
특징
각 계층은 특정 서비스를 제공하며 서브 시스템들의 점증적 개발 가능
특정 계층의 인터페애스가 변경되면 인접 계층만 영향을 줌
실제로 시스템을 계층 구조로 만들기 어려움

2.5. MVC 아키텍처

시스템 기능 분리
도메인 지식을 관리하는 모델
사용자에게 보여주는 뷰
사용자와 상호작용 제어하는 컨트롤러
고려 사항
저장소 모델의 특수한 형태
하나의 모델에 대해 여러 뷰를 제공해야하는 대화형 또는 웹기반 시스템에 적합

2.6. 3계층 아키텍처

클라이언트-서버 모델의 개선된 형태
사용자 인터페이스, 애플리케잉션 로직, 저장소의 3계층으로 분리
layered architecture

2.7. 아키텍처와 비기능적 속성

소프트웨어 아키텍처는 비기능적 요구사항에 큰 영향을 줌
성능 - 서브시스템 간 통신 최소화
보안 - 계층형 아키텍처 사용
안전성 - 안전성 요구 요소를 하나의 서브시스템에 집중
가용성 - 동일 기능 컴포넌트 중복
유지보수성
모든 것은 트레이드 오프 → 타협 필요

3. 구조적 설계

3.1. 구조적 설계

구조적 분석(SA)의 결과물 이용해 아키텍처 설계 및 모듈 개발
데이터 흐름도(DFD)를 통해 구조도(SC)를 만듬
결과물
구조도, 모듈 명세서, 자료사전

3.2. 구조도

모듈들의 계층 구조, 모듈의 매개 변수, 모듈들 간의 상호 연결 관계 보여줌
모듈들은 블랙박스로 표현
계층적으로 배열
상위 모듈이 하위 모듈 호출
구성 요소
모듈, 라이브러리 모듈
데이터 흐름, 제어 흐름
호출, 선택적 호출, 반복적 호출

3.3. 변환 분석에 의한 구조적 설계

데이터 흐름의 유형이 변환 흐름인 경우 사용
변환 흐름은 데이터를 입력 받고, 변환/가공하고 결과를 출력하는 유형
변환 분석
데이터 흐름도에서 입력흐름과 출력흐름의 경계 표시
구조도에 입력, 변환, 출력 모듈을 제어하는 모듈을 추가로 만듦

3.4. 트랜잭션 분석에 의한 구조적 설계

데이터 흐름의 유형이 트랜잭션 흐름인 경우 사용
트랜잭션 흐름은 한 프로세스에서 입력을 여러 경로의 데이터 흐름으로 유출하는 유형
트랜잭션 중심 모듈은 트랜잭션의 유형을 결정하고 적덩한 모듈을 호출하는 모듈
트랜잭션 분석
트랜잭션의 소스를 식별하고 트랜잭션 중심 모듈을 찾음
전체를 제어하는 모듈을 추가
데이터 수신 경로와 트랜잭션 중심에 해당하는 모듈을 하위에 위치시킴
처리 부분에 있는 프로세스를 모듈로 변환

4. 상세 설계와 모듈화

4.1. 상세 설계

개별 모듈에서 사용되는 자료 구조와 알고리즘을 자세히 설계
상세 설계는 기능적 요구사항에 초점

4.2. 모듈화

시스템을 여러 분릴된 컴포넌트들로 나누어 구성하는 것
모듈화된 시스템은 잘 정의되고 관리 가능한 단위들로 구성되며 각 단위들은 잘 정의된 인터페이스를 통해 소통
장점
구성 요소들이 기능적으로 독립적
구성요소들을 독립된 단위로 문서화 가능
재사용 용이
테스트와 디버깅, 유지보수 작업 쉬움

4.3. 모듈의 독립성

모듈의 독립서응로 시스템 설계 결과 평가 가능
모듈 독립성 평가
높은 응집력
느슨한 결합도
결합도
두 모듈간 상호 의존성 정도
응집도
모듈을 구성하는 요소들이 기능적으로 얼마나 관련성 있는가?
하난의 모듈이 가지는 기능적 집중성에 관한 척도

5. 객체지향 설계 원칙

5.1. 단일 책임 원칙 - SRP

모든 클래스는 하나의 책임만 가져야 한다.

5.2. 개방 폐쇄의 원칙 - OCP

클래스가 확장에 열려 있고, 수정에 닫혀 있어야 함
새로운 기능을 추가하면서도 기존 코드를 수정하지 않아도 됨
예시)
Rectangle → Shape (Rectagle / Circle)

5.3. 리스코프 교체(치환)의 원칙 - LSP

부모 유형의 객체는 자식 유형의 객체로 언제든 교체 가능해야 함
LSP가 만족되면 새로운 자식 클래스 추가할 때 기존 코드이 수정이 필요 없음

5.4. 인터페이스 분리의 원칙 - ISP

하나의 큰 범용 인터페이스가 아닌 작고 특화된 여러 인터페이스로 나누어 설계
ISP 만족 X → 사용하지 않는 인터페이스가 바뀔때도 클라이언트에게 소프트웨어 재배포 필요

5.4. 의존 관계 역전의 원칙 - DIP

구체적 저수준의 사물(구체 클래스)이 아닌 추상적 고수준의 개념(인터페이스)에 의존
실제 작업을 수행하는 저수준 구체 클래스는 변경되기 쉬움