Unified Modeling Language version 2.0

모델 중심 개발

Bran Selic, Distinguished Engineer, IBM

소위 말하는 "모델 중심" 개발(MDD, model-driven development)은 고급 추상화와 자동화 방식에 기반 하여, 소프트웨어의 품질과 개발 생산성을 높인다. 모델링 언어의 역할은 MDD의 성공에 중요한 영향을 미치기 때문에 Unified Modeling Language (UML)도 최근 개정되었다. 중요한 새로운 모델링 기능들이 많이 추가되었지만 이번 개정판의 큰 특징은 보다 수준 높은 자동화를 실행할 수 있는 정확한 언어 정의라 할 수 있다. 이 글에서 UML 2.0의 특징들을 설명한다.

머리말

1990년대 초반에는 객체 패러다임과 관련 기술들이 큰 주목을 받았다 이 패러다임에 기반한 새로운 프로그래밍 언어들(Smalltalk, Eiffel, C++, Java)이 고안 및 채택되었다. 이런 과정에서 객체 지향(OO) 소프트웨어 디자인 방식과 모델링 표기법이 과잉으로 공급되었다. 따라서 OO 분석 및 디자인 방식을 다룬 개론서(800 페이지)에서 Graham은 50 개의 발달 가능성이 있는 방식을 추려냈다. [Graham01]

객체 패러다임이 비교적 작은 개념들(캡슐화, 상속, 다형성)로 구성된다면 수 많은 중복과 개념상의 재정비에 불과하다. 그리고 대부분이 표기법과 중요하지 않는 차이들로 인해 모호해졌다. 이것은 많은 혼란을 낳았고 쓸데없는 시장 분리를 만들었다. 결국 새롭고 유용한 패러다임을 만들어야 하는 지경에 이르렀다. 소프트웨어 개발자들은 호환되지 않는 언어, 툴, 방식, 벤더들 사이에서 선택의 어려움을 겪어야만 했다. 이러한 이유 때문에, Rational 소프트웨어가 Grady Booch, Ivar Jacobson, Jim Rumbaugh가 중심이 된 Unified Modeling Language (UML) 이니셔티브를 제안했을 때 반응은 즉각적이고 호의적이었다. 새로운 것을 제안하려고 했던 것은 아니었지만 산업계의 선각자들의 공동 노력을 통해, 최고의 기능을 가진 여러 OO 방식들을 하나의 벤더 독립적인 모델링 언어와 표기법으로 탄생시켰다. 이 때문에 UML은 빠르게 표준으로 자리잡았다. 1996년에 Object Management Group이 이를 채택한 후에 산업 표준 [OMG03a] [OMG04] [RJB05]이 되었다.

이후, UML은

  • 대부분의 모델링 툴 벤더들에 의해 채택 및 지원되었다.
  • 전 세계 대학들과 전문 연구 프로그램 분야에서 컴퓨터 공학 및 엔지니어링 커리큘럼으로 자리잡았다.
  • 학계와 연구소에서 편리한 공통 언어로 사용되고 있다.

UML은 복잡한 소프트웨어를 다룰 때 모델링의 가치를 일깨워주었다. 이렇게 유용한 기술은 소프트웨어 역사 만큼 오래되었음에도, 대부분의 개발자들은 그저 유용한 모니터 툴로서 인식하고 있다. 여전히 이러한 태도들이 지배적이다. 바로 이것이 모델 중심의 방식들이 커뮤니티에서 상당한 저항에 부딪치는 이유이기도 하다.

이렇게 된 데에는 그럴듯한 이유들이 있다. (혁신적인 것이라면 불신하고 보는 인간 본성 같은 터무니 없는 이유도 물론 있다.) 가장 큰 이유는 소프트웨어 모델이 심각할 정도로 정확하지 않다는 점이다. 모델의 실제 가치는 정확성에 비례한다. 모델이 소프트웨어 시스템에 대해 진실을 보여주고 있다는 신뢰를 얻지 못하면 쓸모가 없다. 잘못된 결론을 낼 수 있기 때문이다. 소프트웨어 모델의 가치를 높일 수 있는 핵심은 모델과 시스템들간 차이를 좁히는 것이다. 이상하게 들릴지도 모르겠지만 소프트웨어 분야에서 이를 실현하기는 쉽다.

몇몇 정확하지 않은 소프트웨어 모델링은 현재 프로그래밍 언어들이 지나치게 자세하고 민감하기 때문이기도 하다. 잘못 정렬된 포인터 또는 초기화 되지 않은 변수들 같은 작은 과실과 쉽게 분간할 수 있는 코드 오류가 엄청난 결과를 가져올 수 있다. 예를 들어, 중첩 switch 구문에서 한 개의 브레이크 소실로 인해 미국의 많은 부분을 담당하고 있는 장거리 전화 서비스에 오류가 생기고 이로 인해 거대한 경제적 손실을 일으킬 수 있는 것이다. [Lee92]. 그와 같은 미미한 세부 사항들이 그와 같은 엄청난 결과를 일으켰다면 어떻게 우리가 모델링이 정확하다고 믿을 수 있겠는가?




위로


모델 중심 개발

이 같은 문제에 대한 솔루션은 한 개 이상의 자동화된 모델 변형을 통해 해당 소프트웨어 구현에 모델을 연결시키는 것이다. 아마도 이것에 대한 가장 성공적인 예가 컴파일러일 것이다. 컴파일러는 고급 언어 프로그램을 머신 언어 구현으로 바꾼다. 이 경우, 모델은 고급 언어 프로그램이고, 모든 유용한 모델들이 그러하듯, 별 관련이 없는 기저의 컴퓨팅 특성들(내부 단어 크기, 누산기와 인덱스 레지스터의 개수, ALU의 유형 등)은 숨긴다.

몇 가지 다른 엔지니어링 미디어가 모델과 해당 엔지니어링 객체간 강결합을 제공한다는 점이 흥미롭다. 여러분이 모델링하고 있는 객체는 하드웨어가 아닌 소프트웨어이기 때문이다. 물리적 객체(예를 들어, 자동차, 빌딩, 다리)의 모델에는 해당 모델의 물리적 특성들을 추상화 하는 비공식 단계들이 포함된다. 이와 비슷하게 물리적 객체들을 사용하여 추상 모델을 구현할 때, 추상 모델을 구체 모델로 비공식으로 변형한다. . 이러한 비공식 단계 때문에 앞서 언급한 부정확성 문제가 발생하는 것이다. 하지만 공식적으로도 수행될 수 있다.

추상화자동화의 강력한 결합으로 새로운 모델링 기술과 이에 상응하는 개발 방식들(모델 중심 개발 (MDD) [Brown04] [Booch04])을 탄생시켰다. MDD의 대표적인 특징은 모델들이 소프트웨어 디자인의 주요 객체들이 되면서 해당 프로그램 코드로의 초점을 분산시켰다는 점이다. 이들은 다양한 자동화/반자동화 프로세스들이 프로그램들과 관련 모델들을 유추할 수 있는 청사진으로서 작용한다. 오늘날 MDD에서 사용되는 자동화 정도는 간단한 뼈대 코드를 유추하는 것부터 완전한 자동 코드를 생성하는 것 까지 다양하다. 분명한 것은 자동화 레벨이 높아질수록 모델은 더욱 정확해지고 MDD의 효용도 높아진다.

모델 중심 방식으로 소프트웨어를 개발하는 것은 전혀 새로운 것이 아니며 과거에도 사용되었다. 지금 이렇게 주목을 받고 있는 이유는 지원 기술이 성숙해졌기 때문이다. 이전보다 더 많이 자동화 되었다. 효율성 뿐만 아니라 확장성, 그리고 레거시 툴과 메소드와 통합되는 툴 기능까지 있다. 기술이 성숙하면서 MDD 표준이 만들어지게 되었다. 이들 표준들 중 하나가 바로 개정된 버전의 Unified Modeling Language이다.




위로


UML 1 개정의 이유

UML2.0은 UML 표준의 첫 번째 중요 개정이다. 이것 외에도 몇 가지 중요하지 않은 개정들 [OMG04] [RJB05]이 있다. 왜 UML을 개정해야 했을까?

가장 중요한 동기는 MDD 툴과 메소드를 보다 잘 지원하기 위해서이다. 과거 10년 동안, 많은 벤더들이 전통적인 CASE(computer-aided software engineering) 툴 보다 한층 더 수준 높은 자동화를 지원하는 UML 기반의 툴을 개발했다.

수준 높은 자동화를 지원하기 위해서는 원래 표준보다 더 정확한 방식으로 UML을 정의해야 했다. (원래의 UML 표준은 디자인의 비공식 캡쳐와 통신을 위한 보조 툴로서 기획되었다.) 불행히도 이러한 정의는 벤더마다 다양하여 원래 표준이 제거하려고 했던 부분을 따라야 하는 이상한 경우가 생겼다. 새로운 버전은 이러한 점을 수정한 것이다.

10년 동안 중요한 새로운 기술들(웹 기반 애플리케이션과 서비스 지향 아키텍쳐)이 생겨났고 새로운 모델링 기능들이 정의되었다. 이 모든 것들은 실제로 기존의 UML 개념들을 적절히 조합하여 정의된 것이다.

그동안 산업은 모델링 언어의 사용, 구조화, 정의하는 적절한 방식을 많이 터득했다. 이제는 메타 모델링과 모델 변형에 대한 이론이 부상하고 있고, 모델링 언어가 정의되는 방식도 요구하는 추세이다. 현재의 프로그래밍 언어 디자인의 이론에 견줄만한 모델링 언어 디자인의 체계적인 이론이 부족하지만 UML에 통합되어 생명력을 늘릴 수 있다.




위로


UML 2.0 기능

새로운 UML 2.0의 특징은 다음과 같이 다섯 개의 주요 범주로 설명할 수 있겠다. 중요한 것부터 설명하겠다.

  • 매우 정확해진 언어 정의: 이렇게 정확해진 데에는 MDD에 필요한 고급 자동화를 지원해야 하기 때문이다. 자동화에는 모델의 모호함과 부정확성을 없애고 컴퓨터 프로그램이 모델을 변형 및 조작할 수 있도록 했다.
  • 향상된 언어 구조: 새로운 사용자가 언어에 보다 쉽게 접근할 수 있고 툴들 간 내부 작동을 활성화 할 수 있는 모듈식이다.
  • 규모가 큰 소프트웨어 시스템의 모델링 향상: 현대식의 소프트웨어 애플리케이션은 기존 스탠드얼론 애플리케이션들과 복잡한 시스템들이 통합된 것이다. 시스템은 더욱더 복잡해지고 있는 추세이다. 이를 지원하기 위해 유연한 새로운 계층 기능이 언어에 추가되어 소프트웨어 모델링을 지원한다.
  • 도메인 스팩의 특성화 지원 향상: UML을 실제로 사용하면 소위 말하는 " 확장" 메커니즘의 가치를 느낄 수 있다. 기본적인 언어가 보다 정확하고 단순해지도록 정리되었다.
  • 다양한 모델링 개념들의 정리, 개념화, 정의: 보다 단순하고 일관성 있는 언어가 되었다. 중복된 개념을 제거하고, 많은 정의들을 정리하고, 텍스트 정의와 예제를 추가했다.

이제 부터는 보다 자세히 설명하도록 하겠다.

정확도

대부분의 초기 소프트웨어 모델링 언어는 비공식적으로 정의되었다. 정확도에 대한 관심도 별로 없었다. 대게, 모델링 개념들은 정확하지 않은 자연 언어로 설명되었다. 그 당시에는 이것으로 충분했다. 대부분의 모델링 언어들이 문서화나 디자인 스케치[Fowler04]에 사용되었다. 기본 개념은 디자인의 핵심 속성들을 전달하는 것이다. 상세한 부분은 구현 시에 다루어지도록 했다.

바로 이것이 혼란의 원인이다. 그와 같은 언어로 표현된 모델들을 사람들마다 다르게 해석하기 때문이다. 더욱이 모델 해석에 대한 의문점이 명료하게 다루어지지 않으면 차이점을 끝내 발견하지 못하다가 결국 개발의 마지막 단계에서나 발견되곤 했다. (그 문제를 픽스하는 비용이 더 크다.)

이러한 모호함을 줄이기 위해 UML 첫 표준 정의가 메타모델(metamodel)을 사용하여 정의되었다. 메타모델은 각 UML 모델링 개념의 특징과, 다른 모델링 개념들과의 관계를 정의하는 모델이다. 이 메타모델은 UML의 한 요소를 사용하여 정의되었고 Object Constraint Language (OCL)로 작성된 정식 제약으로 보완되었다.

: UML 클래스 다이어그램에서 정의된 개념들로 구성된 UML의 하위 세트를 Meta-Object Facility (MOF)라고 한다. 이 하위세트는 다른 모델링 언어를 정의하는데도 사용된다.

이렇게 조합하여 UML의 추상 신택스에 대한 공식 스팩을 선보였다. 이것은 실제 표기법이나 구체적 신택스 (텍스트와 그래픽)와 무관하기 때문에 모델을 표현하는데 사용되었다. 다시 말해서 이것은 해당 모델이 잘 구성되었는지 여부를 결정할 때 사용할 수 있는 규칙 세트를 정의한 것이다. 예를 들어, 그와 같은 규칙들을 사용하여 우리가 두 개의 UML 클래스들을 상태 머신 이동에 의해 연결하는 것이 옳지 않다는 것을 결정할 수 있는 것이다.

하지만 초기 UML 메타모델에 사용된 정확도로는 MDD를 완전히 지원할 수 없었다. ([Stevens02]). 특히 UML 모델링 개념의 의미론(또는 의미)에 대한 스팩은 자동 코드 생성 또는 확인 같은 MDD 지향 작동에는 부적합했다.

