UML(Unified Modeling Language)#
UML(Unified Modeling Language)은 시스템, 소프트웨어, 비즈니스 프로세스를 시각적으로 모델링하기 위한 표준화된 범용 모델링 언어이다. 1990년대 중반에 Grady Booch, James Rumbaugh, Ivar Jacobson(종종 “삼총사"라고 불림)에 의해 개발되었으며, 현재는 OMG(Object Management Group)에서 관리하고 있다.
UML은 객체지향 프로그래밍의 개념이 확산되면서 소프트웨어 설계와 구조를 표현하는 공통 언어의 필요성에 의해 탄생했다. 프로그래밍 언어나 개발 방법론과 무관하게 사용할 수 있으며, 시스템의 다양한 측면을 표현할 수 있는 여러 다이어그램 유형을 제공한다.
UML은 현재 버전 2.5.1(2017년 12월 발표)까지 발전해왔으며, 소프트웨어 개발 과정에서 다음과 같은 역할을 한다:
- 시스템 요구사항, 설계, 구현을 시각적으로 모델링
- 개발팀 간의 커뮤니케이션 향상
- 시스템 아키텍처 문서화
- 구현 전 시스템의 청사진 제공
- 비즈니스 프로세스 모델링
UML 개요#
정의
UML은 객체지향 소프트웨어 개발에 특화되어 있으며, 시스템과 그 산출물을 명세화, 시각화, 구축, 문서화할 수 있도록 지원하는 범용 모델링 언어이다.
역할
UML은 복잡한 시스템을 한눈에 파악할 수 있도록 다이어그램을 통해 개념 모델을 시각화하므로, 문제 도메인과 제품 요구사항을 명확히 이해하고, 구현 전 솔루션을 실험하며, 개발 과정에서 발생할 수 있는 모호함을 줄이는 데 큰 도움이 된다.
UML의 특징#
가시화(Visualization)
UML은 클래스, 객체, 유스케이스 등 다양한 다이어그램을 통해 소프트웨어 시스템의 핵심 개념들을 시각적으로 표현하여 오류를 줄이고 이해도를 높인다.
명세화(Specification)
개발 과정에서 필요한 모델을 정확하고 완전하게 정의할 수 있으며, 각 다이어그램에 사용되는 기호와 표기법은 명확한 의미를 가지도록 설계되어 있다.
구축(Construction)
UML로 작성한 모델은 Java, C#, C++ 등 다양한 프로그래밍 언어의 코드로 자동 변환할 수 있어, 실제 시스템 구축 단계에 직접 활용할 수 있다.
문서화(Documentation)
UML은 시스템 설계 문서를 표준화된 형태로 작성할 수 있게 하여, 프로젝트 참여자 간의 의사소통을 원활하게 하고 향후 시스템 유지보수 시 참고자료로 유용하게 사용된다.
UML 다이어그램 유형#
UML 2.5.1은 크게 두 가지 유형의 다이어그램으로 분류된다:
구조 다이어그램(Structure Diagrams)#
시스템의 정적 구조와 객체, 클래스, 모듈 간의 관계를 표현한다.
클래스 다이어그램(Class Diagram)#
시스템 내 클래스, 속성, 메소드, 클래스 간의 관계를 보여준다.
객체지향 설계의 기본이 되는 다이어그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| +---------------------+
| Customer |
+---------------------+
| -id: String |
| -name: String |
| -email: String |
+---------------------+
| +getId(): String |
| +setName(name) |
| +getEmail(): String |
+---------------------+
▲
|
| 상속
|
+---------------------+
| PremiumCustomer |
+---------------------+
| -level: int |
| -discount: double |
+---------------------+
| +getDiscount() |
| +upgradeLevel() |
+---------------------+
|
클래스 다이어그램의 주요 요소:
- 클래스: 속성(attributes)과 연산(operations)을 포함
- 가시성: public(+), private(-), protected(#), package(~)
- 관계:
- 연관(Association): 클래스 간의 일반적 관계
- 집합(Aggregation): 한 클래스가 다른 클래스의 컬렉션을 포함
- 합성(Composition): 더 강한 집합 관계, 부분이 전체에 종속
- 의존(Dependency): 한 클래스가 다른 클래스를 사용
- 일반화(Generalization): 상속 관계
- 실현(Realization): 인터페이스 구현
객체 다이어그램(Object Diagram)#
특정 시점의 객체 인스턴스와 그 관계를 보여준다.
클래스 다이어그램의 인스턴스라고 볼 수 있다.
1
2
3
4
| :Customer
id = "C1001"
name = "홍길동"
email = "hong@example.com"
|
컴포넌트 다이어그램(Component Diagram)#
시스템의 물리적 컴포넌트와 그 의존성을 보여준다.
소프트웨어의 모듈화 및 구성을 표현한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
| +-------------------+
| Web Interface |
+-------------------+
|
v
+-------------------+ +-------------------+
| Business Logic |--->| Data Access |
+-------------------+ +-------------------+
|
v
+-------------------+
| Database |
+-------------------+
|
배치 다이어그램(Deployment Diagram)#
물리적 아키텍처와 소프트웨어 컴포넌트의 배포를 보여준다.
하드웨어 노드와 그 관계를 표현한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
| +------------------+ +-------------------+
| Client Machine |<--------| Web Server |
+------------------+ +-------------------+
|
v
+-------------------+
| Application Server|
+-------------------+
|
v
+-------------------+
| Database Server |
+-------------------+
|
패키지 다이어그램(Package Diagram)#
시스템의 패키지 구조와 의존성을 보여준다.
모듈화된 시스템의 계층 구조를 표현하는 데 유용하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
| +--------------------+
| UI Layer |
+--------------------+
|
v
+--------------------+ +--------------------+
| Service Layer |----->| Utility Module |
+--------------------+ +--------------------+
|
v
+--------------------+
| Repository Layer |
+--------------------+
|
복합 구조 다이어그램(Composite Structure Diagram)#
클래스 내부 구조와 협력 관계를 표현한다.
복잡한 시스템의, 내부 구조를 세부적으로 모델링할 때 사용된다.
프로필 다이어그램(Profile Diagram)#
UML을 특정 도메인이나 플랫폼에 맞게 확장하는 방법을 정의한다.
행위 다이어그램(Behavior Diagrams)#
시스템의 동적 행위, 상호작용, 시간에 따른 변화를 표현한다.
유스케이스 다이어그램(Use Case Diagram)#
시스템과 사용자(액터) 간의 상호작용과 기능을 보여준다.
요구사항 분석 단계에서 주로 사용된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| +------------------------------+
| Online Shop |
| |
| +----------------------+ |
| | Browse Items | |
| +----------------------+ |
| |
+--------+ | +----------------------+ |
| |------>| Place Order | |
| Customer| | +----------------------+ |
| | | |
+--------+ | +----------------------+ |
| | Track Delivery |<---+----+ +--------+
| +----------------------+ | | Delivery|
| | | Service |
+------------------------------+ +--------+
|
유스케이스 다이어그램의 주요 요소:
- 액터(Actor): 시스템과 상호작용하는 외부 엔티티
- 유스케이스(Use Case): 시스템이 제공하는 기능
- 관계:
- 연관(Association): 액터와 유스케이스 간의 상호작용
- 확장(Extend): 특정 조건에서 추가되는 동작
- 포함(Include): 공통 기능을 재사용하는 관계
- 일반화(Generalization): 액터나 유스케이스 간의 상속 관계
시퀀스 다이어그램(Sequence Diagram)#
객체 간의 상호작용을 시간 순서대로 보여준다.
메시지 교환과 시스템 동작의 흐름을 표현한다.
1
2
3
4
5
6
7
8
9
| User LoginController UserService Database
| | | |
|---Login Request->| | |
| |--Validate User->| |
| | |--Query User--->|
| | |<--User Data----|
| |<---User Status--| |
|<--Login Result---| | |
| | | |
|
시퀀스 다이어그램의 주요 요소:
- 라이프라인(Lifeline): 객체나 역할을 나타내는 수직선
- 메시지(Message): 객체 간에 전달되는 통신
- 활성화(Activation): 객체가 실행 중인 시간을 나타내는 박스
- 조건부 논리(Conditional Logic): if, loop 등의 제어 구조
활동 다이어그램(Activity Diagram)#
비즈니스 프로세스나 워크플로우를 단계별로 표현한다.
알고리즘이나 비즈니스 로직을 모델링하는 데 사용된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| (시작)
|
v
+----------+
| 주문 접수 |
+----------+
|
v
+-----------------+
| 재고 확인 |
+-----------------+
|
v
< 재고 있음? >
/ \
예 아니오
| |
v v
+--------+ +------------+
| 포장 | | 재고 주문 |
+--------+ +------------+
| |
v v
+--------+ +-------------+
| 배송 | | 고객에게 알림|
+--------+ +-------------+
| |
v v
(종료) (종료)
|
활동 다이어그램의 주요 요소:
- 활동(Activity): 수행되는 작업
- 결정(Decision)/분기(Fork): 조건부 흐름
- 병합(Merge)/조인(Join): 흐름의 병합
- 스위밍 레인(Swimlane): 활동의 책임자나 부서 구분
상태 다이어그램(State Diagram)#
객체의 상태 변화와 상태 전이를 표현한다.
객체의 생명주기를 모델링하는 데 적합하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
| +------------+ 주문 접수 +-------------+ 결제 확인 +------------+
| |------------>| |------------>| |
----->| 생성됨 | | 처리 중 | | 완료됨 |
| | | | | |
+------------+ +-------------+ +------------+
| |
| |
| 취소 요청 | 결제 실패
v v
+------------+ +-------------+
| 취소됨 | | 실패 |
| | | |
+------------+ +-------------+
|
상태 다이어그램의 주요 요소:
- 상태(State): 객체가 있을 수 있는 조건
- 전이(Transition): 상태 간의 변화
- 이벤트(Event): 전이를 트리거하는 사건
- 액션(Action): 상태 변화 시 수행되는 작업
통신 다이어그램(Communication Diagram)#
객체 간의 상호작용을 구조적 배치와 함께 보여준다.
시퀀스 다이어그램과 비슷하지만 시간 순서보다 구조적 관계에 초점을 맞춘다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| +-------------+
| User |
+-------------+
|
| 1: login(username, password)
v
+------------------+
| LoginController |
+------------------+
|
2: validate(username, password) |
v
+------------------+
| UserService |
+------------------+
|
3: findUser(username) |
v
+------------------+
| Database |
+------------------+
|
상호작용 개요 다이어그램(Interaction Overview Diagram)#
여러 상호작용 다이어그램을 결합하여 복잡한 시나리오를 표현한다.
활동 다이어그램과 시퀀스 다이어그램의 혼합 형태이다.
타이밍 다이어그램(Timing Diagram)#
시간에 따른 객체의 상태 변화와 상호작용을 표현한다.
실시간 시스템이나 시간 제약이 있는 시스템 모델링에 유용하다.
UML 관계 유형#
UML에서 다양한 요소 간의 관계를 표현하는 방법은 다음과 같다:
연관(Association)#
두 클래스 간의 일반적인 관계를 나타낸다. 보통 한 클래스가 다른 클래스의 인스턴스를 참조하거나 사용할 때 사용된다.
단방향 연관(Unidirectional Association)#
한 클래스만 다른 클래스를 인식하는 관계이다.
1
| Customer -------> Order
|
양방향 연관(Bidirectional Association)#
두 클래스가 서로를 인식하는 관계이다.
1
| Customer <-------> Order
|
다중성(Multiplicity)#
연관 관계에서 객체 인스턴스의 수량을 표현한다.
1
2
| Customer "1" --------- "*" Order
(한 고객은 여러 주문을 가질 수 있음)
|
주요 다중성 표기:
1
: 정확히 하나*
또는 0..*
: 0개 이상1..*
: 1개 이상0.
: 0개 또는 1개m..n
: m개에서 n개까지
집합(Aggregation)#
“has-a” 관계를 나타내며, 한 클래스가 다른 클래스의 컬렉션을 포함하지만 생명주기는 독립적인 관계이다.
1
2
| Department <>------ Employee
(부서는 직원들을 포함하지만, 부서가 없어져도 직원은 존재)
|
합성(Composition)#
더 강한 “contains-a” 관계로, 부분이 전체에 강하게 종속되어 있고 생명주기를 공유한다.
1
2
| Order <♦>------ OrderItem
(주문이 삭제되면 주문 항목도 삭제됨)
|
일반화/상속(Generalization/Inheritance)#
“is-a” 관계를 나타내며, 한 클래스가 다른 클래스의 특수화된 형태임을 표현한다.
1
2
| Vehicle <|------- Car
(자동차는 차량의 한 종류)
|
실현(Realization)#
인터페이스와 이를 구현하는 클래스 간의 관계를 표현한다.
1
2
3
| <<interface>>
Payable <|……… CreditCardPayment
(신용카드 결제는 결제 인터페이스를 구현)
|
의존(Dependency)#
한 클래스가 다른 클래스에 의존하는 관계를 표현한다.
보통 메소드 매개변수, 지역 변수 등으로 일시적으로 사용하는 경우이다.
1
2
| OrderService -----> EmailService
(주문 서비스는 이메일 서비스를 사용)
|
UML 다이어그램 작성 방법 및 도구#
UML 다이어그램 작성 과정#
- 목적 정의: 다이어그램이 표현하고자 하는 내용과 대상자 결정
- 다이어그램 유형 선택: 시스템의 어떤 측면을 표현할지에 따라 적절한 다이어그램 유형 선택
- 요소 식별: 클래스, 객체, 액터, 유스케이스 등 필요한 요소 식별
- 관계 식별: 요소 간의 관계 파악
- 다이어그램 작성: 적절한 UML 표기법을 사용하여 다이어그램 작성
- 검토 및 수정: 완성된 다이어그램을 검토하고 필요시 수정
UML 도구#
UML 다이어그램을 작성하는 데 사용할 수 있는 다양한 도구가 있다:
- 전문 UML 도구
- Enterprise Architect: 복잡한 시스템 모델링에 적합한 전문 도구
- Visual Paradigm: 직관적인 인터페이스와 다양한 UML 다이어그램 지원
- Rational Rose/IBM Rational Software Architect: IBM의 전문 모델링 도구
- StarUML: 경량화된 UML 모델링 도구
- MagicDraw: 고급 UML 모델링 기능을 제공하는 전문 도구
- 통합 개발 환경(IDE) 플러그인
- Eclipse Papyrus: Eclipse IDE용 UML 모델링 플러그인
- Visual Studio Class Designer: Microsoft Visual Studio의 클래스 다이어그램 도구
- IntelliJ IDEA UML 지원: JetBrains의 IntelliJ IDEA에서 제공하는 UML 기능
- 온라인/클라우드 도구
- Lucidchart: 웹 기반 다이어그램 작성 도구
- draw.io (diagrams.net): 무료 온라인 다이어그램 도구
- Gliffy: Atlassian 제품과 통합 가능한 다이어그램 도구
- Creately: 협업 기능이 강화된 온라인 다이어그램 도구
UML 모델링 사례 연구#
온라인 쇼핑몰 시스템 모델링#
유스케이스 다이어그램#
온라인 쇼핑몰의 주요 기능과 사용자 상호작용을 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| +------------------------------+
| 온라인 쇼핑몰 |
| |
| +----------------------+ |
| | 상품 검색 | |
| +----------------------+ |
| ^ |
| | |
+--------+ | +----------------------+ | +--------+
| |----->| 상품 조회 | | | |
| 고객 | | +----------------------+ |<---| 관리자 |
| | | | | | |
+--------+ | v | +--------+
| | +----------------------+ | |
| | | 장바구니 관리 | | |
| | +----------------------+ | |
| | | | |
| | | «include» | |
| | v | |
+--------> +----------------------+ | |
| | 주문 처리 | | |
| +----------------------+ | |
| | | |
| | «include» | |
| v | |
| +----------------------+ | |
| | 결제 처리 |<---+--------+
| +----------------------+ |
| |
+------------------------------+
|
클래스 다이어그램#
온라인 쇼핑몰의 주요 클래스와 그 관계를 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| +---------------+ +----------------+ +---------------+
| Customer | | Order | | Product |
+---------------+ +----------------+ +---------------+
| -id: String | | -id: String | | -id: String |
| -name: String | | -date: Date | | -name: String |
| -email: String| | -status: String| | -price: double|
| -address: Addr| | -totalAmt: dbl | | -stock: int |
+---------------+ +----------------+ +---------------+
| +register() | | +placeOrder() | | +addStock() |
| +login() | | +cancel() | | +updatePrice()|
| +updateInfo() | | +confirm() | | +getDetails() |
+---------------+ +----------------+ +---------------+
| 1 | 1 | *
| | |
v * v * |
+---------------+ +----------------+ |
| ShoppingCart | | OrderItem |<------------+
+---------------+ +----------------+
| -id: String | | -quantity: int |
| -createdAt | | -price: double |
+---------------+ +----------------+
| +addItem() | | +getSubtotal() |
| +removeItem() | +----------------+
| +checkout() |
+---------------+
| 1
|
v *
+---------------+
| CartItem |
+---------------+
| -quantity: int|
+---------------+
| +updateQty() |
+---------------+
|
시퀀스 다이어그램#
주문 처리 과정의 객체 간 상호작용을 시간 순서대로 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
| 고객 장바구니 주문 서비스 결제 서비스 재고 관리
| | | | |
|--장바구니 체크아웃->| | | |
| |--주문 생성----->| | |
| | |--결제 요청----->| |
| | | |--결제 처리---->|
| | | |<--결제 승인----|
| | |<--결제 완료----| |
| | |--재고 업데이트------------------>|
| | |<--재고 확인-----------------------|
| |<--주문 확인----| | |
|<--주문 완료----| | | |
| | | | |
|
상태 다이어그램#
주문의 상태 변화를 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| +-------------------+
| Order State |
+-------------------+
+------------+ 주문 접수 +-------------+ 결제 확인 +------------+ 배송 시작 +------------+
| |------------>| |------------>| |------------>| |
->| Created | | Processing | | Confirmed | | Shipped |
| | | | | | | |
+------------+ +-------------+ +------------+ +------------+
| | | |
| | | |
취소 요청 결제 실패 취소 요청 배송 완료
| | | |
v v v v
+------------+ +-------------+ +------------+ +------------+
| Cancelled | | Failed | | Cancelled | | Delivered |
| | | | | | | |
+------------+ +-------------+ +------------+ +------------+
|
은행 ATM 시스템 모델링#
유스케이스 다이어그램#
ATM 시스템의 주요 기능과 사용자 상호작용을 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| +----------------------------+
| ATM 시스템 |
| |
| +--------------------+ |
| | 카드 인증 | |
| +--------------------+ |
| | |
| v |
+----------+ | +--------------------+ | +-------------+
| |------->| | 잔액 조회 | | | |
| 고객 | | +--------------------+ |<------| 은행 시스템 |
| | | | | | |
+----------+ | | | +-------------+
| +--------------------+ |
| | 현금 인출 | |
| +--------------------+ |
| | |
| | |
| +--------------------+ |
| | 현금 입금 | |
| +--------------------+ |
| | |
| | |
| +--------------------+ |
| | 계좌 이체 | |
| +--------------------+ |
| |
+----------------------------+
|
클래스 다이어그램#
ATM 시스템의 주요 클래스와 그 관계를 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| +---------------+ +----------------+ +---------------+
| ATM | | Transaction | | Account |
+---------------+ +----------------+ +---------------+
| -id: String | | -id: String | | -number: String
| -location | | -date: Date | | -balance: dbl |
| -status | | -type: TxnType | | -status |
+---------------+ | -amount: dbl | +---------------+
| +start() | +----------------+ | +debit() |
| +shutdown() | | +execute() | | +credit() |
| +maintenance()| | +reverse() | | +getBalance() |
+---------------+ +----------------+ +---------------+
| 1 ^ 1 | 1
| | |
v 1 | v *
+---------------+ | +---------------+
| CardReader | | | Transaction |
+---------------+ | +---------------+
| -status | |
+---------------+ |
| +readCard() |<--------------+---------------+
| +ejectCard() | | |
+---------------+ +-----------------+ +------------------+ +---------------+
| WithdrawalTxn | | DepositTxn | | BalanceInqTxn |
+-----------------+ +------------------+ +---------------+
| -amount: double | | -amount: double |
+-----------------+ +------------------+
| +execute() | | +execute() | | +execute() |
+-----------------+ +------------------+ +---------------+
|
활동 다이어그램#
ATM 시스템에서 현금 인출 프로세스를 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| (시작)
|
v
+----------------+
| 카드 삽입 |
+----------------+
|
v
+----------------+
| PIN 입력 |
+----------------+
|
v
< PIN 유효한가? >
/ \
아니오 예
| |
v v
+----------------+ +-------------------+
| 카드 반환 | | 거래 유형 선택 |
+----------------+ +-------------------+
| |
v v
(종료) +-------------------+
| 현금 인출 선택 |
+-------------------+
|
v
+-------------------+
| 금액 입력 |
+-------------------+
|
v
< 잔액 충분한가? >
/ \
아니오 예
| |
v v
+------------------+ +------------------+
| 거래 거절 메시지 | | 현금 지급 |
+------------------+ +------------------+
| |
v v
+------------------+ +------------------+
| 카드 반환 | | 영수증 출력? |
+------------------+ +------------------+
| / \
v 아니오 예
(종료) | |
v v
+------------------+--+
| 카드 반환 |
+-------------------+
|
v
(종료)
|
시퀀스 다이어그램#
ATM 시스템에서 현금 인출 과정의 객체 간 상호작용을 시간 순서대로 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| 고객 ATM 카드리더 은행시스템 계좌
| | | | |
|--카드 삽입---->| | | |
| |--카드 읽기 요청-->| | |
| |<--카드 정보------| | |
|<--PIN 요청---| | | |
|--PIN 입력---->| | | |
| |--인증 요청----------------------->| |
| |<--인증 결과-----------------------| |
|<--메뉴 표시---| | | |
|--현금 인출---->| | | |
|<--금액 요청---| | | |
|--금액 입력---->| | | |
| |--출금 요청----------------------->| |
| | | |--계좌 확인-->|
| | | |<--잔액 확인--|
| |<--승인/거절 결과-------------------| |
| |--현금 지급----->| | |
|<--현금 수령---| | | |
| |--영수증 출력---->| | |
|<--영수증 수령-| | | |
| |--카드 반환----->| | |
|<--카드 수령---| | | |
| | | | |
|
상태 다이어그램#
ATM 기기의 상태 변화를 모델링한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| +-------------------+
| ATM State |
+-------------------+
+------------+ 전원 켜기 +-------------+ 카드 삽입 +------------+ PIN 검증 +------------+
| |------------>| |------------>| |------------>| |
| Idle | | Ready | | Card Read | | Authorized |
| |<------------| |<------------| |<------------| |
+------------+ 전원 끄기 +-------------+ 카드 방출 +------------+ 세션 종료 +------------+
^ |
| |
| +-------------+ |
| | | |
+------------------------------| Processing |<----------------------+
거래 완료 | | 거래 선택
+-------------+
| ^
| |
오류 재시도
| |
v |
+-------------+
| Error |
| |
+-------------+
|
UML 모델링 모범 사례와 팁#
효과적인 UML 모델링을 위한 가이드라인#
- 목적과 대상을 명확히 하기: 다이어그램을 작성하기 전에 무엇을 전달하려고 하는지, 누구를 위한 것인지 명확히 한다.
- 단순성 유지: 복잡한 시스템을 모델링할 때도 각 다이어그램은 가능한 단순하게 유지한다. 필요하다면 여러 다이어그램으로 나누어 표현한다.
- 적절한 추상화 수준 선택: 너무 세부적이거나 너무 추상적이지 않은, 목적에 맞는 추상화 수준을 선택한다.
- 일관된 명명 규칙 사용: 모든 다이어그램에서 클래스, 메소드, 속성 등의 이름을 일관되게 사용한다.
- 표준 UML 표기법 준수: UML 표준을 최대한 준수하여 모델의 이해도를 높인다.
- 적절한 다이어그램 유형 선택: 표현하려는 시스템 측면에 가장 적합한 다이어그램 유형을 선택한다.
- 다이어그램 간의 일관성 유지: 여러 다이어그램 간에 요소의 이름, 관계 등이 일관되게 유지되어야 한다.
- 주석 및 설명 추가: 복잡한 관계나 특수한 조건에 대해 주석이나 설명을 추가하여 이해를 돕는다.
흔한 실수와 해결 방법#
- 과도한 세부 사항: 모든 세부 사항을 포함하려고 하면 다이어그램이 복잡해진다. 목적에 맞는 적절한 수준의 세부 사항을 포함하도록 한다.
- 불충분한 문서화: 다이어그램만으로는 모든 내용을 전달하기 어렵다. 추가적인 문서화로 보완한다.
- 비표준 표기법 사용: UML 표준을 따르지 않으면 오해를 불러일으킬 수 있다. 표준 표기법을 사용한다.
- 관계의 잘못된 사용: 연관, 집합, 합성, 의존 등의 관계를 정확히 구분하여 사용한다.
- 다이어그램 업데이트 소홀: 시스템이 변경될 때 다이어그램도 함께 업데이트해야 한다.
- 너무 많은 요소 포함: 한 다이어그램에 너무 많은 요소를 포함하면 가독성이 떨어진다. 필요하다면 여러 다이어그램으로 나준다.
- 적절한 추상화 부족: 핵심 개념과 관계에 초점을 맞추고 불필요한 세부 사항은 생략한다.
실용적인 UML 사용 방법#
- 필요한 다이어그램만 사용: 모든 UML 다이어그램 유형을 사용할 필요는 없다. 프로젝트의 요구사항과 팀의 특성에 맞는 다이어그램만 선택적으로 사용한다.
- 반복적인 개선: 초기 모델은 완벽하지 않을 수 있다. 피드백을 받아 지속적으로 개선한다.
- 도구의 효과적인 활용: UML 도구의 기능을 최대한 활용하여 모델링 효율을 높인다.
- 팀 협업 강화: UML을 통해 팀원 간의 의사소통을 개선하고 공통된 이해를 형성한다.
- 코드 생성 및 역공학: 가능하다면 UML에서 코드를 생성하거나 코드에서 UML을 생성하는 도구를 활용한다.
- 프로젝트 문서와 통합: UML 다이어그램을 프로젝트 문서와 통합하여 일관된 문서화를 유지한다.
용어 정리#
참고 및 출처#