일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Realm
- 프로그래머스
- 코테
- leetcode
- GCD
- 오픈채팅방
- 명품cppProgramming c++
- DiffableDataSource
- DependencyInjection
- DispatchQueue
- swift
- data_structure
- MainScheduler.asyncInstance
- GIT
- SwiftUI
- rxswift
- gitflow
- MainScheduler
- DynamicMemberLookup
- 청년취업사관학교
- SRP
- MethodSwilzzling
- 등굣길
- SeSAC
- RaceCondition
- IOS
- cleanarchitecture
- combine
- CoreBluetooth
- MainScheduler.Instance
- Today
- Total
Do.
UML(Unified Modeling Language) - feat. Class Diaphragm 본문
Intro
UML. Unified Modeling Language는 시스템 설계를 시각화 하는 표준 방법을 제공하기 위한 소프트웨어 엔지니어링 분야의 범용 개발 모델링 언어입니다.
쉽게 말하면 글자로 표현되는 코드를 그림으로 표현하기 위한 방법이죠!
UML에 대해서 정확하게 알고 사용한 것은 아니지만 정말 유용한 도구라고 생각을 해서 많이 사용했는데요.
객체간의 관계와 구조를 코드를 보지 않고도 그림으로 설명할 수 있기 때문에, UML이 있으면 코드를 일일이 분석하지 않아도 어떤식으로 구성되어 있는지 한눈에 알 수 있습니다.
레거시 코드를 유지 보수 하다 보면 코드와 실제 화면이 잘 매치가 안되기도 하고, 추상화가 많이 되어 있는 경우 코드를 파악하는데 오랜 시간이 걸리기도 합니다. 개인의 역량에 따라 다르겠지만 그럴 때 해당 모듈에 대해서 정리한 다이어그램 이 있으면 참 좋겠다고 생각했었습니다.
뿐만아니라 PR 할 때 리뷰어가 쉽게 코드 구조를 파악할 수 있게 도움을 줄 수도 있고, 코드를 작성하기 전에 구조에 대한 의논을 하기 위해서도 좋은 도구로 쓰입니다.
UML 다이어그램의 유형에는 여러가지가 있는데 그 중에서 가장 유용하게 사용했던 클래스 다이어그램에 대해서 자세히 알아보려고 합니다.
Class Diagram
클래스 다이어그램은 시스템의 Class, Property, Method, Protocol 등을 표현할 수 있고 객체간의 관계를 나타낼 수 있습니다.
Class
Class는 사각형 박스로 나타냅니다 이 때 얘기하는 클래스는 개발 언어에서 class, struct를 구분하지 않습니다.
Inheritance
Inheritance는 상속을 뜻합니다. 상속은 비어있는 화살표로 표현됩니다.
이 때 화살표 방향은 'A가 B를 상속하고 있다' 로 읽는 기준으로 A가 B를 향하도록 하면 됩니다.
페르시안 고양이(A)가 고양이(B)를 상속하기 때문에 위 그림처럼 나타낼 수 있습니다.
Association
Association은 다른 말로 표현하면 이해가 쉬운데 우리가 Swift에서 특정 엔티티를 작성할 때 엔티티가 가진 Property를 표현하는 것과 같습니다. 그래서 Association은 Property입니다. 그래서 표현할 때 A가 B를 가지고 있다. 로 표현할 수 있으며 화살표가 A에서 B로 향하도록 하면 됩니다. 화살표는 열린 화살표로 표현됩니다
이때 Cat이 배열 즉 Person 하나가 다수의 Cat를 가지고 있다면 1...*과 같이 표현할 수 있습니다. 코드로 보자면 [Cat]과 같은 타입인 것이죠
그렇다면 Person이 Cat을 상속한 Persian Cat을 가지고 있다고 한다면 아래 처럼 표현이 가능합니다!
Protocol
SOLID를 설명하다보면 항상 나오는 얘기가 인터페이스를 의존한다 뭐 이런얘기 많이 하는데, Swift는 그럴때 Protocol을 쓸 수 있습니다.
Protocol을 표현하는 방법은 Class와 동일한 사각형으로 표현하며 이때 Class와 구분되어야 하므로 별도로 표시 해 줍니다.
이때 <<protocol>> 과 같이 표현한 것을 UML에서는 stereotypes라고 표현합니다. 만약 클래스 다이어그램을 그릴 때 구조체랑 클래스를 명시적으로 표현하고 싶을 때 <<structure>>, <<class>> 으로 표현할 수 있겠죠! [IBM Doc]
Protocol의 경우 이를 채용하는 실제 구현체가 있을텐데요! Implements Protocol은 비어있는 화살표와 점선으로 표현합니다. Swift에서 A는 B를 채용한다라고 했을 때 A가 B에게 화살표가 향하도록 비어있는 화살표와 점선으로 표현할 수 있습니다.
그래서 Person(A) 객체가 고양이를 가질 수 있도록 CatOwning(B)이라는 프로토콜을 채용하고 있다면 아래와 같이 그릴 수 있습니다.
Person이 CatOwning을 Conforms to라고도 표현하죠!
Dependency
아키텍처를 설명할때 의존관계에 대해서 정말 많이 설명하는데요! A가 B를 사용한다! 또는 A가 B를 의존한다라는 뜻으로 말할 수 있으며 열린 화살표와 점선으로 표시됩니다.
만약 A가 B를 사용(의존) 한다면 A에서 B로 화살표가 향하도록 할 수 있습니다.
예를들어 Cat의 이름은 PetOwning에 의해서 결정되기 때문에 Cat이 PetOwning을 의존하고 있습니다. 따라서 아래처럼 표현할 수 있습니다.
이외에도 상호관계를 나타내는 Aggregation과 존재하는데 반드시 필요한 관계가 있는 구성 관계 Composition가 있습니다.
Tool
작성한 코드에 대해서 손수 UML을 그릴 수도 있지만, 이를 좀더 편하게 그릴 수 있는 도구들이 존재합니다. 다양한 도구가 있는데 저는 Plant UML을 이용했습니다. 오픈소스이고, 작성이 간편해서 사용했던 것 같네요!
https://plantuml.com/ko/class-diagram
Conclusion
그간 정확하기 않은 클래스 다이어그램을 좀 그렸던거 같은데, 공통 언어이다 보니 바르게 작성해서 생각한 바를 잘 전달할 수 있도록 원칙을 지켜서 작성해야 할 것 같습니다. 🫠
Reference.
https://en.wikipedia.org/wiki/Class_diagram
https://www.ibm.com/docs/en/rsm/7.5.0?topic=models-uml-diagrams
raywenderlich - Design Patterns by Tutorials
'General Dev' 카테고리의 다른 글
Race Condition / Thread Safe (0) | 2023.06.26 |
---|---|
iOS 개발자 부트캠프 - SeSAC(청년취업사관학교) (0) | 2023.05.03 |
Architecture - Single Responsibility Principle(SRP) (2) | 2022.09.14 |
SwiftUI 에서 MVVM 을 멈춰야 하는가? (7) | 2022.08.10 |
Singleton Pattern vs Dependency Injection (0) | 2022.06.28 |