결과적으로 UML 2.0에서 정확도는 매우 증가했다.

  • 메타모델 인프라의 리팩토링: UML 2.0의 인프라는 소프트웨어 애플리케이션의 모델링에 직접 사용하기에는 다소 부족하고 추상적인 저급의 모델링 개념과 패턴들로 구성된다. 하지만 이렇게 단순하기 때문에 의미와 규칙을 명확히 표현하는 것이 더 쉬워졌다. 이렇게 잘 정리된 개념들은 다양한 방식들로 조합되어 보다 복잡한 사용자 레벨의 모델링 개념들을 만들어낸다. 예를 들어, UML1에서 소유권(ownership) (다른 엘리먼트를 소유한 엘리먼트), 네임스페이스 (고유의 이름을 가진 엘리먼트의 네임드 컬렉션), 클래스파이어(기능에 따라 나뉠 수 있는 엘리먼트) 등 이들 모두 하나의 의미론적 복합 개념으로 묶이게 되었다. 새로운 UML 2.0 인프라에는 이들 개념이 분리되었고 신택스와 의미도 개별적으로 정의된다.
  • 확장되고 보다 정확해진 의미 설명: UML 1 모델링 개념에서 의미론의 정의는 문제가 많았다. 디스크립션 레벨은 일관성이 없었고 확장 디스크립션과 상세 디스크립션이 있는 몇 가지 영역(상태 머신)이 있었지만 다른 것에는 어떤 설명도 없었다. UML 2.0 스팩은 의미를 강조하였다. 특히 기본적인 작동 원동력의 핵심 분야의 의미에 더욱 신경을 썼다. (참고자료)
  • 분명하게 정의된 역할 의미: UML 2.0 스팩은 원 버전의 심각한 의미 차이를 명확히 했다. 그 프레임웍은 그림 1에 묘사되어 있고 아래 참고자료 섹션에도 설명되어 있다. [Selic04]. 특히 이 프레임웍에서는 다음과 같은 이슈들이 분명히 다루어졌다.
    • 런타임 시 링크와 인스턴스의 구조적 의미
    • 구조와 작동의 관계
    • 현재 UML의 모든 고급 작동 형식에서 공유되고 있는 의미의 기초 또는 일상성 모델(스테이트 머신, 액티비티, 인터랙션)과 잠재적인 미래 모델. 또한 다양한 형식을 사용하여 표현되는 객체의 작동은 서로 인터랙팅 하는지를 확인한다.

그림 1. UML 2.0 의미 구조
The UML 2.0 semantics framework

새로운 언어 아키텍쳐

UML 2.0이 정확성이 향상되면서 언어 정의도 더 커졌다. 심지어 새로운 모델링 기능에 대한 설명도 없는 경우도 생겼다. 원래 UML이 너무나 ‘풍부’했기 때문에 비평을 받았다는 사실을 생각해보면 걱정스럽지 않을 수 없다. (다시 말해서, 배우고 사용하기에는 너무 ‘둔중’했다.)

일반적으로 UML이 오늘날의 소프트웨어 문제들 중 가장 복잡한 요소를 다루려고 했고 이 같은 문제들은 강력한 툴을 사용해서 해결해야 한다는 사실을 무시했기 때문에 그러한 비평이 생긴 것이다. (자동차와 전자기술 같은 성공적인 기술은 결코 단순해지지 않는다. 머신에 끊임없이 요구하는 것이 인간 본성이다. 결국 보다 강력한 툴들이 생기기 마련이다. 어떤 누구도 기본적인 소도구만으로 마천루를 지을 수 있다고 생각하지 않는다.)

언어의 복잡성 문제를 다루기 위해 UML 2.0은 언어 모듈을 선택적으로 사용할 수 있는 방식으로 구성했다. 일반적인 구조는 그림 2에 나와있다. 이것은 공유 개념들(클래스와 관련 개념)로 이루어진 기초로 구성된다. 그 위에는 하위 언어 또는 언어 단위의 모음들이 수직적으로 구성되어 있다. 이들 각각은 특정 형태나 양상을 모델링 하는데 알맞다. (표 1). 이러한 언어 단위들은 일반적으로 독립적이며 따라서 독립적으로 사용할 수 있다. (이것은 UML 1의 경우가 아니다. 액티비티 형식주의는 상태 머신의 형식주의에 전적으로 기반하고 있다.)


그림 2. UML 2.0의 언어 구조
The language architecture of UML 2.0

더욱이 수직적 언어 단위들은 최대 세 가지 레벨들로 구성된다. 이 레벨들은 아래 레벨에서 사용했던 것에 더 많은 모델링 기능을 추가한다. 주어진 언어 단위 내에서 특정 하위세트만 사용할 수 있다.

이 아키텍쳐는 여러분에게 가장 잘 맞는 UML의 하위세트만 배우고 사용할 수 있다는 것을 함축하고 있다. 영어를 잘 구사하기 위해 영어에 대한 모든 것을 알아야 할 필요가 없듯, UML을 효과적으로 사용하기 위해 UML의 전체 범위를 알 필요는 없는 것이다. 좀더 능숙해지면 필요한 모델링 개념들만 도입할 수 있다.

표 1. UML 2.0의 언어 단위

언어 단위 목적
Actions정의가 잘된 액션들의 (기본) 모델링
Activities데이터와 제어 흐름 작동 모델링
Classes기본 구조들의 (기본) 모델링
Components컴포넌트 기술을 위한 복잡한 구조 모델링
Deployments전개 모델링
General Behaviors일반적인 동작 의미 기초와 시간 모델링 (기본)
Information Flows추상 데이터 흐름 모델링
Interactions객체간 동작 모델링
Models모델 구조
Profiles언어 커스터마이징
State Machines이벤트 중심의 동작 모델링
Structures복잡한 구조 모델링
Templates패턴 모델링
Use Cases비공식적인 동작 요구사항 모델링

호환성의 정의와 구조도 UML 2.0에서 매우 단순해졌다. UML 1에서 호환성의 기본 단위들은 메타모델의 패키지에 의해 정의되었다. 말 그대로 수 백 개의 조합이 가능했다. (사실, UML 1이 호환 대상에 불완전한 호환 개념을 정했기 때문에 벤더들은 아무 조합에나 호환성을 주장할 수 있었다.) 따라서 모델들을 교환할 수 있는 두 개 이상의 모델링 툴들을 찾기 힘든 것이다.

UML 2.0에서, 단 세 개의 호환성 레벨만 정의된다 그리고 계층적 언어 단위 레벨에 순응하는 것은 0으로 표시되었다. 레벨(n)의 모델이 더 높은 레벨(n+1)에 있는 모델들에도 호환되도록 정의되었다. 다시 말해서, 주어진 레벨과 호환되는 툴은 각 레벨에 순응하는 툴에서도 모델들을 반입할 수 있다. 이때 손실되는 정보도 없다.

: UML 2는 4 번째 레벨(Level 0)도 정의한다. 하지만 이것은 툴 구현자들이 주로 사용하는 내부 레벨이다.

네 가지 유형의 호환성이 정의되어 있다.

  • 추상 신택스 호환
  • 구체적 신택스(UML 표기법) 호환
  • 추상/구체적 신택스 호환성
  • 추상/구체적 신택스에 대한 호환과 다이어그램 교환 표준[OMG03b]에 대한 호환

최대 12 개의 다른 호환성 조합이 이들 간 확실한 종속관계와 함께 명시되었다. (예를 들어, 추상/구체적 신택스 호환은 구체적 신택스 호환에만 순응하거나 추상 신택스 호환에만 순응한다.) 결과적으로 UML 2.0에서 다중 벤더들이 제공하는 호환 툴들 간 모델 교환이 더욱 확실해 진 것이다.

대규모 시스템 모델링 기능

UML 2.0에 추가된 기능들은 비교적 적은 편이다. 이게 다 불명예스러운 제 2의 시스템 효과[Brooks95]를 피하기 위해서 이다. 다양한 사용자 커뮤니티가 요구하는 과도한 새로운 기능들 때문에 언어는 부풀려진다. 사실 대부분의 새로운 모델링 기능들은 기존 기능들의 단순한 확장일 뿐이고, 이것은 대규모의 소프트웨어 시스템을 모델링 하는데 사용할 수 있다.

더욱이 확장은 똑 같은 기본 방식을 사용하여 이루어진다. 같은 개념을 각기 다른 추상화 레벨에 반복적으로 적용하면 된다. 다시 말해서, 해당 유형의 모델 엘리먼트들을 조합하여 단위로 만들고 다음 추상화 레벨에서 같은 방식으로 조합되도록 할 수 있다. 이것은 프로그래밍 언어의 프로시저가 다른 프로시저 안에서 중첩되는 방식과 비슷하다.

다음 모델링 기능들은 위에 설명한 방식으로 확장되었다.

  • 복잡한 구조(Complex structures)
  • 액티비티(Activities)
  • 인터랙션(Interactions)
  • 상태 머신(State machines)

위 세가지 요소는 UML 2.0에서 거의 90% 이상을 차지하고 있다.

복잡한 구조(Complex structures)

이 기능 세트는 UML-RT [SR98], Acme [GMW97], SDL [ITU02] 같은 다양한 아키텍쳐 디스크립션 언어들에 기반하고 있다. 그래프로 개념을 나타내는 특징이 있다. 한 개 이상의 포트(port)를 갖고 있는 파트(part)라고 하는 기본 구조적 노드들은 커넥터(connector)라고 하는 통신 채널을 통해 서로 연결된다. (그림 3) 이러한 집합체들은 자신의 포트를 갖고 있는 더 높은 레벨 안에서 캡슐화 되어 다른 상위 레벨에 조합될 수 있다.


그림 3. 복잡한 구조 모델링 개념
Complex structure modeling concepts

이 개념들은 협업에 대한 UML 1 정의에서도 이미 있었다. 단 반복적으로 적용되지 않는 점만 다르다. 반복을 적용하기 위해서는 협업 구조가 클래스 스팩 내에 중첩되어야 한다. 다시 말해서, 그 클래스의 모든 인스턴스들이 클래스 정의로 지정된 내부 구조를 갖고 있어야 한다. 예를 들어, 그림 3에서 /a:A 파트와 /b:B 는 파트 /c:C 내에서 중첩된다. 이것은 합성 구조 클래스 C의 인스턴스를 나타낸다. 이 클래스의 다른 인스턴스들도 같은 구조적 패턴을 갖고 있다. (모두 포트, 파트, 상호연결 등의 개념을 갖고 있다.)

이 세 가지 기본 개념을 반복적으로 적용하는 것으로 임의의 복잡한 소프트웨어 아키텍쳐를 모델링 할 수 있다.

액티비티(Activities)

UML의 액티비티들은 다양한 종류의 흐름들을 모델링하는데 사용된다. 신호(signal)나 데이터(data) 흐름 뿐만 아니라, 알고리즘 (algorithmic) 흐름 또는 절차적(procedural) 흐름을 모델링 한다. 그와 같은 흐름 기반의 디스크립션에 의해 자연스럽게 렌더링 되는 수 많은 도메인과 애플리케이션들이 있음은 당연한 것이다. 특히 이러한 형식은 비즈니스-프로세스 모델러 뿐만 아니라 시스템 엔지니어들도 채택하고 있다. 불행히도 UML 1 버전의 액티비티 모델링의 경우, 흐름 유형에 제한이 많이 있었다. 액티비티가 기본 상태 머신 형식의 상단에 놓이게 되어서 상태 머신의 의미를 제약하기 때문이다.

UML 2.0은 상태 머신 기초를 훨씬 더 일반적인 의미로 바꾸어 그 모든 제한사항을 없앴다. (사실 의미 기초는 변형된 Petri nets [pet]로 나타난다.) 게다가 수 많은 산업 표준의 비즈니스 프로세싱 형식(주로 BPEL4WS [BPEL03]) 때문에 새로운 고급 모델링 기능들이 기본 형식에 많이 추가되었다. 기능은 다음과 같다.

  • 인터럽트 액티비티 흐름
  • 세련된 동시 제어 형식
  • 다양한 버퍼링 스키마

결과적으로 광범위한 흐름 유형을 나타낼 수 있는 풍부한 모델링 툴셋이 탄생했다.

복잡한 구조와 마찬가지로 액티비티들과 액티비티의 상호 연결 흐름을 반복적으로 그룹핑하여 뚜렷하게 정의된 인풋과 아웃풋을 가진 고급 액티비티로 나타낼 수 있다. 다른 액티비티들과 이들을 결합하여 보다 복잡한 액티비티를 구성할 수도 있다.

인터랙션(Interactions)

UML 1의 인터랙션은 협업 다이어그램 상의 순차적인 메시지 주석으로 나타나거나 개별 시퀀스 다이어그램으로 표현되었다. 안타깝게도 이 두 가지 기본적인 기능들에는 다음 사항들이 빠져있다.

  1. 보다 확장된(고급 레벨의) 시퀀스에서 반복될 수 있는 재사용 시퀀스 기능. 예를 들어 패스워드를 확인하는 시퀀스는 애플리케이션의 여러 컨텍스트에서 나타날 수 있다. 그와 같은 반복 시퀀스를 개별 단위들로 패키징하는 기능이 없으면 여러 번 이들을 정의해야 한다. 이는 오버헤드 문제 뿐만 아니라 모델 관리가 복잡해진다는 문제가 있다.
  2. 복잡한 시스템의 인터랙션을 표현하는 다양한 복잡한 제어 흐름의 모델링 기능 여기에는 반복적인 연속 발생, 대안 실행 경로, 동시성, 순서와 무관한 실행 등이 포함되어 있다.

