소프트웨어 공학

[S/W Engineering] Chapter 02_UML

ITsubin 2022. 4. 17. 00:39

Chapter 02_ UML


"UML이란?"

 - 소프트웨어의 전체를 판단할 수 있도록 제시한 12개의 다이어그램

 - 시스템이 상호작용하는 측면, 시스템 전체 구조 측면, 컴포넌트 간의 관계 등을 시각적으로 볼 수 있게 나타낸 도면


{ 액터의 종류 }

 - 사용자 액터 : 시스템을 이용하는 사람(역할)

 - 시스템 액터 : 해당 프로젝트의 개발 범위에는 속하지 않지만 데이터를 주고받는 등 서로 연동되는 또 다른 시스템

 - 주요 액터 : 시스템에게 작업의 실행을 요구하는 능동적 입장의 액터(대부분의 액터가 이에 해당)

 - 보조 액터 : 유스케이스로부터 요청을 받거나 메시지를 전달받아 수동적으로 작업을 하는 액터

 - 프록시 액터 : 액터와 시스템의 중간 위치에서 무언가를 대신해주는 액터 (시스템에 등록할 수 있도록 접근 권한이 부여된 경우에만)


{ 유스케이스 }

 - 사용자가 시스템을 통해 사용하고 싶은 기능

 - 유스케이스가 모여 하나의 서브 시스템을 이루고 서브 시스템이 모여 개발 시스템이 됨.

 - ( 유스케이스 < 서브 시스템 < 개발 시스템 )

 - 전체 시스템은 유스케이스를 모아놓은 것과 같아야 함.


{ 유스케이스 식별 }

 - 사용자인 엑터가 시스템에 요구하는 기능을 후보 유스케이스로 선정할 수 있음.

 - 사용자의 업무에서 유스케이스를 도출할 수 있음

 - 데이터베이스에서 데이터를 등록/수정/삭제/조회하는 기능을 하나의 유스케이스로 선정할 수 있음.

 - 개발자는 [사용자 관점]에서 유스케이스를 정의해야 함.

 - 처음에는 가능하다고 생각되는 것을 모두 도출해 놓고 하나씩 면밀히 살펴보는 과정을 거쳐 불필요한 것은 삭제하고, 필요시 합치거나 분리해 최종 유스케이스 선정


{ 유스케이스 검증 }

시스템이 아니라 수작업으로 이루어지는 것은 유스케이스에 포함하면 안 됨.

액터가 원하는 최종 결과만 나타내는 유스케이스인지 확인

액터가 수행하는 유스케이스인지 확인

유스케이스 내의 이벤트 흐름 전체를 액터가 사용하는지 확인


{ 유스케이스 이름 }

사용자 관점에서 이해할 수 있는 이름을 사용

명사보다는 동사형 명사를 사용(어떤 기능을 하는지 알 수 있게 하기 위함)

사용자가 시스템을 통해 얻으려는 최종 목적이 나타나는 이름을 사용


{ 관계 }

>> 액터 => 유스케이스 관계

 

 - 액터와 유스케이스는 연관 관계로 방향성을 갖는 실선으로 표현

 - 화살표 방향은 데이터가 흘러가는 방향이 아니라 제어의 흐름을 나타냄

 - 제어하는 주체에서 출발해 제어받는 대상으로 연관 방향이 결정

 - 시스템 액터도 유스케이스 제어의 주체가 될 수 있음

 - 학생(액터)과 증명서 자동 발급기(시스템 액터) 사이인 액터와 액터 사이에도 연관 관계 존재

 

>> 유스케이스 => 액터 관계

 

 - 유스케이스의 수행 결과를 액터에게 알려줄 때는 유스케이스에서 액터로 방향성을 갖는 실선으로 표현

 - 유스케이스 => 액터 관계에서 주의할 사항은 통보 기능이 시스템 내에서 이루어져야 함.

 - 유스케이스 다이어그램에서 화살표로 나타냈다면 그 기능을 개발에 포함해야 함.

 

>> 유스케이스 => 시스템 액터 관계

 

>> 액터의 일반화 관계

 

 - 일반화? : 개별적인 것에서 공통적인 특징을 뽑아 이름을 붙인 것 <=> 특수화

 - 일반화 개념은 액터 사이에 먼저 적용할 수 있음.

 - 간결하게 일반화해 복잡함을 줄이면 이해하기가 쉽고 새로운 액터도 간단하게 추가 가능

 

