UML, 즉 통합 모델링 언어는 사물(Things), 관계(Relationships), 다이어그램(Diagrams)이라는 세 가지 핵심 요소로 구성됩니다. 이들은 마치 언어의 단어, 문법, 문장처럼 작용하여, 복잡한 소프트웨어 시스템의 구조와 동작을 명확하고 체계적으로 표현하는 기반을 이룹니다. 사물은 시스템을 구성하는 추상적인 개념 그 자체이며, 관계는 이 사물들 사이의 의미 있는 연결을 정의합니다. 그리고 다이어그램은 특정 목적에 맞게 사물과 관계를 조합하여 시스템의 한 단면을 시각적으로 보여주는 청사진입니다. 이 세 가지 구성요소의 조화를 통해 우리는 비로소 시스템에 대한 깊이 있는 분석과 설계를 수행할 수 있습니다.
UML의 기본 단위, 사물 (Things)
사물(Things)은 UML 모델을 구성하는 가장 기본적인 요소로, 시스템의 개념을 나타내는 명사(Nouns)와 같습니다. 이는 눈에 보이는 물리적 객체일 수도 있고, 추상적인 개념일 수도 있습니다. 사물은 그 역할에 따라 크게 네 가지로 분류됩니다.
구조 사물 (Structural Things)
구조 사물은 모델의 정적인 부분, 즉 시스템의 뼈대를 이루는 요소들입니다. 시간에 따라 변하지 않는 시스템의 구조, 개념, 물리적 요소를 표현합니다. 대표적으로 클래스(Class)는 객체를 생성하기 위한 설계도이며, 인터페이스(Interface)는 객체가 외부에 제공하는 기능의 명세입니다. 유스케이스(Use Case)는 사용자의 관점에서 시스템이 제공하는 기능 단위를, 컴포넌트(Component)는 시스템을 구성하는 독립적인 소프트웨어 모듈을, 노드(Node)는 소프트웨어가 실행되는 물리적인 하드웨어 장치를 의미합니다.
행동 사물 (Behavioral Things)
행동 사물은 모델의 동적인 부분, 즉 시스템의 행위를 나타내는 동사(Verbs)와 같습니다. 시간에 따라 변화하는 시스템의 동작을 표현합니다. 대표적으로 상호작용(Interaction)은 특정 기능을 수행하기 위해 객체 간에 주고받는 메시지의 흐름을 의미하며, 상태 머신(State Machine)은 하나의 객체가 생성되어 소멸될 때까지 겪게 되는 상태의 변화 과정을 나타냅니다.
그룹 사물 (Grouping Things)
그룹 사물은 UML의 여러 구성 요소를 담는 상자 역할을 하여 모델을 체계적으로 구성하고 관리하는 데 사용됩니다. 가장 대표적인 그룹 사물은 패키지(Package)로, 관련된 클래스나 유스케이스 등을 하나의 폴더처럼 묶어 모델의 복잡도를 낮추고 이해도를 높이는 역할을 합니다.
주해 사물 (Annotational Things)
주해 사물은 모델의 다른 요소들을 부가적으로 설명하거나 주석을 다는 데 사용됩니다. 마치 코드의 주석처럼, 다이어그램에 추가적인 정보를 제공하여 다른 사람의 이해를 돕는 역할을 합니다. 대표적인 주해 사물로는 노트(Note)가 있으며, 다이어그램의 특정 요소에 점선으로 연결하여 설명을 덧붙이는 형태로 사용됩니다.
사물을 연결하는 힘, 관계 (Relationships)
관계(Relationships)는 사물과 사물 사이의 의미 있는 연결을 표현하는 문법과 같은 역할을 합니다. 이 관계를 통해 각 사물이 어떻게 상호작용하고 서로에게 영향을 미치는지를 정의할 수 있습니다. UML에서는 주로 다음과 같은 관계들을 사용합니다.
연관 관계 (Association)
연관 관계는 클래스들 사이에 존재하는 일반적인 구조적 연결을 의미합니다. 한 클래스의 객체가 다른 클래스의 객체를 사용하는 ‘has-a’ 또는 ‘uses-a’ 관계를 나타내며 실선으로 표현합니다. 예를 들어, ‘고객’ 클래스와 ‘주소’ 클래스는 ‘고객이 주소를 가진다’는 연관 관계를 맺을 수 있습니다.
집합 관계 (Aggregation)
집합 관계는 전체와 부분의 관계(whole-part)를 나타내는 특수한 연관 관계입니다. 하지만 부분이 전체에 종속되지 않고 독립적인 생명주기를 가집니다. 예를 들어, ‘컴퓨터’와 ‘주변기기’의 관계에서 컴퓨터가 없어져도 마우스나 키보드는 독립적으로 존재할 수 있습니다. 전체 쪽에 속이 빈 다이아몬드(◇)로 표현합니다.
복합 관계 (Composition)
복합 관계는 집합 관계보다 더 강한 전체-부분 관계를 의미합니다. 부분이 전체에 완전히 종속되어, 전체가 사라지면 부분도 함께 사라지는 생명주기를 공유합니다. 예를 들어, ‘건물’과 ‘방’의 관계에서 건물이 철거되면 방도 함께 사라집니다. 전체 쪽에 속이 채워진 다이아몬드(◆)로 표현합니다.
일반화 관계 (Generalization)
일반화 관계는 ‘is-a-kind-of’ 관계, 즉 객체 지향의 상속 관계를 나타냅니다. 더 일반적인 개념인 상위 클래스(부모)와 더 구체적인 개념인 하위 클래스(자식) 간의 관계를 표현합니다. 예를 들어, ‘자동차’와 ‘트럭’은 모두 ‘탈 것’이라는 상위 클래스로부터 상속받는 일반화 관계에 있습니다. 자식에서 부모 쪽으로 속이 빈 화살표(△)를 사용하여 표현합니다.
의존 관계 (Dependency)
의존 관계는 한 사물의 명세가 변경될 때 다른 사물이 영향을 받는, 비교적 짧은 기간 동안 유지되는 관계를 의미합니다. 예를 들어, 특정 함수가 매개변수로 다른 클래스의 객체를 잠시 사용하는 경우가 이에 해당합니다. 영향을 받는 쪽에서 주는 쪽으로 점선 화살표( пунктирная линия с стрелкой)를 사용하여 표현합니다.
실체화 관계 (Realization)
실체화 관계는 명세와 그것을 구현한 것 사이의 관계를 나타냅니다. 주로 인터페이스와 그 인터페이스를 실제 기능으로 구현한 클래스 사이의 관계를 표현할 때 사용됩니다. 구현하는 클래스에서 인터페이스 쪽으로 속이 빈 삼각형과 점선(점선 삼각형)을 사용하여 표현합니다.
관점의 시각화, 다이어그램 (Diagrams)
다이어그램(Diagrams)은 앞서 설명한 사물과 관계들을 조합하여, 특정 목적과 관점에 따라 시스템의 한 단면을 시각적으로 표현한 결과물입니다. UML에는 다양한 종류의 다이어그램이 있으며, 이들은 크게 구조 다이어그램과 행위 다이어그램으로 나뉩니다.
구조 다이어그램 (Structural Diagrams)
구조 다이어그램은 시스템의 정적인 구조, 즉 시스템을 구성하는 요소들과 그들 간의 관계를 보여줍니다. 시스템이 무엇으로 이루어져 있는가(What)에 초점을 맞춥니다.
- 클래스 다이어그램 (Class Diagram): 시스템의 클래스, 속성, 메서드 및 클래스 간의 정적 관계를 표현하는 가장 대표적인 구조 다이어그램입니다.
- 객체 다이어그램 (Object Diagram): 특정 시점의 객체 인스턴스와 그들 간의 관계를 보여줍니다.
- 컴포넌트 다이어그램 (Component Diagram): 시스템을 구성하는 물리적인 소프트웨어 컴포넌트들의 구조와 의존성을 보여줍니다.
- 배치 다이어그램 (Deployment Diagram): 소프트웨어가 어떤 물리적인 하드웨어 노드에 배치되는지를 보여줍니다.
행위 다이어그램 (Behavioral Diagrams)
행위 다이어그램은 시스템의 동적인 행위, 즉 시스템의 요소들이 시간의 흐름에 따라 어떻게 동작하고 상호작용하는지를 보여줍니다. 시스템이 무엇을 하는가(Do)에 초점을 맞춥니다.
- 유스케이스 다이어그램 (Use Case Diagram): 사용자(Actor)의 관점에서 시스템이 제공하는 기능과 그들 간의 관계를 보여줍니다.
- 시퀀스 다이어그램 (Sequence Diagram): 특정 유스케이스를 수행할 때 객체들이 주고받는 메시지를 시간 순서에 따라 표현합니다.
- 활동 다이어그램 (Activity Diagram): 업무나 로직의 처리 흐름을 순서도처럼 표현합니다.
- 상태 머신 다이어그램 (State Machine Diagram): 하나의 객체가 특정 이벤트에 따라 상태가 어떻게 변하는지를 보여줍니다.
결론: 사물, 관계, 다이어그램의 조합으로 시스템을 창조하다
UML의 세계는 사물이라는 기본 블록을 관계라는 접착제로 연결하여, 다이어그램이라는 의미 있는 구조물을 만들어내는 과정과 같습니다. 이 세 가지 핵심 구성요소를 이해하는 것은 UML이라는 강력한 언어의 문법을 익히는 것과 같습니다. 어떤 사물을 선택하고, 그들 사이에 어떤 관계를 설정하며, 어떤 다이어그램으로 표현할지를 결정하는 능력이 바로 성공적인 모델링의 핵심입니다. 소프트웨어 개발에 참여하는 모든 전문가는 이 기본 구성요소들을 능숙하게 다룸으로써, 복잡한 아이디어를 명확한 청사진으로 바꾸고, 성공적인 시스템을 창조하는 기반을 다질 수 있습니다