다행히도 복잡한 인터랙션을 지정하는 기능은 통신 도메인에서도 연구되고 있다. 통신 프로토콜[ITU04]을 정의했던 수년 간의 경험을 바탕으로 이 분야에서 표준이 진화하고 있다. 이 표준은 UML 2.0에서 인터랙션을 표현하는 기초로서 사용되었다.

무엇보다도 개별적인 네임드 모델링 단위로서 인터랙션을 도입했다는 점이 혁신적이다. 이 같은 인터랙션은 복잡한 객체간 통신 시퀀스를 나타낸다. 심지어 매개변수화되어서 컨텍스트와 관계 없는 인터랙션 패턴 스팩도 적용될 수 있다.

매크로 호출과 비슷한 상위 인터랙션 내에서 이러한 인터랙션 패키지들을 반복적으로 호출 할 수 있다. (그림 4) 이들을 임의 단계로 중첩 시킬 수 있다. 더욱이 인터랙션들은 루프(여러 번 반복되어야 하는 인터랙션)같이 복잡한 제어 구조체에서 피연산함수 역할을 한다. UML 2.0은 이러한 유형의 편리한 모델링 구조체들을 많이 정의하고 있다. 각 레벨에서 복잡한 엔드투엔드 작동을 모델링 하는데 사용할 수 있다.


그림 4. 복잡한 인터랙션 모델
An example of a complex interaction model

그림 4는 확장된 인터랙션 모델을 묘사하고 있다. 이 경우, ATMAccess 인터랙션은 CheckPIN 이라고 하는 저수준 트랜잭션을 처음으로 호출한다. 나중에 발생하는 인터랙션은 매개변수를 갖고 있다. (이 경우, 무효 PIN이 트랜잭션이 취소되기 전에 입력될 수 있는 회수). 그 후, 클라이언트는 어떤 종류의 인터랙션이 필요한지, DispenseCash 인터랙션이나 PayBill 인터랙션중 어떤 것을 수행할지를 지정하는 비동기식 메시지를 보낸다.

UML 2.0의 인터랙션은 (위 예제 처럼) 시퀀스 다이어그램으로 표현될 수 있다. 또한 (UML 1에 정의된 협업 기반의 형태가 포함된) 다이어그램 유형으로도 그려진다. 심지어 그래픽이 없는 표로 그려질 수도 있다.

상태 머신(State machines)

UML 2.0의 상태 머신에 추가된 새로운 기능은 이전 경우와 비슷하다. 기본 개념은 혼합 상태를 완전히 모듈식으로 만들 수 있다. 변환 엔트리와 변환 종료점을 분명히 묘사된다. 따라서 재사용 가능한 개별적인 상태 머신 스팩에 의해 그 상태의 내부 분해를 정의할 수 있다. 다시 말해서, 같은 스팩이 상태 머신이나 다른 상태 머신 내의 여러 부분에서 재사용 될 수 있다. 여러 상황에서 공유된 작동 패턴의 스팩이 단순해진다.

그 외에도 클래스와 하위 클래스들간 상태 머신 상속에 대한 정의도 주목할 만 하다.

언어 부분의 기능들

UML 1에서는 UML의 가장 일반적인 사용법은 특정 문제나 도메인에 UML 프로파일을 정의하고, 일반 UML 대신에 프로파일을 사용할 것을 지시하고 있다. 프로파일은 일반적으로 domain specific languages(DSL)라고 알려진 것을 만드는 방식이다.

이 UML 프로파일에 대한 대안으로는 MOF 표준과 툴을 사용하는 새로운 커스텀 모델링 언어를 정의하는 것이 있다. 이 방식은 명확한 상태를 제공하며 문제에 대한 최적의 언어를 정의할 수 있는 장점이 있다. 언뜻 보기에 이것은 DSL에 좋은 방식이지만 보안상의 위험성이 있다.

머리말에서도 언급했듯이 너무나 많은 다양성 때문이 UML이 없애고자 했던 일종의 분파(fragmentation)가 생기고 말았다. 사실 바로 이러한 점이 광범위하고 빠르게 채택된 이유이기도 하다.

다행히도 프로파일 메커니즘은 실제로 많은 경우, 편리한 솔루션을 제공한다. 다양한 DSL 간 많은 공유점이 있기 때문이다. 어떤 객체 지향 모델링 언어도 클래스, 애트리뷰트, 연결, 인터랙션 등의 개념을 정의할 필요가 없다. 범용의 모델링 언어인 UML은 이 같이 편리하고 잘 정의된 개념들이 있다. 많은 DSL을 시작할 좋은 출발점이다.

하지만 여기에는 개념적인 재사용 그 이상이 있다. 정의에 따르면 UML 프로파일은 표준 UML과 호환이 되어야 한다. 다시 말해서, UML 프로파일은 도메인 스팩에 맞춰 해석을 하는 개념을 제한함으로서 표준 UML 개념들을 특화 할 수 있다. 예를 들어, 제한을 통해 다중 상속을 막거나, 클래스가 특정 유형의 애트리뷰트를 갖도록 한다.

  • 표준 UML을 지원하는 어떤 툴도 프로파일에 기반한 모델을 조작하는데 사용될 수 있다.
  • 표준 UML에 대한 어떤 지식도 직접 적용할 수 있다.

따라서 다양성에서 기인한 분파 문제들 대부분 해결될 수 있다. 통신 분야에서 광범위하게 사용되는 DSL인 SDL 언어[ITU02]를 담당하는 국제적인 표준 기구도 SDL을 UML profile [ITU00] [ITU03]로서 재정의하였다.

모든 DSL이 UML 프로파일로 실현되어야 한다는 것을 의미하지 않는다. 실제로 DSL 개념에 적용될 수 있는 필수적인 기본 개념들이 UML에는 부족하다. 하지만 UML이 일반화되면 더욱 광범위하게 적용될 것이다.

상황이 이렇기 때문에 UML 2.0의 프로파일링 메커니즘이 조정되었고 기능도 확장되었다. 일반 개념과 UML 개념들 간 개념적 연관관계도 정의되었다. 실제로 UML 2.0 표준은 기존 UML 메타클래스의 하위 클래스인 것처럼 정의된다. OCL 같은 언어를 사용하여 제한 사항을 작성하는 매커니즘은 완전히 정의되었다.

개별 모델링 개념을 제한하는 것 외에도, UML 20. 프로파일은 잘못되었거나 DSL에 필요하지 않은 UML 개념을 숨긴다.

마지막으로, UML 2.0 프로파일링 매커니즘은 여러 도메인 스팩에서 복잡한 UML 모델을 볼 수 있는 메커니즘으로 사용될 수 있다. 이중 어떤 것은 DSL로는 불가능하다. 어떤 프로파일이든 기저의 UML 모델에 영향을 주지 않고 적용 될 수 있고 또는 적용되지 않을 수도 있다. 예를 들어, 퍼포먼스 엔지니어는 모델을 통해 퍼포먼스 모델링을 분석하면서 다양한 퍼포먼스 관련 평가를 모델의 엘리먼트에 붙일 수 있다. 이것이 자동화된 퍼포먼스 분석 툴로 사용되어 기본적인 퍼포먼스 속성들을 결정할 수 있다. 동시에 퍼포먼스 모델러와는 독립적으로 신뢰성을 다루는 엔지니어가 신뢰성 스팩의 뷰를 관련 모델에 두고 전체 시스템의 신뢰성 문제를 결정할 수 있다.

기타

UML 2.0은 수 많은 영역을 다루고있다. 중복 개념들을 제거하고 많은 부분을 수정했다. (혼란스러운 설명 부분은 명확히 했고 용어와 스팩 포맷을 표준화했다.)

중복을 없애고 엉성하게 정의된 개념들을 정리했다는 점은 UML 2.0의 중요한 요소이다. 다음 세 가지 주요 영역에서 그러한 요구 사항들이 적용되었다.

  • 액션과 액티비티(Actions and activities)
  • 템플릿(Templates)
  • 컴포넌트 기반 디자인 개념(Component-based design concepts)

액션은 UML 1.5에 도입되었다. 액션의 개념적 모델은 데이터 흐름과 제어 흐름 컴퓨팅 모델을 모두 수용할 수 있도록 만들어졌다. 결국 액티비티 모델 개념과 매우 비슷해졌다. UML 2.0은 이러한 유사점을 사용하여 액션과 액티비티에 대한 일반적인 문법 및 의미 구조를 제공하고 있다. 다른 레벨들에서 모델링하기 때문에 여러분에게는 다른 추상화 레벨에서 발생하는 형식으로 보여진다. 전체적인 단순함과 명확성에 기여했다.

UML 1에서, 템플릿은 매우 일반적으로 정의되었다. 어떤 UML 개념이라도 템플릿으로 만들어질 수 있었다. 불행히도 일반성은 이러한 애플리케이션에게는 장애가 된다. 왜냐하면 의미 없는 템플릿 유형과 템플릿 대체품에도 적용되기 때문이다. UML 2.0의 템플릿 메커니즘은 분류자, 연산, 패키지로 제한되었다. 처음 두 가지는 대중적인 프로그래밍 언어에 있는 템플릿 메커니즘 뒤에 모델링 된다.

컴포넌트 기반 디자인에서, UML 1은 혼란스러운 개념이 많았다. 클래스, 컴포넌트, 하위시스템을 사용할 수 있었다. 이러한 개념들은 분명하지 않은 부분에서는 미묘하게 달랐다. 주어진 상황에서 어떤 것을 사용할 지에 대한 명확한 선이 없었다. 하위시스템(subsystem)이 그저 "큰 " 컴포넌트인가? 그렇다면 하위시스템이 되기 전에 컴포넌트 크기는 어느 정도가 되어야 하나? 클래스는 캡슐화를 제공했고 인터페이스를 만들었지만 컴포넌트와 하위시스템도 마찬가지였다.

UML 2.0에서 이 모든 개념들이 정비되어 컴포넌트들은 일반적인 클래스의 특별한 경우로서 정의되었다. 하위시스템들도 컴포넌트 개념 중에 단지 특별한 경우이다. 이들간 본질적인 차이점이 명확하게 구분되어 특정 목적에 맞춰 어떤 개념을 사용할 것인지를 결정할 수 있다.

의미와 표기법 스팩도 강화되었다. 각 메타클래스 스팩에는 의미상의 변이 포인트, 표기법 옵션, UML 1 스팩과의 관계 등을 분명히 정의한 정보들이 갖춰져 있다. 마지막으로 용어도 일관성 있게 정의되어 기존 용어(유형, 인스턴스, 스팩, 발생)가 모든 컨텍스트에서 일반적은 의미를 지니게 되었다.




위로


요약

UML 2.0은 모델 중심의 방식을 위해 존재한다. 스케치 툴로서 사용하고자 하는 사람들도 UML 1 처럼 비공식적으로 사용할 수 있다. 언어의 룩앤필도 별로 변경되지 않았다.

하지만 MDD에서는 이제 표준화 방식으로 사용할 수 있다. UML 2.0은 정확성이 향상되었다. 완전히 자동화된 코드 생성 기능을 사용할 수 있다.

언어 구조는 모듈식과 점진적은 방식으로 채택하도록 구성되었다. 관심 있는 언어의 일부를 공부하고 나머지는 무시해도 된다. 경험과 지식이 늘어날수록 새로운 기능을 선택적으로 사용할 수 있다. 순응성 정의도 상당히 간단해져서 보조 툴들간 상호운용성과 다양한 벤더들의 툴들간 상호 운용성이 향상되었다.

새롭게 추가된 부분은 얼마 안된다. (언어가 팽창되는 것을 방지하기 위해서이다.) 그리고 이 모든 것들은 실제로 매우 크고 복잡한 시스템을 모델링 할 수 있는 반복 원리에 따라 디자인되었다. 특히, 소프트웨어 아키텍쳐, 복잡한 시스템 인터랙션, 플로우 기반 모델이 확장되어 비즈니스 프로세스 모델링과 시스템 엔지니어링 같은 애플리케이션에 이상적으로 쓰이도록 변모하였다.

언어 확장 메커니즘도 단순하게 재구성되었다. UML에 기반하여 도메인 스팩의 언어들을 정의할 때 보다 직접적인 방식을 사용할 수 있다. 이러한 언어들은 UML 툴과 전문성을 활용할 수 있다는 장점이 있다.

전체적으로 볼 때, 고급의 소프트웨어 시스템을 보다 빠르고 신뢰성 있게 구현할 수 있는 차세대 모델링 언어가 되었다. 중요한 것은, 개별 컴포넌트들이 큰 규모에 통합될 때 하드웨어 디자인에서 발생하는 단계들과 견줄 수 있는 고급 레벨의 프로그램 디자인이란 점이다.




위로


참고자료


출처 : http://www-128.ibm.com/developerworks/kr/library/321_uml/index.html
Posted by 나림아빠
기술표준이슈

2004.08.23 (2004-34호)

 

UML(Unified Modeling Language)은 소프트웨어 시스템에 대한 산출물을 가시화(visualizing), 정의(specifying), 구축(constructing) 그리고 문서화(documenting) 하기 위한 일종의 그래픽적인 표기법을 사용하는 언어이다.