>> 포함 관계

 

 - 유스케이스의 일부 기능이 다른 유스케이스에서도 공통으로 필요하다면 이를 별도로 만든 뒤 호출해 사용하는 것

 - 피포함 유스케이스 : 공통으로 사용하기 위해 별도 유스케이스로 만들어 놓은 것

 - 기본 유스케이스 : 피포함 유스케이스를 호출하는 유스케이스

 - 포함 관계는 화살표 방향이 기본 유스케이스에서 피포함 유스케이스로 향함

 - 점선을 사용하고 스테레오 타입으로 <<include>>라고 표기

 - 포함 관계는 화살표 방향이 기본 유스케이스에서 피포함 유스케이스로 향함

 - 피포함 유스케이스는 2개 이상의 유스케이스에서 사용할 수 있는 공통 부분(이벤트 흐름)으로 만들어야 함.

 - 다른 유스케이스에서 사용하지 않는 기능이라면 포함 관계를 만들지 않아야 함

 - 포함 관계는 선행 조건(유스케이스 명세서 작성 시 필요)과 혼동 주의

 

>> 확장 관계

 

 - 특정 조건(메일 도착 등)이 발생하면 확장 유스케이스(메일 확인 등)를 수행하고 다시 기준 유스케이스(검색 등)를 수행

 - 확장 관계는 점선 화살표로 표기하고 방향은 기준 유스케이스 쪽으로 향함

 - <<extend>>라는 스테레오 타입을 사용

 - 예외적인 상황이나 어쩌다 한 번 발생하는 것을 확장 관계로 표현하는 것은 적절하지 않음.


{ 클래스 다이어그램 }

 - 소프트웨어의 기본 구성 단위인 시스템에서 사용하는 클래스를 정의

 - 클래스들이 서로 어떻게 연결되어 있고 어떤 역할을 하는지 다이어그램으로 표현

 

>> 클래스

 - 데이터(속성)와 메서드를 묶어 놓은 것

 - 세 칸의 직사각형 모양

 - 첫 번째 칸에는 클래스 이름

 - 두 번째 칸에는 클래스의 속성

 - 마지막 칸은 클래스가 제공하는 기능인 메서드를 나타냄

 

>> 클래스 이름

 - 클래스는 다른 클래스와 구별되는 유일한 이름을 가짐

 - 이름에 명사나 명사구를 사용하며 두 단어를 사용할 때는 붙여 쓰되 각 단어의 첫 글자는 대문자로 씀

 - 복수형, 소유격, 형용사는 가급적 쓰지 않음

 

>> 속성

 - 클래스가 갖는 정적인 특성

 - 속성의 이름은 소문자로 나타내며 두 단어를 사용 할 때는 두 번째 단어의 첫 글자는 대문자로 씀

 

>> 메서드

 - 클래스가 외부의 다른 객체에게 제공할 서비스와 기능

 - 외부 클래스는 메서드를 통해 해당 클래스에 접근할 수 있음

 - 외부에서 이 기능을 요구하는지에 따라 메서드로 도출할지 판단

 

>> 가시성

 - 속성과 메서드의 접근 권한을 지정하는 방식


{ 순차 다이어그램 }

 - 실행 시점에 객체들이 어떻게 상호 동작하는지를 메시지 순서에 초점을 맞춰 나타낸 것
 - 어떠한 작업이 객체 간에 발생하는지를 시간 순서에 따라 쉽게 파악할 수 있음
 

>> 객체

 - 순차 다이어그램에서 객체는 메시지를 보내고 받는 것

 - '객체명: 클래스명'으로 나타내며, 한 쪽은 생략 가능

 

>> 객체 생명선

 - 객체의 생존 기간을 나타내며 X 표시는 객체가 소멸하는 시점

 - 위에서 아래로 내려가는 점선으로 나타냄

 - 생명선을 따라 나타나는 직사각형은 활성 구간으로 객체의 메서드가 실행되고 있음을 나타냄

 - 구간의 길이는 메서드의 실행 시간을 나타냄

 - 활성 구간은 반드시 존재하는 것은 아니며 생략 가능

 

>> 메시지

 - 객체와 객체의 상호작용을 표현하는 것으로 화살표를 이용

 - 화살표 위에는 수신 객체의 함수명을 명기

 

>> 동기 메시지

 - 송신 객체가 수신 객체에 서비스를 요청(메서드를 호출)하면 메서드 실행이 완료될 때까지 기다림

 - 실선과 속이 채워진 삼각형 화살표로 나타냄

 

