소프트웨어 설계란 무엇인가

지금까지 UML, 다이어그램 등 계획 단계에서 요구사항(무엇what 관점)을 분석하는 개념적인 부분을 공부했다면 이제 설계 단계부터는 구체적인 것(어떻게 how 관점)을 공부한다.

 

소프트웨어를 어떻게 만들것인가에 대한 고민들의 예시로 운영체제는 Windows를 쓸까 Linux를 쓸까, framework는 무엇을 쓰지 등등.. 이런 관점으로 설계를 바라본다.

 

이런 고민들은 그냥 무작정 하는 것이 아니라, 계획 단계에서 작성한 요구 분석 명세서를 기반으로 어떻게 구축할 것인가를 결정한다. 물론 이런 설계를 평가할 수 있는 기준도 정량적으로 명시해야 한다.

 

 

 

 

소프트웨어 설계란

설계는 시스템의 기능적 요구를 구현하기 위한 방법이나 비기능적 요구에 의하여 받는 제약을 준수하는 방법, 좋은 품질의 일반적인 원칙을 고수하는 방법 등을 찾기 위한 문제 해결 과정이다.

 

문제를 해결해나가는 과정인 만큼 전체 설계 문제에 여러 가지 크고 작은 문제들도 포함되는데, 각각의 이슈에는 여러 가지 선택적인 해결책이 있다. 이것을 설계 옵션이라 한다.

 

 

그치만 아무리 이런 이론적인 것들을 알고 있다고 해서 항상 좋은 설계가 되는 것은 아니다.
우리가 좋은 설계를 하기 위해서는 일단 기본적으로 요구 분석 명세서의 내용을 설계서에 모두 포함해야 한다. 또한 시스템 변경으로 인한 영향이 최소화되도록 하고, 유지보수가 용이하도록 추적이 가능해야 함을 명심하자.

 

 

방금 좋은 설계의 조건에 시스템의 변경이라고 말했는데, 여기서 시스템이란 것이 뭘까?

우선 시스템의 구조를 이루는 것들 부터 차근차근 알아보자.

 

 

 

 

시스템의 구조

 

1. 컴포넌트 

분명한 역할을 가지고 있는 하드웨어 또는 소프트웨어 조각이다.
독립적으로 존재할 수 있으며 같은 기능을 가진 다른 컴포넌트로 대체될 수 있다.

대부분의 컴포넌트는 재사용 가능하도록 설계됐다.

 

 

 

2. 모듈

컴포넌트의 하위 수준 단위인 모듈은 소프트웨어 구조를 이루는 기본적인 단위이다.

하나 또는 몇 개의 논리적인 기능을 수행하기 위한 명령어들의 집합으로 말할 수 있고, 그 예시로 라이브러리 함수나 그래픽 함수, 추상화된 자료 등이 있다.

 

이러한 모듈의 특징은 유일한 이름을 가지며 다른 것들과 구별될 수 있는 독립적인 기능을 갖는 단위로 통한다.
독립적인 기능을 갖고 있으니 독립적으로 컴파일이 가능하며 모듈에서 또 다른 모듈을 호출하거나 다른 프로그램에서도 모듈을 호출할 수 있다.

 

 

 

3. 시스템

정의 가능한 책임과 목적들을 가지고 있고 소프트웨어나 하드웨어로 구성된 논리적 개체를 말한다.

시스템은 명세를 가지며 컴포넌트의 집합으로 구현될 수 있다.
시스템은 컴포넌트가 변하거나 다른 컴포넌트로 대치되더라도 지속적으로 존재하고, 계획 단계에서 했던 요구분석의 목적이 시스템의 역할을 결정하는 것이다.

 

 

 

 

 

설계를 위한 접근 방법 - 상향식, 하향식

설계를 하기 위해 접근하는 방법은 두 가지가 있다.

 

첫 번째로, 시스템의 최상위 부분을 먼저 설계한 후에 하위 수준의 자세한 결정을 내리는 방식의 하향식 설계 방법이 있다.

 

다른 하나는, 재사용 가능한 하위 수준의 유틸리티들에 대한 결정을 하며, 높은 수준의 구조를 만들기 위해 이것들을 어떻게 함께 배치해야 할지를 결정하는 상향식 설계가 있다.

 

간단하게 요약하자면 최상위 부분을 설계하고 점점 세밀하게 하는 방식은 하향식 설계 방법,
재사용 가능한 하위 수준의 유틸리티를 결정한 후에 규모를 높여가는 방식은 상향식 설계 방법이다.

 

상위 설계(예비 설계)의 각 단계에 대한 추가 설명이다.

  • 아키텍처(구조) 설계 : 시스템의 전체적인 구조
  • 데이터 설계 : 시스템에 필요한 정보를 자료구조와 데이터베이스 설계에 반영
  • 시스템 분할 : 전체 시스템을 여러 개의 서브시스템으로 나눈다.
  • 인터페이스 정의 : 시스템의 구조와 서브시스템들 사이의 인터페이스가 명확히 정의
  • UI 설계 : 사용자가 익숙하고 편리하게 사용할 수 있도록 사용자 인터페이스설계

 

하위 설계는 각 모듈의 실제적인 내부를 알고리즘(pseudo-code) 형태로 표현하고 인터페이스에 대한 설명, 자료구조, 변수 등에 대한 상세한 정보를 작성한다.