UML
의 변천사
UML
은 원래 Booch, OMT(Object Modeling Technique) OOSE(Object-Oriented Software Engineering)에 의해 객체 모델링 언어로부터 파생되었다. OMG(Object Management Group Inc.)에서 1997년에 UML(Unified Modeling Language)를 처음 표준으로 채택한 이후, UML은 학계와 산업 등 여러 영역에서 상당히 폭넓게 채용되어 사용되며 성공적으로 자리잡았다. UML 1997년에1.1 버전의 발표를 시작으로 1998년에 버전 1.3, 2000년에 버전 1.4를 발표하는 과정에서 그동안 제기되었던 UML 메타모델의 내부 문제를 해결했고, 모호한 표현을 좀 더 명확하게 하고, 명명의 일관성도 증진시켰다. UML 1.0부터 UML 2.0까지의 변화는 다음 그림과 같다.

 



UML 2.0
스펙
UML
은 소프트웨어 시스템의 아키텍처를 묘사하기 위한 사실상의 표준 언어로써 많은 소프트웨어 개발자들이 사용하게 되었다. UML 덕분에 컴포넌트 아키텍처와 다양한 방법론들이 더불어 발전하게 되었으며, 이에 따라 소프트웨어 개발 방법론에서도 특정 경향이 나타났는데, UP(Unified Process) XP(eXtreme Programming)가 바로 그것이다. 또한 비주얼 모델링과 비주얼 프로그래밍 기술이 합쳐지는 추세를 보이는데, 이러한 추세를 기반으로 OMG에서는 UML 2.0에 다음과 같은 네 가지 스펙을 발표하였다.

  • 기초적인 구성요소(Construct)를 재구성하고, 특화(Customizability)를 개선하기 위한 것과 관련된 내부구조(Infrastructure)
  • 컴포넌트(Component), 활동(Activity), 상호작용(Interaction) 등과 같은 응용 구성요소(construct)를 개선하기 위한 상위구조(Superstructure)
  • 기존 UML OCL(Object Constraint Language)의 정확성과 표현력을 개선하기 위한 것과 관련되는 OCL
  • 다양한 툴들 사이의 모델 다이어그램을 교환할 수 있도록 하는 다이아그램 호환(Interchange)

주요 개선사항
UML 1.x
의 문제로 지적된 것은 크기가 너무 크고, 복잡하며, 또한 의미론(Semantics)이 모호하며, 구현과 관련된 부분이 충분하지 못해서 특화(Customizing)가 제한되어 있다는 것이다. 이 외에도 컴포넌트 기반의 개발방법을 제대로 지원하기 어렵고, 모델 다이어그램을 교환하기 위한 수단이 없다는 것도 또다른 문제점으로 나타났다. UML 2.0은 이런 문제가 많던 UML 1.x 전체에 대해 많은 개선을 했고, 주요한 변화사항은 다음과 같다.

  • 구조의 순환적 분해와 컴포넌트 기반 개발방법에 대한 지원이다. UML 2.0은 복합 구조(Composite Structure) 다이아그램과 같은 새로운 주요 다이어그램들을 도입했고 시스템, 서브 시스템, 컴포넌트, 하위 컴포넌트 등 순환적인 분해를 할 수 있게 해주는 파트(Part), 포트(Port) 그리고 커넥터(Connector) 같은 새로운 구성요소들을 포함시켰다.
  • UML 2.0은 활동(Behavior)들을 하위 활동들로 순환적 분해를 할 수 있도록 행위 다이아그램(Activity Diagram)과 순차 다이아그램(Sequence Diagram)을 확장시켰다. 예를 들자면, 액션 노드(Action Node)들을 하위 액션 노드들, 하위-하위 액션 노드들 등으로 분해할 수 있다.
  • 구조적 모델과 행위적 모델 사이의 통합을 개선했다. , 구조 다이아그램과 행위 다이아그램들을 문제없이 통합할 수 있도록 해준다. 예로, 자동차 엔진에 대한 복합 구조 다이아그램 내의 연료 공급 장치 부분은 선박 운행 시스템에 대한 행위 다이아그램 내에서의 동일한 부분에 대해 사용될 수 있다는 것이다.
  • 실행 가능한 모델에 대한 지원이 또한 새롭게 UML 2.0에 추가된 사항이다. UML 2.0은 시뮬레이션과 프로그래밍 코드를 실행할 수 있는 실행 가능한 모델을 지원하는 통합된 행위적 의미(Action Semantics)를 완벽하게 포함하고 있다.

물론 이러한 새로운 부분들로 인해 언어의 크기가 커지는 것은 사실이다. 하지만 UML 2.0에서는 각각이 독립적인 여러 서브언어의 집합으로 모듈화 되어 있다. 따라서 특정 국가의 언어를 말하기 위해서 해당 언어 모두를 다 알고 있지 않아도 되는 것처럼 UML 2.0의 사용자는 자신의 문제를 해결하기 위한 부분만 단지 선택해서 사용할 수 있다.
어떤 점에서는, UML 2.0이 단지 추상화와 자동화의 레벨을 증가시킴에 따라, 그리고 3세대 프로그래밍 언어라 불리는 것에 의해 도입된 성공적인 기술의 패턴을 반복하고 있다. 따라서 UML 2.0은 지난 40여 년간 수렁에 빠진 상태였던 프로그래밍 언어의 올가미로부터 우리를 해방시킬 것을 약속할 수 있을 것이다.

성운 ( 명지대학교 컴퓨터공학과 교수, choisw@mju.ac.kr )
Posted by 나림아빠

드디어 강좌의 종착역에 도달했군요. 마지막으로 UML에 대해서 정리를 해보고 어떻게 이용할 수 있을지 운을 띄우도록 하겠습니다. 실제로 UML을 활용해서 각자가 원하는 가치를 만들어내는 것은 여러분들의 몫이 될 테니까요.


모델링 언어 UML

UML(Unified Modeling Language)이란 말 그대로 모델링을 위한 언어를 통합시킨 것입니다. 특징적인 점은 그래픽 요소가 강한 표준 언어라는 점이죠. 굳이 소프트웨어 개발을 위해서만 UML을 쓸 수 있는 것은 아니지만, 주로 소프트웨어 개발을 위해 도움을 주는 방향으로 발전되어 왔습니다. 그러나, 모델링을 능숙하게 하기 위해서는 다양한 현상이나 개념들을 UML로 표현해 보는 방법도 좋은 수련이 된다고 할 수 있겠죠.

UML이 있기 이전에도 소프트웨어 개발을 위한 요구사항 수집이나 분석 및 설계 등을 위해 모델링이 쓰이기 시작했습니다. 글로만 작성된 문서는 내용이 많아지면 전체를 한눈에 파악하기가 상당히 힘들어집니다. 또한, 다른 사람과 의사소통 하는데 상당히 어려움을 갖게 되죠.

소프트웨어 개발 과정에서 모델링을 이용하기 이전에 이미 많은 분야에서 모델링이 쓰였습니다. 여러분도 건축에서 쓰이는 많은 도면을 한번쯤은 보신 일이 있으시리라 생각이 듭니다. 디자이너들이 의상을 모델링 한 도면을 언뜻 보신 분도 있을 듯 하구요. 이른바 샘플이라고 하는 것들은 모델과 유사한 것들이죠. 또한, 수학이나 과학의 공식들도 하나의 모델이라고 볼 수 있습니다.


그림 21-1. OMG의 로고


UML 은 흔히 Booch, Rumbaugh와 Jacobson이 만든 것으로 오인하는 분들이 많습니다. 앞의 세 분들이 UML의 초안을 만들어내고 발전하는데 많은 기여를 한 것은 사실입니다. 그러나, UML에는 이미 존재해있던 많은 지적 자산들이 축적되어 있다고 볼 수 있습니다.

UML의 많은 모델링 요소들과 다이어그램은 개발 현장에서 필요성을 인정 받아 널리 쓰이던 것들이 UML이라는 이름으로 꾸러미 지어진 것입니다. 기왕 모델링 하는 김에 서로 통일된 언어로 하자는 것이죠. 1997년 후반 UML1.1이 OMG에 의해 표준으로 채택된 이래 발전을 거듭하여 현재는 UML 1.4버전까지 등장했습니다.

우리 가 UML을 단순히 기술로써 다룬다면 제대로 써보지 못할지 모릅니다. UML의 심장을 이루고 있는 진정한 쓰임새를 알아야 우리에게 가치를 줄 수 있을 것입니다. 모델링은 복잡한 개체나 현상을 이해하기 위한 방편입니다. UML은 그러한 모델링을 해나가는데 아주 유용한 도구입니다.

UML은 모델링을 하기 위해 단순히 도구들-즉, 클래스나 관계와 같은 모델링 요소들만을 제공하는 것이 아닙니다. 모델링 요소와 이들 간의 규칙, 다이어그램들 안에는 문제 해결에 유용한 선조들의 자산이 녹아 있습니다.

물론 우리나라 선조님들은 아니죠. 소프트웨어 개발을 위해 다양한 문제 해결을 하려고 고민했던 이들이 많은 모델 표기법이나 규칙을 만들었고, 다양한 경험과 지식들이 UML이라는 이름으로 녹아 들어 하나의 모습을 하게 된 것입니다.


통합을 위한 언어 UML

소 프트웨어 개발을 바라보는 시각은 무척 다양합니다. 우선 고객과 개발자의 관점은 확연하게 다릅니다. 개발자의 경우는 시스템의 기능이나 기술에 관심이 많지만, 고객은 풍부한 기능보다는 자신의 업무에 유용한지를 더 생각할 것입니다. 또한, 고객 측면에서는 어떠한 기술이 사용되었는지는 크게 중요하지 않을 수도 있습니다.

UML은 유스케이스(Use Case)와 유스케이스 실체화(Use Case Realization)를 통해 고객의 관점과 개발자의 관점을 연결시켜줍니다. 시스템 개발의 궁극적인 목적은 고객의 요구를 충족시켜주는 것입니다. 그러한 면에서 유스케이스를 실현하는 일은 시스템이 제대로 만들어졌는지를 검증하는 일이라 하겠습니다.

UML에서는 그림 21-2와 같이 추적 다이어그램을 통해 유스케이스와 유스케이스 실체화 간의 추적 기능을 제공합니다. 이를 통해 시스템의 모델이 유스케이스를 충족했는지 검증하는 역할을 수행할 수 있습니다.


그림 21-2. 유스케이스 추적 다이어그램


유 스케이스 실체화는 Collaboration으로 연결됩니다. 그림 21-2에서 점선으로 연결된 타원은 유스케이스 실체화를 나타내기도 하지만, Collaboration을 묘사하기도 합니다. Collaboration이란 하나 이상의 객체가 작용해서 어떠한 기능을 수행하는 모습을 모델링 한 것입니다.

결국 고객의 요구 사항에 대한 시스템의 기여를 나타내는 유스케이스는 객체들이 모여서 만들어내는 Collaboration에 의해 수행된다는 것이죠.

개 발자 사이에서도 다양한 관점이 존재합니다. 소규모 개발에 있어서는 굳이 역할을 구분함 없이 목표를 향해 무조건 개발하게 되어 있습니다만 그 규모가 커지면 이러한 접근법은 성공하기 어렵습니다. 따라서, 명확히 역할을 구분하고, 이에 따라 책임을 분산하게 됩니다.

이렇게 되면 시스템을 바라보는 시각도 단편적이 될 수 있습니다. 대형 프로젝트를 수행하게 되면 개개인의 역할과 개인적 성향에 따라 서로 다른 수많은 관점으로 시스템을 바라봅니다. 이를 조율할 수 있는 도구가 필요한데 이것이 또한 UML입니다.

UML은 시스템을 모델링 할 수 있는 다양한 관점을 제공합니다. 기본적으로 RUP에서 크게 구분하는 관점은 전에도 말씀 드린 것처럼 5가지 관점입니다. 분석과 설계 과정에서 시스템의 정적인 측면과 동적인 측면을 동시에 바라보는 논리적인 관점이 있습니다. 그림 21-3에 보이는 Design View가 이를 나타낸다고 볼 수 있습니다.

논리적인 요소들 즉, 클래스, 인터페이스나 이들을 묶은 Collaboration을 컴포넌트로 매핑시켜 구현을 위한 모델을 만들게 되는데 이를 Implementation View라고 합니다. 실제 구동 환경을 살펴본 모델인 Process View가 있습니다. 또한, 시스템이 실제로 설치되고, 배치되는 모습을 표현한 Deployment View가 있습니다. 여기에 이들 모두를 검증하고 통합시켜주는 수단인 Use Case View가 있죠.


그림 21-3. 4+1 View


시 스템 분석 및 설계를 담당한 사람이라면 Design View에만 관심이 집중될 것입니다. 구현을 담당한 프로그래머라면 Implementation View에 초점을 맞추거나, 더러는 Process View쪽에 비중을 두는 역할자도 있을 것입니다. 시스템 배포 전문가나 시스템 엔지니어라면 Deployment View의 모델에만 관심을 갖을 것입니다.

그러나, 이들 모두는 결국 고객이 원하는 시스템의 가치를 만들어내는 것이 최종 목적입니다. 따라서, 이들 다양한 관점 사이에 충돌이 생길 경우에 이를 조정하고 통합시키는 수단이 Use Case View라고 볼 수 있습니다.

UML 은 이들 관점 모두를 표현할 수 있는 도구를 제공함과 동시에 UML에 흡수된 규칙과 관습 등을 통해 위에서 설명한 통합의 기초를 제공해준다고 말할 수 있습니다. 실제로 이러한 통합을 수행하는 사람이 필요한데 이러한 지휘자를 아키텍트(Architect)라고 부릅니다.

결론적으로 UML은 단순히 모델링 언어를 통일시킨(Unified) 언어일 뿐만 아니라 시스템을 바라보는 다양한 관점까지 통일시킨 유용한 도구라고 할 수 있습니다. 이러한 측면에서 UML을 이해하고 사용해야만 유익한 결과를 얻을 수 있을 것입니다.


참고 문헌

