소프트웨어 설계 - 요구사항 확인
![]()
소프트웨어 생명(수명) 주기
- 요구사항 분석:
기능 요구사항: 사용자가 시스템을 통해 제공받기 원하는 기능비기능 요구사항: 품질, 제약사항 등- 워크스루(비공식), 인스펙션(공식) 등을 통해 검토
- 설계
- 구현
- 테스트
- 유지보수
대표적 모형
- 폭포수 모형
- 프로토타입(원형) 모형
- 나선형(점진적) 모형
위험 관리에 중점을 둔 모형- 각 단계마다
계획,위험 분석,개발,고객 평가의 활동을 반복
개발 방법론
구조적 방법론: 하향식, 기능 중심, 나씨 - 슈나이더만 차트 사용
정보공학 방법론: 데이터 중심
객체지향 방법론: 객체 중심
- 객체지향 분석 방법:
- OOSE(Object Oriented Software Engineering): 야콥슨, 유스케이스 중심
- OMT(Object Modeling Technology): 럼바우, 객체(객체 다이어그램), 동적(상태 다이어그램), 기능 모델링(자료 흐름도) 중심
- OOD(Object Oriented Design): 부치, 설계 관점 강조
- 설계 원칙(SOLID):
- 단일 책임 원칙(SRP): 클래스는 하나의 책임만 가져야 한다.
- 개방-폐쇄 원칙(OCP): 기존 코드를 변경하지 않고 기능을 확장할 수 있어야 한다.
- 리스코프 치환 원칙(LSP): 자식 클래스는 부모 클래스로 치환될 수 있어야 한다.
- 인터페이스 분리 원칙(ISP): 자신이 사용하지 않는 인터페이스를 구현해서 클라이언트가 영향을 받아서는 안된다.
- 의존관계 역전 원칙(DIP): 하위 모듈이 상위 모듈에 의존하면 안된다.
- 객체지향 분석 방법:
컴포넌트 기반 방법론: 컴포넌트 중심
애자일 모형: 사람 중심
- 스크럼
- XP
- 5가지 가치: 용기, 단순성, 의사소통, 피드백, 존중
- 12가지 기본원리:
- pair programming
- 공동코드 소유
- 지속적인 통합(CI)
- 계획 세우기
- 작은 릴리즈
- 메타포어: 공통적인 이름 체계 사용해라
- 간단한 디자인
- 테스트 주도 개발(TDD)
- 리팩토링
- 주 40시간 이내 작업
- 고객 상주
- 코드 표준(convention)
- 린: 칸반보드 사용
제품 계열 방법론: 임베디드 소프트웨어를 작성하는데 유용
프로젝트 관리
비용 산정
- LoC(Line of Code) 산정법: (낙관치 + 4 * 중간치 + 비관치) / 6
- Man Month 모형:
- Man Month = LoC / (프로그래머 월간 생산성)
- 프로젝트 기간 = Man Month / 프로젝트 인력
- COCOMO(COnstructive COst MOdel) 모형: 프로젝트 규모에 따라 비용 산정
- 조직형: 소규모. 5만 라인 이하
- 반 분리형: 트랜잭션 처리 시스템, 데이터베이스 관리 시스템, 컴파일러 등 30만 라인 이하 소프트웨어
- 임베디드 형: 30만 라인 이상의 대규모 시스템
- Putnam 모형: 소프트웨어 개발주기의 단계별로 요구할 인력의 분포를 가정. Rayleigh Norden 곡선 사용
- Function Point(FP) 모형: 요구 기능을 증가시키는 인자별로 가중치를 부여하고, 합산하여 비용 산정
소프트웨어 아키텍처
아키텍처 비용 평가 모델
- SAAM(Software Architecture Analysis Method)
- ATAM(Architecture Tradeoff Analysis Method): 아키텍처 품질 속성간 트레이드오프 분석
- CBAM(Cost Benefit Analysis Method): ATAM을 기반으로 비용과 이익을 분석
- ADR(Active Design Review)
- ARID(Active Reviews for Intermediate Designs)
디자인 패턴
- 생성 패턴
- builder: 생성 과정과 표현 방법을 분리
# 생성 과정 (Director) - 순서만 담당, 재료는 모름 class 건축감독: build(빌더): 빌더.기초() 빌더.벽() 빌더.지붕() 빌더.문() return 빌더.결과() # 표현 (Builder) - 결과물의 실제 모습 담당 감독.build(나무빌더) → 통나무집 감독.build(벽돌빌더) → 벽돌집- prototype: 원본을 clone으로 깊은 복사하여 새로운 객체 생성
- factory method: 인스턴스 생성을 서브 클래스에 위임하는 것
- abstract factory: factory method와 달리 여러 관련된 객체들의 집합을 생성하는 것
- singleton: 한 클래스에 대해 한 객체만 존재하도록 제한
- 구조 패턴: 클래스나 객체를 조합하여 더 큰 구조를 만드는 패턴
- Bridge: 추상(기능)과 구현을 분리하여 독립적으로 확장 (no M x N, yes M + N)
- Decorator: 기존에 구현된 클래스에 필요한 기능을 추가해 나가는 것.
커피 = new 에스프레소() 커피 = new 우유데코(커피) # 우유 추가 커피 = new 시럽데코(커피) # 시럽 추가 커피.가격() # 에스프레소 + 우유 + 시럽 (감싼 만큼 누적)- Facade: 복잡한 서브시스템 앞에 단순한 통합 창구(인터페이스)를 제공
- Flyweight: 공통 부분을 공유하여 메모리 사용량을 줄이는 패턴
- Proxy: 특정 객체에 접근하기 전에 대리 객체를 두어 접근을 제어하는 패턴
- Composite: 단일 객체, 여러 객체를 담은 복합 객체를 동일하게 다루는 패턴
- Adapter
- 행위 패턴
- Mediator:
- Interpreter:
- Iterator: 내부 구조를 노출하지 않고(array인지 list인지 몰라도 된다) 컬렉션 요소를 순차 접근할 수 있도록 하는 패턴
- Template Method: 알고리즘의 골격(뼈대)은 상위 클래스에 정의, 세부 단계는 하위 클래스가 override
- Observer: 한 객체의 상태가 바뀌면, 의존하는 객체들에게 자동으로 통지
- State: 상태를 객체로 표현
- Visitor: 원 객체는 그대로. 방문자가 원 객체를 방문하여 특정 기능을 수행
class 원 { accept(v): v.visit(this) } class 사각형 { accept(v): v.visit(this) }- Command: 요청(명령)을 객체로 캡슐화
- Strategy: 알고리즘을 캡슐화하여 자유롭게 교체할 수 있도록 하는 패턴
- Memento: 객체의 상태를 저장하고 복원할 수 있도록 하는 패턴
- Chain of Responsibility: 객체를 chain으로 연결하고, 요청을 처리할 수 있는 객체가 나타날 때까지 chain을 따라 요청을 전달하는 패턴
UML(Unified Modeling Language)
- 모두를 위한 객체지향 모델링 언어
관계
┌────────────┬────────────────┬────────────────────────┬───────────────────────────┐ │ 관계 │ 영문 │ 표기(화살표) │ 핵심 의미 │ ├────────────┼────────────────┼────────────────────────┼───────────────────────────┤ │ 연관 │ Association │ 실선 ───▶ │ 서로 사용하는 지속적 관계 │ ├────────────┼────────────────┼────────────────────────┼───────────────────────────┤ │ 의존 │ Dependency │ 점선 화살표 ┈┈▶ │ 잠깐 사용하는 관계 │ ├────────────┼────────────────┼────────────────────────┼───────────────────────────┤ │ 일반화 │ Generalization │ 실선 + 빈 삼각형 ──▷ │ 상속 (is-a) │ ├────────────┼────────────────┼────────────────────────┼───────────────────────────┤ │ 실체화 │ Realization │ 점선 + 빈 삼각형 ┈┈▷ │ 인터페이스 구현 │ ├────────────┼────────────────┼────────────────────────┼───────────────────────────┤ │ 집합(집약) │ Aggregation │ 실선 + 빈 마름모 ──◇ │ 약한 전체-부분 │ ├────────────┼────────────────┼────────────────────────┼───────────────────────────┤ │ 포함(합성) │ Composition │ 실선 + 채운 마름모 ──◆ │ 강한 전체-부분 │ └────────────┴────────────────┴────────────────────────┴───────────────────────────┘
- 집합 관계 (Aggregation, 집약)
전체-부분 관계이지만 “약한 결합” — 부분이 독립적으로 존재 가능
전체가 사라져도 부분은 살아남음 동아리 ◇────── 학생
예: 동아리 ◇── 학생 → 동아리가 없어져도 학생은 존재. 학생은 다른 동아리에도 소속 가능
부분이 공유될 수 있음
포함 관계 (Composition, 합성)
전체-부분 관계이면서 “강한 결합” — 부분이 전체에 종속 (생명주기 함께)
- 전체가 사라지면 부분도 함께 소멸 집 ◆────── 방
- 예: 집 ◆── 방 → 집이 철거되면 방도 사라짐. 방은 그 집에만 속함 (공유 X)
다이어그램
- 구조적 다이어 그램:
정적모델링클래스 다이어그램- class: 일반적으로 3개의 획으로 나눠 클래스 이름, 속성, 오퍼레이션을 표기함
- 제약 조건: 입력될 값에 대한 조건, 오퍼레이션(함수) 전후에 지정해야 할 조건
- 관계:
연관,포함,집합,일반화,의존
- 객체 다이어그램: 인스턴스를 특정 시점의 객체와 객체 사이의 관계로 표현
- 컴포넌트 다이어그램: 구현 단계에서 실제 컴포넌트 간의 관계나 인터페이스 표현
- 배치(deployment) 다이어그램: 결과물, 프로세스, 컴포넌트 등 물리적 요소들의 위치를 표현
- 패키지 다이어그램: 유스케이스나 클래스 등의 모델 요소들을 그룹화한 패키지들의 관계 표현
- 행동 다이어그램:
동적모델링유스케이스 다이어그램:사용자, 사용 사례로 구성. 사용 사례 간 여러 관계 표현- 시스템: 시스템 내부에서 수행되는 기능들을 사각형으로 묶어 표현
- 액터: 시스템과 상호작용 하는 모든 외부 요소
- 주액터: 시스템을 사용함으로써 이득을 얻는 대상
- 부액터: 주액터의 목적 달성을 위해 서비스를 제공하는 외부 시스템
- 유스케이스: 사용자가 보는 관점에서 시스템이 액터에게 제공하는 서비스
- 관계:
연관,포함,확장,일반화
순차 다이어그램: 객체 간 메세지 표현- 액터: 외부 시스템
- 객체: 메시지를 주고받는 주체
- 생명선: 객체가 메모리에 존재하는 기간
- 실행 상자: 객체가 메시지를 주고받고 있음을 표현
- 메시지
- 회귀 메시지(reply message)
- 제어 블록(loop)
- 상태 다이어그램: 이벤트에 의한 객체들의 변화 표현
- 활동 다이어그램: 객체의 처리 흐름 표현
모듈
결합도
- 아래로 갈 수록 결합도 강함(안 좋음)
- 자료 결합도(data): 매개변수로만 데이터 전달
- 스탬프 결합도(stamp): 배열이나 레코드 등의 자료 구조가 전달됨
- 제어 결합도(control): flag 변수를 전달함
- 외부 결합도(external): 모듈에서 선언한 변수를 다른 모듈에서 참조
- 공통 결합도(common): 공통의 영역을 여러 모듈이 참조
- 내용 결합도(content): 한 모듈의 내부 기능이나 자료를 직접 참조
응집도
- 아래로 갈 수록 응집도 강함(좋음)
- 우연적 응집도(coincidental): 모듈의 구성 요소들이 관련 없음
- 논리적 응집도(logical): 유사한 기능들을 묶음
- 시간적 응집도(temporal): 특정 시간에 실행되는 기능들을 묶음(ex 프로그램 초기화)
- 절차적 응집도(procedual): 모듈 안의 구성 요소들이 순차적으로 수행됨. 데이터를 주고받지는 않음
- 교환적 응집도(communication): 동일한 입력 데이터 혹은 출력 데이터를 사용하여 서로 다른 기능을 수행함
- 순차적 응집도(sequential): 하나의 기능에서 나온 출력 데이터를 다음 기능의 입력 데이터로 사용
- 기능적 응집도(functional): 모듈 내 모든 기능들이 단일 문제와 연관됨
- 팬인: 모듈이 다른 모듈로부터 호출되는 횟수
- 팬아웃: 모듈이 다른 모듈을 호출하는 횟수
- 팬인이 높고 팬아웃이 낮은 모듈이 이상적