소프트웨어 설계
요구사항 명세서를 토대로 소프트웨어의 뼈대를 이루는 구조를 정의해 구현의 기반을 만드는 것
요구사항 명세서는 What 관점, 설계는 How 관점
상위 설계 (=아키텍쳐 설계)
- 구성 모듈들의 관계로 표현되는 시스템 전체 구조
- 시스템 구조도, 외부 피일 및 DB 설계(ERD), 인터페이스 설계
하위 설계 (=모듈 설계)
- 모듈의 내부 구조, 동적 행위등을 결정
- 모듈 설계, 알고리즘 설계등 포함
좋은 설계: 모듈이 독립적이어야 하고, 모듈 간의 결합이 낮게 설계되어야함
프로세스 지항 설계: 처리 절차를 중심으로 설계 (기능, 데이터 분리)
객체 지향 설계: 객체 요소를 중심으로 설계 (기능, 데이터 객체 단위로 뭉쳐짐)
설계 원리
(1) 추상화
필요 정보만 추출하여 강조하고, 관련 없는 사항은 생략하여 본질적인 문제에 집중
상위 단계에서 설계를 고려하고 하위 단계로 구체화
과정 추상화: 입력이 출력으로 변환되는 과정을 추상화
데이터 추상화: 데이터 구조를 대표할 수 있는 표현으로 대체하는 것
제어 추상화: 제어 로직을 대표할 수 있는 표현으로 컴팩트하게 표현
(2) 단계적 분해
상위 개념부터 더 구체적 단계로 분할하는 하향식 기법의 원리
(3) 모듈화
모듈(=component)의 특성
- 독립적으로 컴파일 및 수행
- 다른 모듈 사용 가능
- 다른 프로그램에서 사용 가능
모듈 내의 응집력은 높게, 모듈 간의 결합력은 약하게하는 정도의 크기
- explicit invocation(function call): 모듈 간 결합력 높음
- Implicit invocation(메세지 던져 놓으면 해당하는 애가 수행): 모듈간 결합력 낮음, scailability 높음
효과적인 설계: 정보 은닉
효과적인 설계: 강한 모듈의 응집력
(= 모듈을 이루는 요소들이 서로 관련되어 있는 정도)
효과적인 설계: 약한 모듈의 결합도
설계 시 주의사항
- 넓게 퍼지고, 깊이는 낮을 수록 좋다
- 복잡한 모듈 간 연결 지양
- 과도한 깊이나 넓이를 가진 구조 지양
- 모듈의 영향권을 해당 모듈의 하위에 위치시킨다



변환 분석은 DFD를 입력 흐름 → 변환 센터 → 출력 흐름으로 분할
• 입력 흐름: 입력을 준비하는 단계(입력, 검증...)
• 출력 흐름: 출력을 준비하는 단계(포매팅, 출력)
• 변환 센터: 실제 자료가 변환
①~② 자료 흐름의 요소를 분해: 입력 자료 흐름, 출력 자료 흐름, 변환 센터
③ 변환 중심부를 축으로 최상위 구조 작성
④ 각 모듈의 하위 구조도 같은 방법으로 분석
⑤ 설계 기준을 적용하여 수정, 최적화




객체 = 속성(Attribute)과 행위(Behavior)를 가지고 있는 개체(Entity)

클래스 이름은 반드시 적어야한다
+가 붙으면 public, -가 붙으면 private
#가 붙으면 protected, ~가 붙으면 default,
readonly가 붙으면 final, 밑줄이 쳐지면 static


아키텍쳐 유형 => 개발 기간 단축하고 의사소통을 수월하게 할 수 있다
계층식 (Layered)
정의: 시스템을 계층화하여, 상위 계층이 하위 계층의 기능에 의존하는 구조이다.
인터페이스 계층 / 응용&도메인 계층 / 인프라스트럭쳐 계층
장점: 유지보수가 용이하며 확장성이 높다
클라이언트-서버 (Client-server)
정의: 클라이언트가 요청하고 서버가 응답하는 분산 구조이다.
장점: 자원을 중앙 집중화하여 관리 효율성과 보안성을 높일 수 있다.
마스터-슬레이브 (Master-slave)
정의: 마스터가 제어하고 슬레이브가 작업을 수행하는 구조이다.
장점: 병렬 처리와 작업 일관성 유지에 유리하다.
파이프-필터 (Pipe-filter)
정의: 데이터를 필터들이 파이프를 통해 순차적으로 처리하는 구조이다. 데이터 스트림 처리 시스템에서 자주 사용된다.
장점: 재사용성과 확장성이 뛰어나고 처리 흐름이 명확하다.
브로커 (Broker)
정의: 컴포넌트 간 통신을 중개자가 관리하는 구조이다. 서버의 대행자 역할을 하며 메인 서버의 부하를 분산할 수 있다
장점: 결합도가 낮아 유연한 확장과 유지보수가 가능하다.
피어 투 피어 (Peer to peer)
정의: 모든 노드가 동등하게 요청과 서비스를 수행하며, 중앙 서버 없이 서로 직접 연결되는 구조이다.
장점: 확장성과 신뢰성이 높고 중앙 장애점이 없다.
이벤트 기반 (Event driven)
정의: 이벤트를 기반으로 컴포넌트들이 비동기적으로 동작하는 구조이다.
장점: 반응성이 뛰어나고 비동기 처리가 효과적이다.
모델-뷰-컨트롤러 (MVC)
정의: 모델, 뷰, 컨트롤러로 역할을 분리한 아키텍쳐 유형이다
- 모델 (Model): 애플리케이션의 핵심 데이터 보관과 비즈니스 로직을 담당
- 뷰 (View): 사용자에게 보여지는 화면을 구성
- 컨트롤러 (Controller): 사용자 입력을 처리하고, 모델과 뷰 사이를 연결한다.
- 역할 별로 관심사를 분리하여 협업에 유리하며 충돌 없이 효율적으로 개발할 수 있다
- 기능 수정 시 해당 역할만 수정하면 되어서 유지보수와 확장성이 높다
- 모델, 뷰, 컨트롤러는 서로 독립적이기 때문에, 테스트를 뷰를 제외하고 모델과 컨트롤러에 집중해서 진행할 수 있다
- 다수의 웹 프레임워크가 MVC 아키텍쳐를 지원하기 때문에 편리하게 구현할 수 있다
블랙보드 (Blackboard)
정의: 여러 컴포넌트가 공유된 데이터 공간을 통해 협력하는 구조이다. 데이터를 한 곳에 저장하고 모든 컴포넌트가 이를 참조하는 방식이다.
장점: 다양한 지식 기반 시스템이 협력해 복잡한 문제를 해결할 수 있다.
인터프리터 (Interpreter)
정의: 코드를 한 줄씩 해석하며 즉시 실행하는 구조이다.
장점: 실시간 실행과 디버깅에 유리하다.
모놀리식 (Monolithic)
정의: 모든 기능이 하나의 일체형 애플리케이션에 포함된 구조이다.
장점: 개발과 배포가 단순하고 초기 구축이 빠르다.
마이크로서비스 (Microservice)
정의: 기능을 독립적인 작은 서비스로 나눈 분산 아키텍처이다. 각 서비스를 끼웠다 뺐다 하듯이 독립적으로 개발하고 배포할 수 있다.
장점: 독립 배포와 스케일링이 가능하며 기술 선택이 유연하다.