마지막으로 제가 이 강좌를 쓰면서 참고했던 서적과 웹 사이트를 언급하죠. 좀 더 깊은 이해를 원하시는 분들이라면 해당 서적이나 사이트가 많은 도움을 줄 수 있을 것입니다.


참고 서적

 Visual Modeling with Rational Rose and UML, Terry Quatrani, Addison Wesley
 UML Distilled Second Edition, Martin Fowler with Kendall Scott, Addison Wesley
 The Rational Unified Process An Introduction Second Edition, Philippe Kruchten
 The Unified Modeling Language Reference Manual, James Rumbaugh, Ivar Jacobson, Grady Booch, Addison Wesley
 The Unified Modeling Language User Guide, James Rumbaugh, Ivar Jacobson, Grady Booch, Addison Wesley
 Developing Enterprise Java Applications with J2EETM and UML, Khawar Zaman Ahmed, Cary E. Umrysh, Addison Wesley
 초보자를 위한 UML, Joseph Schmuller, 곽용재 역, 인포북


유용한 사이트

 OMG UML Resource Page… http://www.omg.org/uml/
 Cetus Links … http://www.cetus-links.org/
Posted by 나림아빠


앞서 강좌에 서도 반복적인 개발에 대해 언급했습니다. RUP를 비롯한 모든 객체지향 방법론은 반복적인 접근법을 선택합니다. 마치 계절이 한번 돌아 한 해가 되듯이 프로젝트는 iteration의 반복으로 구성됩니다. Iteration은 어떻게 나누며 어떠한 순서로 계획해야 하는지 알아보도록 하죠.

이번 강좌에서는 강좌 초기에 말씀 드린 참고문헌 외에 다음 두 권의 서적을 참조했음을 밝힙니다.

 Developing Enterprise Java Applications with J2EETM and UML…Khawar Zaman Ahmed, Cary E. Umrysh, Addison Wesley
 UML User Guide … Grady Booch 외, Addison Wesley


iteration 계획하기

객체지향 분석 및 설계의 대가인 Booch에 따르면 iteration 계획에는 기본적으로 다음의 세 가지 사항이 명시되어야 한다고 말합니다.

 Capabilities being developed
 Risks being mitigated during this iteration
 Defects being fixed during this iteration

첫 째로, ‘Capabilities being developed’란 해당 iteration에서 무엇을 발전시켜 나갈 것인가를 정의하는 것입니다. 프로젝트의 초기에는 프로젝트 전체를 통해 만들어낼 것-이를 Capabilities라고 이해할 수 있습니다.-을 명확히 정의해야 합니다. 이를 프로젝트 영역(Project Scope)을 확립한다고 하죠. 이러한 영역을 각각의 iteration에 적절히 할당해야 합니다.

두 번째인 ‘Risks being mitigated during this iteration’는 iteration에서 제거할 위험 요소를 말합니다. 프로젝트 계획 시에는 프로젝트를 실패로 빠뜨릴 주요 위험 요소를 찾아내야 합니다. 프로젝트의 주적을 찾아내는 것이죠. 주적을 찾아내어 각각의 iteration에서 하나씩 제거해 나가면 승리를 하게 되는 것이죠.

마지막으로 ‘defects being fixed during this iteration’는 진화(evolution)하는 측면을 잘 보여줍니다. 지난 iteration에서의 문제점을 파악하고 이번 iteration에서 그러한 문제점을 해결하는 것이죠.

그림 20-1은 iteration 계획 프로세스를 나타낸 것입니다. 초기에 설정한 프로젝트 영역과 위험 요소(initial risks, initial project scope)를 기초로 프로젝트를 계획합니다. 가장 위험한 요소부터 제거하는 방향으로 iteration을 설정한(Define iteration to address the highest risks) 뒤에 iteration을 계획하고 진행하면서 발전시켜 나갑니다(Plan and develop the iteration). 해당 iteration이 종료되면 되짚어 보아야 합니다.(Assess the iteration)


그림 20-1. Iteration 계획 프로세스


제 거된 위험 요소(Risks eliminated)를 확인한 뒤에 위험 요소를 관리하는 목록을 수정해야 하겠죠(Revise project plan). 그리고 나서 최종적으로 프로젝트 계획서를 수정합니다(Revise project plan). 이렇게 하나의 Iteration이 종료가 되고, 수정된 위험 요소 목록과 프로젝트 계획서는 다음 Iteration을 계획하는 자료가 되는 것이죠.

보통 Iteration을 나눌 때에는 유스케이스에 근거해서 나누게 됩니다. 이들 유스케이스들을 위험 정도, 고객에 있어서의 중요성과 선행 작업 필요성 여부 등을 고려해서 우선순위를 설정합니다. 그런 후에 우선순위가 높은 것부터 초기의 Iteration에서 다루게 되는 것이죠.


UI 설계

요구사항 수집과 업무를 분석하는 과정에서 사용자 인터페이스에 대한 요구가 구체화되어져 가기 마련입니다. 초기에 사용자 마음에 쏙 들고, 사용자의 업무 수행에 딱 들어맞는 인터페이스를 만들 수는 없을 것입니다.

따라서, 프로토타이핑(prototyping) 기법과 같은 것들이 쓰이게 되는 것이죠. 프로토타이핑이란 개발과정에서 최종적인 시스템의 모습의 일부를 보여주는 샘플-프로토타입(prototype)이라고 하죠-을 만드는 것입니다.

주 요 UI를 찾아내고 사용자가 UI를 이용해 업무를 수행하는 이동경로의 파악, UI를 통해 시스템과 주고 받는 데이터를 파악하는데 많은 노력이 기울여집니다. 분석 단계에서 논리적인 UI 객체들을 뽑아내는데 설계단계가 되어 구체적인 사용기술이 결정되면 그림 20-2와 같은 모델과 관계가 드러나게 됩니다.


그림 20-2. JSP를 사용한 UI 관련 객체 모델링


그 림 20-2를 보면 우선 장바구니 화면에서 ‘결제하기’와 같은 메뉴를 선택하면 Checkout이라는 JSP 객체로 링크가 됩니다. Checkout JSP 객체는 ShopingCartBean을 이용해서 장바구니에 담긴 정보를 확인하고, 결제 확인을 위한 클라이언트 페이지를 만들어내게 됩니다. 해당 화면 내에는 결제 정보를 입력할 수 있는 양식(Form)이 포함되어 있겠죠.


클래스 디자인

초 기에는 클래스 자체만을 추출하는 개념적인 수준으로 수행하게 됩니다. 이러한 클래스를 Conceptual Class라고 하죠. 일반적으로 사용자와의 상호작용이 많은 시스템의 경우는 MVC 모델을 이용하여 클래스를 추출하는 것이 보편적입니다.

분 석 단계에서 해당 업무 영역(Domain)에 적합한 클래스를 뽑아냅니다. 아직까지는 특정 기술에 국한된 것은 아니죠. 이렇게 분석 모델을 도출한 이후에 어떠한 기술을 사용하는 것이 적절한가를 결정한 이후에 이를 적용한 설계 모델을 만들어냅니다.

설 계 단계에서의 클래스는 특정한 기술에 한정된 것입니다. 그림 20-2의 경우도 자바기술에 한정된 설계단계의 다이어그램이죠. 개념적인 클래스가 적절히 도출되면 이들 사이의 관계를 묘사합니다. 관계는 집합(Aggregation), 상속(Inheritance)과 의존(Dependency)과 같은 정적인 관계와 메시지를 통한 동적인 관계인 연관(Association)으로 크게 나눌 수 있습니다.


그림 20-3. 속성과 오퍼레이션이 추가된 설계 단계의 클래스 다이어그램


클 래스가 도출되고 관계가 묘사된 이후에는 속성과 오퍼레이션이 추가되는 순서로 자세한 설계가 진행됩니다. 그림 20-3은 속성과 오퍼레이션이 추가된 이후의 설계 모델의 모습이죠. Rose의 경우에는 위와 같이 기본적인 EJB 오퍼레이션은 자동으로 생성해 줍니다.

[Tools]-[Java/J2EE]-[New EJB] 메뉴를 선택하면 그림 20-4와 같이 EJB Specification 창이 나타납니다. 여기에서 적절히 옵션을 선택하고, BeanName이름을 작성하면 이에 맞춰서 EJB 클래스들이 생성됩니다.


그림 20-4. EJB Specification 창

Posted by 나림아빠
0 아키텍쳐(Architecture)란?
2 .0 아키텍쳐를 조망하는 중요한 5가지 View


사 실 System Architecture를 논하는 것은 너무 시기 상조가 될 수도 있습니다. 이제 UML을 처음 배우는 입장에서 과연 아키텍쳐에 대해 얼마나 이해를 할 수가 있겠습니까마는 그래도 그 중요성이 크기 때문에 ‘음~ 이런 것이구나!’하는 정도로 이해해보도록 합시다.


아키텍쳐(Architecture)란?

아키텍쳐에 대해서는 많은 정의가 있습니다. 그만큼 한마디로 정의를 내리기가 쉽지 않다는 반증이겠죠. 우선 아키텍쳐를 설계(Design)와 빗대어 생각해볼까요? 설계가 시스템의 필수적인 기능의 구현을 위한 논리적인 구성에 대해 다룬다면 아키텍쳐는 그와는 다른 점들을 고민한다고 할 수 있습니다.

가령, 기능적으로 볼 때 여러 가지 대안이 있을 수 있습니다. 늘 답은 하나가 아니기 마련이죠. 아키텍쳐 측면에서는 시스템의 성능이나 유연성 측면, 생산성이나 비용까지 고려하여 이들 대안 중에 하나를 고르게 되는 것이죠. 또 다른 측면으로 이해를 도울 그림을 하나 보죠.


그림 19-1. 아키텍쳐의 4+1 View


그 림 19-1은 전에도 살펴보았던 그림이죠? 이번에는 아파트 건축에 비유해서 생각해봅시다. 만일 당신이 아파트 건축을 책임진 사람이라고 합시다. 당신이 아파트의 실내 인테리어 담당자나 배선, 도색 등의 일부 역할을 맡은 사람이라면 아파트의 특정한 모습만 상상하면 될 것입니다.

인테리어 담당자라면 실내 공간의 크기와 모양을 계산하고, 인테리어를 적용한 모델만 만들어내면 되겠죠. 배선 담당자라면 아파트 한 동의 높이와 길이를 알아내고, 각각 방이나 거실 등의 위치를 알아내어 배선도를 작성하면 크게 문제가 없을 것입니다. 도색을 담당한 사람도 이와 비슷하겠죠.

그렇지만, 건축 전체를 맡은 사람이라면 다각적인 이해를 해야 합니다. 아무리 배선이 잘 되었더라도 건물이 부실하다면 좋은 아파트가 아니며, 아무리 실내 인테리어가 뛰어나더라도 물이 제대로 안 나오거나 전기나 가스 공급이 제대로 이뤄지지 않는다면 매우 곤란하겠죠.

이렇듯 모든 측면을 고려하는 사람을 아키텍트(Architect)라고 합니다. 이러한 아키텍트가 아키텍쳐를 만들어냅니다. 건축에 있어서의 아키텍트도 배선이나 인테리어 담당자가 맡고 있는 업무를 동일한 수준까지 알아야 할 필요는 없겠죠. 이들 일은 그들의 몫이니까 아키텍트는 전체적인 상황을 파악하는 것이 더 중요합니다.

즉, 좀더 추상화 된 이해를 필요로 한다는 것이죠. 건물 내부에서 건물을 보면 자세히 관찰할 수는 있지만 전체적인 모습을 보기란 매우 힘듭니다. 반면, 높은 곳에서 건물을 내려다 보면 자세한 정보를 얻기는 힘들지만 다양한 측면에서 건물을 관찰할 수 있습니다. 이렇듯 아키텍쳐는 높은 곳에서 바라본 모델이라고 말할 수 있습니다.

그림 19-1은 이처럼 시스템 아키텍쳐가 시스템을 다각도로 바라볼 수 있다는 것을 나타낸 것입니다. Philippe Krutchten이 제안한 것으로 RUP에서 아키텍쳐를 조망하는 중요한 5가지 View를 제시한 것입니다.

한번의 강좌로 이들 각각에 대해 깊이 있는 논의를 하는 것은 무리입니다. 다만, 이들 각각에 대해 주요한 시사점을 파악하는데 주력하도록 하죠.

1 .0 아키텍쳐(Architecture)란?
0 아키텍쳐를 조망하는 중요한 5가지 View


논리적 관점(Logical View) 혹은 디자인 관점(Design View)

논리적 관점에서의 아키텍쳐는 시스템의 주요한 기능적인 요구사항에 대한 것입니다. 그림 19-2는 수강신청 시스템 예제의 논리적인 관점에서의 아키텍쳐를 나타내는 다이어그램입니다.


그림 19-2 수강신청 시스템의 논리적인 아키텍쳐


논 리적인 관점의 아키텍쳐와 설계의 주된 차이점은 기능적인 요구사항 하나 하나를 다루는 것이 설계라면 아키텍쳐에서는 전체적인 시스템의 기능에 영향을 미치는 설계 전략(design strategy)을 결정하는 것이 아키텍쳐라고 하겠습니다.

가령, 구현 언어를 결정한다던가 사용할 DB를 결정하는 일, GUI를 결정하는 일은 설계자의 역할이기 보다는 아키텍트 혹은 아키텍쳐를 담당하는 팀의 몫이겠죠.


구현 관점(Implementation View)

구현관점의 아키텍쳐는 실제 소프트웨어 모듈의 조직에 관한 것입니다. 논리적인 것이 아니라 실제로 구동하는 시스템의 모습에 관한 것이죠.

