UNIV

2022-05-28 07:33

소프트웨어공학 - 7강. 소프트웨어 설계

설계

  • 물건을 만들기 위한 계획 또는 제작을 위해 물건을 의미있게 표현

설계 프로세스

  • 설계 작업의 입력
    • 요구사항과 분석 모델
    • 환경적 제약 사항
  • 설계 작업의 결과물
  • 반복 수행하면서 점점 정형화

설계 프로세스

  • 요구사항 명세
  • 데이터베이스 설계
  • 서브 시스템 설계
  • 컴포넌트 설계
  • 자료구조 / 알고리즘 설계

설계 원리

  • 분할 후 정복
    • 문제를 작은 것들로 나누고 각각을 독립적으로 정복
    • 수평 분할
    • 수직 분할
  • 추상화
    • 내부의 상세한 내용을 생략
    • 외부 행위만을 기술하는 것
    • 추상화의 적용
      • 시스템 설계에서 구성 모듈들을 추상화하여 표현
    • 기능 추상화
    • 데이터 추상화
  • 하향식과 상향식 설계
    • 하향식 설계
      • 낮은 수준의 컴포넌트들로 분해하는 것
      • 단계적 정제
    • 상향식 설계
      • 가장 기본적인 컴포넌트 설계
      • 상위 수준의 컴포넌트 설계
    • 고려사항
      • 새로 개발하는 작업에는 하향시이 적합
      • 기존 컴포넌트 조합하여 개발하는 경우에는 상향식이 적합

아키텍쳐 설계와 중요성

  • 아키텍쳐 설계
    • 시스템 품질 특성과 제약사항을 반영해야 함
    • 아키텍쳐의 중요성
      • 개발이 진행된 후에는 시스템 구조 수정하기 어려움
  • 아키텍쳐 스타일
    • 유사한 애플리케이션들에서 사용되는 공통적인 아키텍쳐 패턴
    • 아키텍쳐 설계의 초안이 됨
  • 데이터 중심 아키텍쳐
    • 저장소 모델
  • 데이터 흐름 아키텍쳐
    • 파이프 필터 구조
    • 데이터 요소들에 대한 개별 변환 작업들을 연결하여 시스템을 구성
  • 클라이언트 - 서버 아키텍쳐
    • 분산 시스템의 아키텍쳐
    • 서버와 클라이언트는 네트워크로 연결됨
    • 데이터 처리가 분산됨
    • 새로운 서버 추가하기 쉬움
    • 모든 서버가 각각 데이터 관리 책임을 가짐
    • 공유 데이터 모델이 없으므로 데이터 교환이 비효율적
  • 계층형 아키텍쳐
    • 추상 기계 모델
    • 시스템을 계층별로 구성
    • 하위 계층이 제공하는 서비스를 상위 계층이 이용
    • OSI 7 계층
    • 각 계층은 특정 서비스를 제공
    • 서브 시스템 간의 점증적 개발이 가능
  • MVC 아키텍쳐
    • 모델 (M), 뷰 (V), 컨트롤러 (C)로 분리

아키텍쳐와 비기능적 속성

  • 소프트웨어 아키텍쳐는 비기능적 요구사항에 영향을 줌
  • 비기능적 속성을 고려하여 설계해야 함
    • 성능: 서브시스템들 간의 통신을 최소화
    • 보안: 계층형 아키텍쳐를 사용하고 보안이 중요한 시스템을 내부 계층에 위치시킴
    • 안전성: 안전성이 요구되는 요소들을 하나의 서브시스템에 집중시킴
    • 가용성: 동일 기능의 컴포넌트를 중복시킴
    • 유지보수성: 자료의 공유를 피하고 모듈화 시켜야 함

구조적 설계

  • 구조적 분석(SA)의 결과물을 이용해 아키텍쳐를 설계하고 모듈을 개발하는 방법
  • 구조도
    • 모듈들의 계층 구조, 모듈의 매개변수, 모듈들 간의 상호 연결 관계를 보여줌
    • 모듈들은 블랙박스로 표현되며 계층적으로 배열됨
  • 변환 분석에 의한 구조적 설계
    • 데이터 흐름의 유형이 변환 흐름인 경우 사용
    • 변환 흐름은 데이터를 입력받고, 변환 가공하고 결과를 출력하는 유형
    • 변환 분석
      • 데이터흐름도에서 입력 흐름과 출력 흐름의 경계를 표시
      • 구조도에 입력, 변환, 출력 모듈을 제어하는 모듈을 추가로 만듦

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

  • 트랜잭션 흐름은 한 프로세스에서 입력을 여러 경로의 데이터 흐름으로 유출하는 유형
  • 트랜잭션 분석
  • 상세 설계
  • 모듈화
    • 구성 요소들이 기능적으로 독립적이어서 이해하기 쉬움
    • 테스트 디버깅 유지보수 작업이 쉬움
    • 재사용하기 용이함
  • 모듈의 독립성
    • 다른 모듈과의 결합도가 느슨해야 함
    • 하나의 모듈은 높은 응집력을 가져야 함
  • 결합도
    • 두 모듈 사이의 상호 의존성 정도를 의미
    • 두 모듈을 연결하는 인터페이스의 복잡도에 좌우됨
  • 결합도의 수준
    • 데이터 결합
    • 스탬프 결합
    • 제어 결합
    • 공통 결합
    • 내용 결합
  • 응집력
    • 하나의 모듈이 가지는 기능적 집중성에 관한 척도
      • 모듈을 구성하는 요소들이 기능적으로 얼마나 관련성이 있는가
    • 응집력의 수준
      • 기능적 응집력
      • 순차적 응집력
      • 통신 응집력
      • 절차적 응집력
      • 시간적 응집력
      • 논리적 응집력
      • 우연적 응집력

SOLID 원칙

  • 단일 책임 원칙
    • 모든 클래스는 하나의 책임만 가져야 한다
      • 유일한 이유로만 변경 될 수 있다
  • 개방 폐쇄의 원칙
    • 클래스가 확장에는 열려 있고, 수정에는 닫혀 있어야 한다
    • 새로운 기능을 추가하면서도 기존 코드를 수정하지 않아도 된다
  • 리스코프 교체의 원칙 (LSP)
    • 프로그램에 존재하는 부모 유형(T)의 객체를 자식 유형(S)의 객체로 교체할 수 있어야 함
    • T와 S간 상속관계가 적절해야 한다는 의미
    • LSP가 만족되면 새로운 자식 클래스를 추가할 때 기존 코드의 수정이 필요 없음
    • 자식 클래스에서 부모 클래스의 메소드를 재정의 하지 않으면 LSP의 문제가 없음
  • 인터페이스 분리의 원칙 (ISP)
    • 하나의 큰 범용 인터페이스가 아닌 작고 특화된 여러 인터페이스로 나누어 설계 할 것
    • ISP를 만족하지 못한다면 사용하지 않는 인터페이스가 바뀔 때도 클라이언트에게 소프트웨어를 재배포 해야 함
    • 복합기 인터페이스 대신에 프린팅, 복사, 스캔 인터페이스로 나눌 것
  • 의존 관계 역전의 원칙 (DIP)
    • 구체적 저수준 사물(구체 클래스)이 아닌 추상적 고수준 개념(인터페이스)에 의존해야 함
    • 실제 작업을 수행하는 저수준 구체 클래스는 변경되기 쉬움