>> 비동기 메시지

 - 송신 객체가 수신 객체에 서비스를 요청(메서드를 호출)할 때 메서드의 실행과 상관 없이 다음 작업을 수행

 - 수신 객체로부터의 반환도 기다리지 않음

 - 일반 화살표 모양으로 나타냄

 

>> 재귀 메시지

 - 수신 객체가 자신의 메서드를 호출할 때 사용

 - ㄷ자 형태의 화살표 모양으로 나타냄

 

>> 답신 메시지

 - 호출 메서드의 결과를 반환할 때 사용

 - 점선과 속이 채워진 삼각형 화살표로 나타냄

 

"순차 다이어그램의 작성 과정"

1. 시나리오 정의

2. 다이어그램과 시나리오의 1:1 대응

3. 시나리오 분할


{ 통신 다이어그램 }

 - 객체 간 상호작용 관계에 주목

 - 화살표 위에 적힌 번호로 순서를 알 수 있음

 

>> 링크

 - 객체 간에 메시지를 주고받는 관계

 - 통신 다이어그램에서는 링크를 사용해 객체 간의 관계를 표현


{ 활동 다이어그램 }

 - 흐름도와 비슷하나 객체의 행위를 나타낸다는 점에서 다름

 - 상위 수준에서는 업무의 흐름을 표현하고 분석 단계에서는 유스케이스의 구체적인 흐름(이벤트 흐름)을 나타냄

 - 설계 단계에서는 클래스 내부 동작에 대한 알고리즘이나 구체적인 로직을 표현

 

>> 시작/종료 상태, 활동

 - 시작점 : 활동의 시작. 속이 채워진 원으로 표기

 - 종료점 : 활동의 종료. 이중 원으로 표기

 - 활동 : 일의 처리와 실행. 모서리가 둥근 사각형으로 표기

 - 전이 : 활동 간의 이동. 화살표로 표기

 

>> 분기와 병합

 - 분기 : 조건에 의해 두 가지 경로로 나뉘는 위치. 마름모로 표기 ((조건문은 마름모 옆에 << 조건문 >> 형식으로 작성

 - 병합 : 분기되어 각 활동을 수행하다가 합쳐지는 위치를 나타내며 분기와 같이 마름모를 사용 / 생략이 가능

 

>> 동기화 막대

 - 여러 활동을 병행할 때 사용하는 것. 동시 처리의 시작과 끝을 나타냄.

 

>> 신호

 - 활동 사이의 거래는 제어 신호를 보내는 방식으로 이루어짐

 

>> 구획면

 - 수영장의 레인을 의미하는데 수영 선수가 자신의 레인을 넘어가면 안 되는 것처럼 해당 레인을 책임지는 객체가 있음

 


{ 상태 다이어그램 }

 - 이벤트 발생이나 시간의 흐름에 따라 바뀌는 객체의 상태를 나타냄

 

>> 상태

 - 객체가 존재할 수 있는 조건

 - 객체의 존재 가능한 모든 상태가 파악되어야 함

 - 상태는 모서리가 둥근 사각형으로 표현

 

>> 전이

 - 객체의 상태가 바뀌는 것을 나타내며 화살표를 사용해 표현

 

>> 이벤트

 - 객체의 상태를 바뀌게 하는 자극

 - 화살표로 나타낸 전이 위에 << >> 기호를 사용해 작성


{ 컴포넌트 다이어그램 }

 - 구현 관점에서 정적 모델링을 할 때 사용하는 것

 - 어떤 실행 모듈이 존재하고 이들이 서로 어떤 연관성이 있는지의 종속 관계를 나타냄

 - 사용자에게 논리적 또는 물리적 시스템의 구조를 볼 수 있게 해줌

 

>> 컴포넌트

 - 컴포넌트는 시스템을 구성하는 물리적인 요소로 프로그램 코드를 포함

 - <<executable>>: 실행 파일(.exe)

 - <<library>>: DLL 같은 정적 또는 동적 객체 라이브러리

 - <<table>>: 데이터베이스 테이블

 - <<file>>: 원시 코드를 포함하는 파일

 

>> 인터페이스

 - 클래스 모양으로 나타내거나 아이콘을 사용해 간략하게 표현할 수 있음

 

>> 의존 관계

 - 서로 영향을 주고 받는 관계를 말함

 - 컴포넌트 간 연결은 점선 화살표로 나타내며 의존하는 쪽으로 화살표가 연결

 

"컴포넌트 다이어그램의 작성 과정"

1. 컴포넌트 대상 정의

2. 컴포넌트 찾기

3. 컴포넌트 배치

4. 의존 관계 정의