논 리적 관점에서의 패키지가 논리적인 기능별 묶음이었다고 하면 구현관점에서의 패키지는 물리적인 묶음으로 변모합니다. 이러한 패키지들은 보통 잘 정의된 인터페이스에 의해 나누어지면서 층(Layer)을 이루게 됩니다. 이러한 층(Layer)은 J2EE와 같은 응용프로그램 개발 프레임워크에서 제시하는 Tier와 일맥상통하는 것이죠.


그림 19-3. J2EE의 응용 프로그램 모델


한 편, 설계에서의 하나 이상의 클래스는 구현관점에서 하나 이상의 컴포턴트로 나타내어지게 됩니다. 하나의 클래스가 하나의 컴포넌트가 되기도 하지만, 더러는 패턴을 이루는 클래스들이 하나의 컴포넌트가 되기도 하죠. 최근 불고 있는 디자인 패턴 열풍은 바로 아키텍쳐 관점에서 좋은 소프트웨어 설계를 위한 노력의 일환이라고 볼 수 있습니다.


그림 19-4. 컴포넌트 다이어그램


Rose에서 구현관점은 ‘Component View’ 패키지 내에서 컴포넌트 모델로 표현됩니다.


프로세스 관점(Process View)

프 로세스관점은 구현관점과 유사합니다. 다만, 구현관점이 개발 과정에서의 소프트웨어 구조라면 프로세스관점은 실행 시(run-time)를 다룬다는 것이 차이점이죠. 따라서, UML 표현은 구현관점과 프로세스관점 모두 동일한 방식을 취합니다. 모델의 차이는 실제 구현 시에 어떠한 형태를 띄느냐 하는 것이죠. 가령, ‘EXE로 구동하느냐’, 아니면 ‘DLL 형태로 구동하느냐’ 하는 것들이죠.


배포 관점(Deployment View)

배포관점은 그야말로 시스템이 실제 배치되는 모습에 관한 것입니다. 인터넷과 무선 통신 등의 발달로 점차 프로그램이 분산화 되는 측면에서 갈수록 중요성이 강화되는 측면이라고 하겠죠. Rose에서는 ‘Deployment View’라는 다이어그램을 기본적으로 갖고 있어 배포도를 나타내도록 하고 있습니다.


유스케이스 관점(Use Case View)

19-1 의 그림을 보면 유스케이스 관점은 다른 관점들을 묶으며 이들 가운데 위치하게 됩니다. 유스케이스 관점의 키워드는 ‘통합’입니다. 앞서 언급한 관점들은 각기 다른 시사점을 제시합니다. 이들 중 어느 하나의 관점을 강조하면 다른 하나의 관점에서는 상대적으로 악영향을 미칠 수가 있습니다. 가령, 성능을 높이기 위해 프로세스 관점에서 변화를 주자 논리적인 관점에서 설계 모델의 유연성이 떨어졌다고 합시다. 이것은 올바른 의사결정인가요?

이러한 관점의 차이에서 오는 마찰을 어떻게 극복할 것인가? 이들을 통합해주는 유스케이스에 그 답이 있다는 것이죠. 시스템의 가치는 유스케이스로 평가 받습니다. 즉, 평가는 고객의 몫이라는 것이지 단순히 성능이나 유연성, 유지보수성 등으로만은 이야기할 수 없습니다. 아키텍쳐에 대한 이들 각각의 관점은 결국 유스케이스 관점에서 평가하고, 검증할 수 있다는 것입니다.
Posted by 나림아빠
0 Object Behavior
2 .0 상태(State)
3 .0 상태 천이(State Transition)
4 .0 Statechart 상세화


유 스케이스(Use case)는 시스템 레벨의 행위(Behavior)를 표현한 것입니다. 유스케이스에서 출발해서 이들 행위를 달성해야 하는 시스템의 책임(Responsibility)을 객체들에 나눠주고 이들 간의 협력(Collaboration)이 모여서 시스템 레벨의 행위를 달성하게 되는 것이죠.

자, 시스템 레벨의 행위는 유스케이스에, 이를 세분화 시켜서 객체들의 집합이 보여주는 행위는 협력을 보여주는 시퀀스 혹은 협력 다이어그램(Collaboration Diagram)에 표현되었습니다. 그렇다면 더 낮은 수준의 분석은 필요가 없을까요?

결국 객체지향 기술에서 시스템을 이루는 단위는 ‘객체’입니다. 객체의 행위 수준까지 분석을 해야 한다는 것이죠. 이번 강좌는 객체의 행위에 대해 다루도록 하겠습니다.


Object Behavior


그림 18-1. Statechart Diagram 만들기


유 스케이스는 사용자와 시스템과의 상호작용 행위를 집약한 것입니다. 유스케이스는 결국 객체들이 메시지를 주고 받거나, 특정한 관계를 맺으면서 실현됩니다. 객체 사이에 오고 가는 메시지는 결국 객체 내부에서 어떠한 처리를 하게 됩니다. 따라서, 객체 내부에서 어떠한 행위를 필요로 한다는 것이죠.

이러한 행위는 객체 내부의 상태로 표현되는데 Statechart Diagram으로 나타냅니다. 그림 18-1은 Rose에서 Statechart Diagram 다이어그램을 만드는 순서를 나타냅니다. Statechart를 나타낼 클래스에서 오른쪽 마우스를 클릭한 후에 [New]-[Statechart Diagram]순으로 선택을 합니다.

객체의 모든 행위들에 대하여 Statechart Diagram을 그릴 필요는 없습니다. Statechart Diagram에 표현된 것들은 구현 과정에서 객체의 메소드내지는 함수의 알고리즘이 됩니다. 따라서, 간단한 행위에 대해 알고리즘을 다이어그램으로 표현할 필요는 없을 것입니다.

중요한 행위에 대해 Statechart Diagram를 표기하거나, 다른 타입의 클래스보다 상대적으로 이해하기에 어려운 컨트롤 클래스에 대해 다이어그램을 작성합니다. 또한, 집합연관(Aggregation)을 갖는 클래스에서 쓰기도 하죠. 요는 반드시 이해해야 하거나 이해하기 어려운 경우에 이를 돕는 것이라는 점이죠.

1 .0 Object Behavior
0 상태(State)
3 .0 상태 천이(State Transition)
4 .0 Statechart 상세화


상태(State)

상 태(State)는 객체의 컨디션(condition)을 말하는데 이는 하나 이상의 속성 값으로 표현이 되죠. 쉬운 예로 전화기의 상태를 살펴 보면 ‘전화를 기다리는 상태(idle)’와 ‘전화기가 쓰이는 상태(active)’ 둘로 나눠 볼 수도 있겠죠.


그림 18-2. 상태에 대한 UML 표기법


그림 18-2는 상태에 대한 UML 표기법입니다. 상태는 모서리가 둥근 직사각형으로 표현합니다. Rose에서 상태는 표현하는 일은 매우 간단합니다. 상태 아이콘을 선택하여 다이어그램에 놓일 위치를 클릭하면 되는 것이죠.

상태의 중요한 특성 하나는 상태는 객체가 주고 받는 메시지들 사이에서 표현된다는 점입니다. 가령, 전화기에 벨이 울리는 메시지가 있다고 합시다. 이 메시지를 받기 전과 후에는 상태가 변하겠죠?

또, 한가지 상태 중에는 복합 상태(Composite State)라는 것이 있는데 하나의 상태를 세부적인 상태들로 나눌 수 있는 경우를 말합니다. 더 자세한 것은 UML Specification 등을 참조하셔야 할 것 같네요. 무한정 이야기를 늘여 나갈 수는 없으니까요.^^;


1 .0 Object Behavior
2 .0 상태(State)
0 상태 천이(State Transition)
4 .0 Statechart 상세화


상태 천이(State Transition)

State Transition은 객체의 상태가 변화되는 것입니다. Transition은 전이(轉移)라고 번역되는 경우가 많은데, 전이란 원래 ‘자리를 이동한다’는 의미로 적합한 표현이 아닙니다. Transition을 굳이 우리말로 바꾼다면 ‘천이’ 혹은 ‘변이’와 같이 바꿀 수가 있겠죠. 그렇지만 중요한 것은 ‘천이’냐 ‘전이’냐가 아니라 Transition이 무엇이냐 하는 것이죠.


그림 18-3 CourseOffering의 States와 State Transitions


상 태 천이는 특정 액션 혹은 이벤트와 연관을 갖습니다. 상태를 변화시키는 요인이 무엇이냐 하는 것이죠. 그림 18-3은 수강 신청 예제의 CourseOffering(강좌) 클래스에 대한 State Transition을 표현한 다이어그램입니다.


1 .0 Object Behavior
2 .0 상태(State)
3 .0 상태 천이(State Transition)
0 Statechart 상세화


Statechart 상세화

그 림 18-4는 Rose에서 State Transition을 상세하게 설명하는 사항을 나타내는 모습입니다. ‘이벤트 이름[감시 조건]/액션’ 혹은 ‘^클래스 이름.보내는 이벤트’의 형태로 표기합니다. Rose에서는 Transition에 대한 Specification 창에서 이벤트 이름은 General 탭의 Name 항목에 나머지 상세한 사항은 Detail 탭에 기술합니다.


그림 18-4. State Transition Detail 나타내기


감시 조건은 Guard Condition 항목에, 액션은 Action 항목, 대상 클래스 이름은 Send target, 보내는 이벤트는 Send event 항목에 각각 기술하면 UML 표기법에 맞게 다이어그램에 표기됩니다.

여 기에서 액션과 이벤트를 구분할 필요가 있겠네요. 액션은 전이가 일어날 때 나타나는 행위입니다. 가령, 위의 경우 세부적으로는 count를 0으로 만드는 액션이 일어났습니다. 그와 동시에 다른 클래스인 CourseRoster에게 create 메시지가 호출됩니다. 이러한 메시지 호출은 액션과 구분하여 이벤트라고 합니다. 여기서 또 혼돈이 올 수 있죠. 이들이 하나의 Transition에 따른 것이기 때문에 이들을 묶어서 표현할 이름이 필요한데 그것이 여기에서는 add student입니다.

마 지막으로 State Transition뿐만 아니라 State도 더욱 세분화 하여 표기할 수 있습니다. State에 대한 Specification 창을 열면 Actions 탭이 있습니다. 여기에서 insert를 하여 State를 상세히 설명하는 액션이나 이벤트를 표기할 수 있습니다. insert 명령을 수행하면 디폴트로 On Entry 액션을 생성합니다. 이를 더블 클릭하면 그림 18-5와 같이 Action Specification 창이 뜹니다.


그림 18-5. Action Specification Window


타 입 옵션에서 Action과 Send Event 중에 하나를 선택할 수 있습니다. Name 항목에 액션이나 이벤트의 이름을 표기하고, 언제 이러한 행위가 일어날 지에 대해서는 네 가지 옵션을 선택할 수 있습니다. 각각의 세부 사항에 대해서는 UML User Guide나 UML Spec을 참고하세요.
Posted by 나림아빠
0 상속(Inheritance)
2 .0 일반화(Generalization)와 전문화(Specialization)
3 .0 상속도(Inheritance Tree)
4 .0 상속(Inheritance)과 집합(Aggregation)


이 번 시간에는 상속(Inheritance)에 대해 알아보도록 하겠습니다. 객체 지향 모델링에서 상속은 클래스 사이에서 갖는 관계의 일종이죠. 지난 시간까지 클래스들의 주요 속성과 행위를 찾아낸 것이 개별 클래스 수준에서 묘사가 되었다면 상속은 이들을 다시 클래스 단위로 정리하는 것이라고 이해할 수 있습니다.


상속(Inheritance)

상 속은 하나 이상의 클래스 사이에서 구조나 행위를 공유하는 관계를 말합니다. “is-a” 관계 혹은 “is-a-kind-of” 관계라고도 하죠. 객체지향 기술에서 기본적인 재사용 메커니즘 중에 하나입니다. 하위 클래스가 상위 클래스를 상속 받으면서 그 속성이나 오퍼레이션들을 모두 이어 받는 것이죠.

객체지향 언어를 잘 모르신다면 사실 상속을 제대로 이해하기도 어렵다는 생각이 드네요. 최근 CBD(Component-Based Development)라고 하는 컴포넌트를 기반으로 하는 재사용 바람이 거세게 불고 있습니다. 객체지향이라는 주류를 놓아 두고도 이러한 기술이 트렌드를 이루는 데는 다 그 나름의 이유가 있겠죠.

상속을 통한 재사용은 이론에서처럼 제대로 적용되지는 못했습니다. 그렇다고 근본적으로 상속을 대체하는 것이 컴포넌트라고 보기는 힘들 것 같습니다. 그저 좀더 좋은 해결책을 찾기 위한 노력이라고 보는 것이 옳겠죠. 아무튼 상속이 좋은 아이디어임에는 틀림없습니다. 상속의 UML 표기법은 그림 17-1과 같습니다.



그림 17-1. 상속의 UML 표기법



UML 에서 상속은 특수한 형태의 관계(Relationship)로 분류할 수 있습니다. 일반적인 관계와는 달리 관계의 이름을 붙이지 않고, 역할 이름이나 다중도(multiplicity)를 적용하지 않습니다. 이러한 속성들은 이미 ‘상속’이라는 의미 속에 녹아 들어가 있기 때문입니다.

상속 관계를 갖는 두 클래스의 관계를 많은 경우 부모와 자식 사이로 비유하는 표현을 사용합니다. 이에 따라 상위 클래스(super class)를 부모 클래스(parent class), 하위 클래스(subclass)를 자식 클래스(child class)라고도 하죠.

1 .0 상속(Inheritance)
0 일반화(Generalization)와 전문화(Specialization)
3 .0 상속도(Inheritance Tree)
4 .0 상속(Inheritance)과 집합(Aggregation)


일반화(Generalization)와 전문화(Specialization)

복잡한 시스템을 분석하고 설계할 때 상속 관계를 알아내는 일은 쉽지 않습니다. 특히 익숙하지 않은 분야의 일이라면 더욱 그러하겠죠. 상속 관계를 끌어내는 방법 중에 하나로 일반화(generalization)가 있습니다.

다수의 클래스 사이의 공통점을 발견하는 방법입니다. 공통점이 발견된 클래스들 사이에서 공통점은 상위 클래스로 정의하고, 이를 제외한 각각의 차이점만 모아서 개별적인 클래스들을 정의할 수가 있겠죠.

월드컵이 다가옴에 따라 우리나라 대표팀의 베스트11에 대한 관심과 예상들이 많습니다. 그러나, ‘상황에 따라 다른’ 전략을 보여줄 것이라는 것이 아직은 중론인 것 같습니다. 상황에 따라 다르다. 참 묘한 말입니다.

축구에서 정해진 포지션이라면 심판뿐이라고도 말할 수 있을 것입니다. 공격 성향의 축구를 하다 보니 종종 골키퍼가 최후방 수비수의 역할도 하니까요. 마찬가지로 모델링에서도 딱히 정답이 있는 경우는 극히 일부에 지나지 않습니다.

예 를 들어, Student 클래스와 Professor 클래스가 있다고 해봅시다. 이들 사이에 공통점이 존재할까요? 절대적인 정답은 존재하지 않습니다. 상황에 따라, 구현할 시스템이 어떠한 영역(Domain)에서 사용되느냐에 따라서 모델은 달라질 것입니다.

도움이 될만한 기법이 있다면 ‘언어의 모호성’ 에 각별히 주의를 하셔야 한다는 점입니다. 가령, 의미는 같은데 다른 단어를 사용한 경우나 의미가 다른데 같은 단어를 사용하는 경우가 있습니다. 특히 팀으로 작업을 하는 경우 발생하기 쉬운 일이죠. 이런 경우 프로젝트 용어집 혹은 프로젝트 사전 등을 이용하여 쓰이는 말을 표준화할 필요가 있습니다.

일반화와 반대로 모호한 클래스를 명확하게 하기 위해 하위 클래스를 생성하는 경우가 있습니다. 이를 전문화(specialization)이라고 합니다. 일반화와 전문화 중에 어떤 방법이 더 좋다고 할 수는 없습니다. 자신에게 알맞은 방법을 적절히 쓰면서 상속 관계를 철저히 분석하는 것이 목표일 뿐이죠.

1 .0 상속(Inheritance)
2 .0 일반화(Generalization)와 전문화(Specialization)
0 상속도(Inheritance Tree)
4 .0 상속(Inheritance)과 집합(Aggregation)


상속도(Inheritance Tree)


그림 17-2. 상속 관계 표현하기



그 림 17-2처럼 클래스 다이어그램을 이용하여 상속 관계를 표현할 수 있습니다. 상속 관계를 표현하기 위한 새로운 다이어그램을 나타낼 수도 있고, 기존의 다이어그램에 상속 관계를 명시할 수도 있겠죠. 다이어그램 작성에 원칙은 없습니다. 다이어그램을 그리는 목적이 바로 우리가 구현하고자 하는 시스템을 설명해주는 모델을 바로 이해하기 위한 것이기 때문에 사람이 이해하는데 적합한 형태로 작성하면 좋은 다이어그램이라 할 수 있는 것이죠.

상 속도를 표현하는 방법은 도구상자에서 Generalization 아이콘을 선택한 상태에서 하위 클래스에서 상위 클래스로 드래그 합니다. 화살표 방향이 혼돈을 가져오기 쉬운데 영문 어순을 생각하시면 쉽습니다. UML도 영어 문화권에서 개발된 언어니까요. 예를 들어 위의 그림에서, “Professor는 RegistrationUser(등록된 사용자)를 상속한다”와 같이 읽을 수 있겠죠.

상속관계를 표현할 때 만일 두 개의 하위 클래스와 모두 관계를 맺고 있는 클래스는 어떻게 표현해야 할까요?



그림 17-3. 상속 관계도



그 림 17-3을 보면 CourseOffering 클래스가 각각의 하위 클래스와 개별적으로 관계를 표현하고 있습니다. 이렇게 하지 않고, CourseOffering 클래스와 RegistrationUser 사이의 관계로 표시할 수도 있겠죠?

그렇습니 다. 상황에 따라서 둘 중 하나가 효과적일 때가 있는 것이죠. 가령, 해당 클래스가 각각의 하위 클래스와의 관계가 같은 경우는 상위 클래스와의 관계로 표현하는 것이 더욱 이해하기에 좋을 것입니다. 그러나, 위의 경우처럼 다중도(multiplicity)가 다르거나, 관계가 틀린 경우에는 이들을 따로 표현하는 것이 더 효과적일 수도 있습니다.

1 .0 상속(Inheritance)
2 .0 일반화(Generalization)와 전문화(Specialization)
3 .0 상속도(Inheritance Tree)
0 상속(Inheritance)과 집합(Aggregation)


상속(Inheritance)과 집합(Aggregation)

위 임(Delegation)이라는 디자인 패턴이 있습니다. 특정한 경우에 상속을 대체하기 위한 개념입니다. 클래스간의 상속 관계가 문제가 되는 경우가 있습니다. 상속은 기본적으로 정적인 바인딩(Static Binding)을 합니다. 프로그램 실행 이전에 이미 클래스의 타입이 결정되는 것이죠. 따라서, 실행 중에 타입을 변환하는 일은 무척 어렵습니다.(상속 관계에 따라 위, 아래로 변하는 경우는 예외죠) 위임은 집합 관계로 표현이 됩니다.

수강신청 예제에서 다음과 같은 경우를 생각해보죠. 해당 학교의 교수진은 전임교수와 시간 강사가 있다고 합시다. 그런데 시간 강사던 사람을 학교측에서 전임교수로 임명했다고 합시다. 그러면 클래스를 바꿔줘야 하는데 이를 어떻게 할까요? 시스템이 지원하지 않으니까 시스템 상에는 시간 강사로 놓아둘까요? 아니면 시스템을 수정할까요? 좋습니다. 시스템을 수정해야 겠죠. 그런데 그 사람이 개인 사정으로 다시 시간 강사직을 맡겠다고 합니다. 이번에는 어떻게 할까요?

그렇습니다. 상속은 정적인 바인딩을 하는 탓에 유연성이 떨어집니다. 이런 경우에 시간 강사인지 전임교수인지를 구분해주는 역할(Role)을 다른 클래스에 위임(Delegation)해서 문제를 해결할 수 있습니다. 이렇게 하면 실행 중에 해당 강사의 역할에 따라 동적으로 바인딩이 가능하게 되는 것이죠. 이를 표현한 다이어그램이 그림 17-4입니다.


그림 17-4. 상속과 집합
Posted by 나림아빠
0 속성 설명하기
2 .0 클래스 다이어그램에서 속성과 오퍼레이션


지난 강좌까 지 학습을 하셨다면 클래스에 Operation과 Attribute를 추가하실 수 있으시겠죠? Behavior and Structure라는 제목으로 오랜 시간을 할애했습니다. 그만큼 중요한 내용이라 여겨집니다. 이번 강좌에서는 마무리를 해보죠.


속성 설명하기

남의 나라 기술을 차용해서 쓰는 입장에 대해 딱히 생각해 본 적이 없었습니다. 그런데 글을 쓰게 되면서 종종 답답한 마음이 들더군요. 바로 위의 글만 해도 Attribute라고 했다가 속성이라고 썼다가.

속 성이란 말로 Attribute란 단어를 어느 정도 대체할 수 있어서 번역한 말을 썼지만 이번 강좌의 첫번째 문장을 보세요. 오퍼레이션(Operation)을 우리말로 번역할 적당한 단어가 없습니다. ‘운영’은 얼토당토않고, ‘연산’도 어색하기 짝이 없죠? 독자님들의 이해를 바랍니다.

속성(Attribute) 역시 다른 모델링 요소처럼 설명을 기술할 수 있습니다. Documentation을 한다고 하죠.


그림 16-1. 속성에 설명을 기술하기



브 라우저나 클래스의 Specification Window에서 설명을 기술하고자 하는 속성을 찾아 더블 클릭을 하면 Attribute Specification Window가 나타납니다. 여기에 설명을 기록합니다. 물론, 속성을 선택한 후 브라우저 하단의 Documentation Window에 직접 설명을 기술하는 것도 가능하죠.

기본적으로 Rose에서 Documentation 절차는 모든 모델링 요소에 동일합니다. 사용자 편의를 위해 어찌 보면 아주 기본적인 사항을 잘 지켜준 프로그램이죠. 속성이든 클래스이든 동일한 방법으로 설명을 넣을 수 있습니다.

속 성의 설명 시 중요한 사항은 해당 속성이 무엇(What)을 하기 위한 것인지 명확히 기록하는 것입니다. 해당 속성의 데이터 타입이나 제약 사항들은 그림 15-1에서 보이는 바와 같이 정형화된 틀에 맞게 표기하는 것이 좋습니다. Documentation에는 해당 속성이 무언지를 쉽게 알 수 있는 내용을 적어두는 것이 좋겠죠?


그림 16-2. OMG의 MDA


1 .0 속성 설명하기
0 클래스 다이어그램에서 속성과 오퍼레이션


클래스 다이어그램에서 속성과 오퍼레이션

처음 모델링을 할 때 자주 오해하는 것이 다이어그램을 작성하기 위해 모델링을 하는 주객이 전도된 경우입니다. 다이어그램은 하나의 뷰(View)에 지나지 않습니다. 시스템을 나타내는 모델의 일면 만을 보여주는 것이죠.

다 이어그램이 오히려 복잡한 시스템을 더 잘 모델링 하기 위해 사용되는 것입니다. 아리송하신가요? 여기서 다시 Iterative Development라는 성격이 여실히 보여지네요. 모델을 찾아내기 위해 지금까지 찾아낸 모델을 이용해서 다이어그램을 찾아내고, 다이어그램에 새로운 모델을 추가하면서 전체적이 모델이 갱신되는 것이죠.

모델링을 하면서 ‘어떤 다이어그램을 작성할 필요가 있을까?’하는 정형적인 질문을 누구나 떠올리기 마련입니다. 다이어그램은 필요에 따라 맘껏 그리시면 됩니다. 보지도 않는 다이어그램을 구색을 맞추려고 그릴 필요는 없겠죠.

중요한 것은 시스템을 만들기 전에 시스템에 관한 어느 정도는 구체화 된 실체를 찾아내는 것입니다. 그렇다고 해도 구현을 하기 전까지는 추상적인 것이니까 모델이라고 부르는 것이겠죠.

클래스 다이어그램 역시 여러 가지 용도로 쓰일 수 있습니다. 10강에서인가요? 클래스간의 관계를 표현하려고 사용했었습니다. 그림 16-3과 같은 다이어그램이죠.



그림 16-3. 클래스 다이어그램


그 림 16-3의 다이어그램에서는 클래스의 속성이나 오퍼레이션을 보이지 않습니다. 클래스 간의 관계를 보는 것이 목적인 다이어그램에서 모든 클래스의 속성과 오퍼레이션이 나타내어지면 너무 복잡해질 수 있습니다. 용도에 맞는 것이 가장 적합한 다이어그램이 되겠죠.

따라서, 클래스의 속성과 오퍼레이션을 보기 위한 다이어그램을 작성할 수도 있는 일이겠죠. 그림 15-3의 다이어그램에서 관계를 보이지 않게 하고, 속성과 오퍼레이션을 보이게 하는 연습을 해볼까요? 기억하실 것은 다이어그램은 뷰일 뿐이라는 점입니다.

뷰(View)라는 단어에 익숙하지 않은 분들 계신가요? 뷰라는 것은 복사본이라고 생각하시면 수월합니다. 데이터베이스에 익숙하신 분들은 잘 아시겠죠? 다이어그램에서 관계를 없애도 해당 다이어그램에서만 보이지 않을 뿐이라는 것입니다.

메뉴에서 [Query]-[Filter Relationships] 순으로 선택하십시오. 그러면 그림 16-4와 같은 다이얼로그가 나타납니다.


그림 16-4. Relations 다이얼로그


Type 항목에서 None을 선택하시고 OK를 클릭합니다. 관계를 나타내던 선들이 모두 사라졌죠. 이제 클래스들을 선택하시고, 오른쪽 마우스 클릭을 한 후 [Options]-[Show …] 순으로 선택을 하시면 됩니다. 보고 싶지 않으신 경우에는 해당 [Show …] 항목에 체크가 사라지게 하면 되겠죠. 관계를 사라지게 하고, 속성과 오퍼레이션을 나타나게 한 다이어그램이 그림 15-6의 클래스 다이어그램입니다.


그림 16-5. 속성과 오퍼레이션 나타내게 하기



그림 16-6. 속성과 오퍼레이션을 나타낸 클래스 다이어그램
Posted by 나림아빠
0 Operation 상세화
2 .0 속성 추가하기


지난 강좌에는 Operation을 찾아내는 것까지 살펴 보았습니다. 이어서 Operation에 대해 좀 더 알아본 뒤에 Attribute를 추가하는 것을 살펴 보도록 하죠.


Operation 상세화

객 체 간에 오고 가는 메시지는 결국 서비스를 하는 Operation이 됩니다. 향후에 응용 프로그램의 기능도 결국을 이들 객체 사이에서 호출하거나 호출 되는 Operation을 기반으로 제공되는 것이죠. 반면에 객체 내부에서 사용할 목적으로 쓰이는 Operation도 있었습니다.

여기까지의 단계에서는 매우 추상적으로 Operation을 찾아낸 것이죠. 이러한 Operation을 점차 구체화 시키는 과정이 차츰차츰 반복됩니다.(Iterative Development!!) 상세화는 보통 두 가지를 생각해 볼 수 있습니다.

첫째는 Operation에 대한 설명을 기술하는 것이고, 둘째는 Operation Signature를 정의하는 것이죠. Operation Signature란 Operation의 이름과 입출력 데이터 들을 함께 가리키는 말입니다.


그림 15-1. 브라우저의 Operation


먼 저 Operation에 설명을 기술하는 것을 배워보죠. Rose에서 Operation에 설명을 기술하는 것은 다른 모델링 요소의 경우와 일치합니다. 그림 15-1에 보이는 것처럼 브라우저에서 Operation을 선택하고, 오른쪽 마우스를 클릭하면 나타나는 메뉴에서 Open Specification을 선택합니다. Operation을 더블클릭해도 동일한 효과를 냅니다.


그림 15-2. Operation Specification Window


그 림 15-2는 Operation Specification Window의 모습입니다. Documentation에 설명을 기술합니다. 설명을 기술할 때 유의할 점은 해당 Operation이 무엇(What)을 해야 하는지를 명시해야 합니다. Operation의 목적을 잃어버리지 않기 위한 것이죠.

기술적인 백그라운드를 가진 개발자들이 가장 오류를 범하기 쉬운 부분이 바로 분석 과정에서 “기술 지향적(Technology-Oriented) “으로 문제를 바라볼 수 있다는 점입니다. 그럴 경우에 자꾸 근원적인 문제를 해결하는 쪽이 아니라 자꾸만 소스코드를 향해 달려(?) 가려고 하기 쉽다고 많은 전문가들이 지적을 하더군요.

Operation의 설명을 기록하는 과정에서도 기술 지향적인 개발자들은 입출력 값을 중요시 여겨 이것만 기록하려고 하기도 합니다. 그러나, 입출력 값은 Operation Specification Window에서 이를 적절히 정의할 수 있는 곳이 존재합니다. Operation은 입력 값은 Arguments의 형태를 띄어 Detail Tab에서 찾아볼 수 있고, 출력 값은 그림 15-2에서 나타나는 Return Type에서 선택이 가능합니다. 물론, 편의상 입출력 값을 기술할 수 있습니다만 중요한 것은 Operation이 무엇을 하기 위한 것이냐는 질문에 대한 대답이 Documentation에 꼭 기술되어 있어야 한다는 사실이죠.

이번에는 Operation의 Signature를 어떻게 찾아내는지 살펴 보도록 하겠습니다. 물론 Operation Signature를 직관적으로 도출할 수도 있습니다. 경험이 많은 개발자이거나 익숙한 도메인에서 수행하는 개발인 경우에는 이러한 일이 많겠죠.

그러나, 그렇지 못한 경우에는 클래스의 Relationship이 도움을 줍니다. 개발이 진척되면서 Relationship도 정제(refinement)되는 과정을 거치게 되죠. 그러면서 Relationship은 일반화 혹은 상속 관계가 되는 경우가 아닌 경우에는 대부분 Operation Signature의 많은 부분을 보여줍니다.


그림 15-3. System Architecture를 바라보는 4+1 View


객 체지향 분석 및 설계 과정에서 가장 힘든 것 중에 하나가 바로 ‘딱딱 떨어지지’ 않는다는 점입니다. 복잡한 산수 계산을 할 때에도 딱딱 맞아 떨어지는 경우는 수월한데 나누기 했더니 몫이 소수점 몇 자리까지 내려가고 하면 골치가 아픕니다. 과거의 방법론이나 기술은 딱딱 떨어지게끔 만들어졌습니다. 방법론만 해도 객체지향 방법론에 비하면 따라 하기 수월했었죠. 그런데 그러한 기술이나 개방 방법론으로는 매우 복잡한 문제를 해결하는데 한계가 보였다고 합니다.

그래서, 객체지향 기술이 나왔고, 이에 맞는 방법론이 등장했죠. 객체지향 방법론에서는 ‘두루두루 둘러봐서’ 알아내는 전략을 취합니다. 그림 15-3는 Rational의 Philippe Krutchten이 복잡한 시스템을 바라보는 관점으로 제시한 ‘4+1 Model View’입니다.

복잡한 문제는 한가지 관점으로만 봐서는 해결이 안 된다는 논리죠. 동의 하시나요? 현행범을 잡은 경우에 형사는 고민을 하지 않지만, 미지에 빠진 사건을 조사하는 형사는 다양한 관점에서 사건을 바라보게 되죠.

일단 사건 현장을 조사하며 단서를 찾기도 하고, 목격자의 진술을 들어보기도 하고, 법의학의 도움을 받기도 하죠. 용의자가 나타나면 심문을 하기도 하지만, 과거의 범죄 기록을 살피기도 하죠.

소프트웨어 역시 매우 복잡한 경우에는 다양한 관점을 동원함으로써 한쪽에서 못 봤던 것을 다른 관점으로 바라보면서 발견해낼 수 있습니다. 여기서 이 얘기를 왜 장황하게 늘어놓느냐고 물으실 분들이 계실지 모르겠네요.

Operation 을 살피다가 돌연 클래스의 Relationship을 논하는데 마치 점프를 하는 느낌을 받으실 분들이 계실 듯 해서죠. 동적인 성향의 Sequence Diagram에서 메시지를 찾아낸 것을 정적인 클래스에 다시 적용시키게 되는 것처럼 다양한 관점을 아울러서 개발이 진척되는 것을 이해하시라는 의도입니다.

저도 이 부분이 가장 이해하기 힘들었고, 많은 분들이 이 부분을 가장 힘들어 하십니다만 객체 지향 분석과 설계의 묘미는 공교롭게도 바로 여기에 있는 듯 합니다. 복잡한 일을 다양한 관점을 통해 바라봄으로 해서 해결한다. 그러나, 최종 산출물은 단일한 결과로 존재해야 합니다. 다양한 관점의 이면에는 통합성(Integration)이 존재한다는 것 또한 잊으시면 안됩니다.

1 .0 Operation 상세화
0 속성 추가하기


속성 추가하기

속 성은 Operation처럼 Sequence Diagram이나 여타 다이어그램에 명시적으로 드러나지는 않습니다. 오히려 여기저기 많이 산재해 있죠. 해당 업무를 잘 이해해야만 속성을 제대로 뽑아낼 수 있는데 그런 면에서 쉬운 일은 아니죠. 요구사항을 정의한 문서들이나 이벤트의 흐름을 기술한 시나리오 내지는 이를 다이어그램으로 표현한 Activity Diagram 등이 좋은 소스가 될 수 있겠죠.


그림 15-4. 클래스에 속성(Attribute) 추가하기


클 래스에 속성(attribute)을 추가하는 방법에도 여러 가지가 있습니다. 우선 브라우저에서 클래스를 선택한 후 그림 14-1와 같이 팝업메뉴에서 [New]-[Attribute] 순으로 선택한 후에 이름을 입력하여 생성할 수도 있습니다. 다른 방법으로는 클래스를 더블 클릭하여 나타나는 Class Specification Window에서 Attributes탭을 선택한 뒤에 추가하는 방법도 존재합니다.
Posted by 나림아빠
0 객체 사이의 메시지
2 .0 Operation 생성


지난 강좌에 서는 객체의 behavior와 structure가 클래스에 어떤 영향을 미치는지를 살펴보고, behavior와 structure 각각에 대해 살펴 보았습니다. 찾아낸 behavior는 클래스의 operation을 생성하게 된다고 했죠. 마찬가지로 여러분들이 찾아낸 structure는 클래스의 속성이 되지요. 이번 강좌에서는 이들을 어떻게 만들어 내는지 살펴 보도록 하겠습니다.

객체 사이의 메시지

sequence diagram이나 collaboration diagram과 같은 객체의 상호작용을 표현한 다이어그램에 나타나는 메시지는 일반적으로 메시지를 받는 객체의 operation이 되는 경우가 많습니다. 전에도 언급했었지만 이러한 상호작용은 메시지를 보내고 받는 일로 이뤄지는데 메시지를 보내는 일이란 받는 객체의 operation을 호출하는 것이 되죠.


그림 14-1. 메시지를 보내고 받는 객체의 표현


그러나, interaction diagram에 나타나는 모든 메시지가 operation이 되지는 않습니다. 일반적으로 Boundary 클래스와 액터가 주고 받는 메시지는 객체 사이의 메시지와는 구분해서 다룰 필요가 있습니다.

액 터가 사람인 경우와 연동 시스템인 경우로 나눠서 살펴 봅시다. 우선, 액터가 사람인 경우에는 메시지는 액터가 GUI 콘트롤을 선택하는 경우가 일반적입니다. 가령, 로그인 하는 경우를 생각해 보면 액터가 자신의 ID와 패스워드를 타이핑하고 ‘확인’과 같은 버튼을 누르는 것으로 메시지 전달이 되지요.

이런 경우는 메시지가 operation이 되지 않고, 사용자가 버튼을 누르는 것이 메시지 전달이 되는 것이죠. 따라서, operation이 되는 것이 아니라 사용자 매뉴얼 같은 곳에 기록해두어야 합니다.


그림 14-2. 액터와 객체 사이의 메시지 교환


그 렇다면 액터가 연동하는 시스템인 경우는 어떻게 될까요? 대부분의 경우 이종의 시스템은 다른 메커니즘을 갖게 됩니다. 즉, 작동 방식이 틀리게 되는 것이죠. 따라서, 프로토콜이 다른 경우가 대부분입니다. 이러한 경우는 메시지가 프로토콜을 처리하는 클래스가 됩니다. 프로토콜 처리기(Protocol Handler)가 필요한 것이죠. 이미 Boundary 클래스를 뽑아내면서 프로토콜 처리기를 뽑아낸 경우는 예외가 되겠죠.

1 .0 객체 사이의 메시지
0 Operation 생성


Operation 생성

Operation 역시 자연어를 이용한 작명을 하기 때문에 이름을 지을 때 신중한 것이 좋습니다. 개발팀 사이에서 일정한 네이밍 룰(Naming Rule)은 정하는 것이 좋겠죠. 객체지향 언어에서 쓰이는 일반적인 네이밍 컨벤션(Naming Convention)은 여기서 언급하지 않겠습니다. 그 외에 두 가지 사항 정도를 염두에 두시길 바랍니다.

첫째는 operation은 클래스의 멤버이기 때문에 해당 클래스가 수행하게 되는 것입니다. 따라서, 해당 클래스의 입장에서 능동 표현이 되어야 적합합니다. 클래스가 무엇 무엇을 해야 한다는 식이면 곤란하다는 것입니다. 또한, operation은 명사보다는 동사 표현이 적합하겠죠? 동사, 동사구나 동사+목적어 형태가 적절할 듯 하네요.

둘째로 operation은 구현 내용을 반영하는 이름은 적절하지 않습니다. 구현은 자주 변할 수 있기 때문이죠.


그림 14-3 Operation 만들기


그림14-3에서 보는 바와 같이 메시지를 선택한 후 오른쪽 마우스를 클릭하면 팝업 메뉴에서 이라는 옵션이 나타납니다. 주의하실 점은 메시지를 나타내는 화살표나 메시지의 이름은 선택하셔야지, 객체 사이를 잇는 링크를 선택하면 해당 옵션이 나타나지 않는다는 점입니다.


그림 14-4 Operation 만들기


옵 션을 선택하면 그림 14-4과 같이 specification window가 나타납니다. 이제 적절한 이름을 입력합니다. Operation을 만드는 것은 collaboration diagram에서는 물론이고 sequence diagram에서도 가능합니다.

Collaboration diagram이나 interaction diagram을 보고 operation을 찾아내는 방법을 “Collaboration”을 이용한 유스케이스의 Realization이라고 합니다. 사용자가 원하는 유스케이스를 통해서 클래스를 찾고, 클래스의 속성과 행위를 찾겠다는 접근 방식이죠.

그러나, 때로는 업무의 분석과 설계 과정에서 직관적으로 operation을 찾아낼 수도 있습니다. 그런 경우는 그림 14-5와 같이 브라우저에서 해당 클래스를 더블클릭하여 specification window를 나타낸 후 operation을 입력할 수도 있습니다.


그림 14-5 Class Specification 창에서 operation 추가하기


이 렇게 생성한 operation은 interaction diagram에 묘사되는 메시지와 연관을 갖지 않습니다. 직관적으로 뽑아낸 operation을 특정 메시지와 연결시키는 일은 간단합니다. 메시지를 받는 클래스에 operation을 갖고 있는 경우 메시지에서 오른쪽 마우스 클릭을 할 때 팝업에 해당 operation이 나타납니다.


그림 14-6 operation과 메시지의 연결


무 결성 유지를 위해서는 메시지와 연결이 안 되는 operation이 없어야 올바른 모델링이라는 생각이 언뜻 떠오를 수도 있겠죠. 그러나, 반드시 모든 operation이 메시지와 연결될 필요는 없습니다. 편의를 위해 객체 내부에서 사용되는 operation 들도 있으니까요.
Posted by 나림아빠
이전버튼 1 2 3 4 이전버튼

블로그 이미지
나림아빠
Yesterday
Today
Total

달력

 « |  » 2025.7
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

최근에 올라온 글

최근에 달린 댓글

글 보관함