はじめに
MDA(Model Driven Architecture:モデル駆動型アーキテクチャ)とは、OMG(Object Management Group)によって定義されたソフトウェア開発のためのフレームワークです。ソフトウェア開発プロセスはモデルが重要であり、モデルを起点として開発プロセスを駆動するという考え方です。MDAにのっとった開発ではモデルからソースコードを自動生成しますので、開発工数の削減、品質の向上など、さまざまなメリットが期待されます。
しかし、世の中の多くの開発者は、MDAはまだ現実的ではないと認識しているようです。その一方で、MDAに対応した実装も着々と進められています。そのうちの1つがオープンソースのプロダクトであるAndroMDA(アンドロメダ)です。AndroMDAはBSDライセンスの元でソースが公開され、開発が進められています。AndroMDAは、HibernateやSpringなど他のオープンソースプロジェクトの最新版の開発成果を積極的に取り入れ、開発スピードも速いため、注目のプロダクトと言えるでしょう。本稿では、AndroMDAを活用したMDA開発の実践例を紹介します。
対象読者
JavaでWebアプリケーションを開発した事がある方を対象とします。
必要な環境
サンプルは以下の環境で動作確認を行っています。
MDAの概要
MDAはPIM(Platform Independent Model:プラットフォーム独立モデル)とPSM(Platform Specific Model:プラットフォーム依存モデル)という2つのモデル概念を定義しています。ここでの「プラットフォーム」とは、OS、ミドルウェア、プログラミング言語、データベースなどの事をいいます。例えば、「Windows・Linux」などのOS、「Java・VB.Net・C#」などのプログラミング言語、「Tomcat・JBoss」などのコンテナなどの事です。PIMはプラットフォームに依存しない抽象度の高いモデルです。
一方、PSMはプラットフォームに依存したモデルの事をいいます。MDAではまずPIMが変換定義に従ってPSMに変換されます。その後PSMは変換定義に従い、プログラムソースコード・SQL文・設定ファイルなどの実装コードに変換されます。
モデルの概念がPIMとPSMとに分かれる事により、モデル作成時に分業が可能となります。例えば、業務には詳しいがシステムについてはさほど詳しくない人が、PIMのモデリングを担当し、業務にはさほど詳しくないが、システムには詳しい人がPSM・実装面を担当するという事が可能となります。
またPIMとPSMとに分かれる事によって、モデルの保守性という面でもメリットが生まれます。システムの実装技術は移り変わりが早いので、システムに新しいプラットフォームを採用する場合、プラットフォームに依存しているPSMは再作成する必要が出てきます。しかし、PIMは業務が変化しない限りプラットフォーム変更の影響を受けることはありません。
MDAのメリット
MDAフレームワークがソフトウェア開発にもたらす主なメリットとして、以下の事項があげられます。
- ソースコード自動生成による品質の向上
- ソースコード自動生成による生産性の向上
- ドキュメントと実装の一貫性(トレーサビリティ)が確保されることによる保守性の向上
AndroMDAの機能
AndroMDAはモデリングツールが出力したXMI(XML Metadata Interchange)ファイルを入力として、実行可能アプリケーションを自動生成する為のツールです。XMIとは、UMLなどで定義されたモデルをXMLで表現するための仕様です。モデルをXMI形式にする事によって、異なるツール間でモデルを交換する事が可能となります。XMIはOMGで仕様が策定されています。AndroMDA自体はモデリング機能を提供しませんので、XMIを出力する他のモデリングツールの使用が前提となります。
カートリッジ
AndroMDAは「カートリッジ」と呼ばれる変換のためのプラグインを用意しています。「Java」カートリッジ、「bpm4Struts(Business Process Management For Struts)」カートリッジ、「Hibernate」カートリッジ、「Spring」カートリッジなどのJava言語に対応したカートリッジが標準で添付されています。カートリッジをカスタマイズしたり、独自に開発したりする事も可能です。
UMLプロファイル
AndroMDAはUMLを拡張するための「UMLプロファイル」を提供しています。「UMLプロファイル」とはUMLを拡張して特別な使用方法を定義できるメカニズムです。「UMLプロファイル」は、ステレオタイプ群、関連制約群、タグ付き値群などによって定義されます。「UMLプロファイル」の例としては「Java」プロファイル、「EJB」プロファイルなどがあげられます。AndroMDAも「presentation」プロファイル、「persistence」プロファイル、「service」プロファイル、「webservice」プロファイル、「datatype」プロファイルなどを提供しています。これらのプロファイルもXMI形式で提供されています。
AndroMDAによるマスターメンテナンスアプリケーションの自動生成
新規登録(create)、読み込み(read)、更新(update)、削除(Delete)というデータの基本操作の頭文字をとって「CRUD(Create,Read,Update,Delete)」と呼ばれる事があります。そして、システムのデータに対し「CRUD」の操作を行うアプリケーションは「マスターメンテナンスアプリケーション」などと呼ばれます。AndroMDAは「Manageable Entities」というマスターメンテナンスアプリケーションを自動生成する機能を提供しています。本稿では、この「Manageable Entities」の機能を使用してアプリケーションを自動生成するサンプルを紹介します。
サンプルの概要
本稿のサンプルでは、商品とカテゴリという2つのエンティティデータをWeb画面から新規登録・参照・更新・削除するアプリケーションを作成します。本稿のサンプルでは、商品とカテゴリは多対多の関連を持ちます。1つの商品は複数カテゴリに所属する事ができ、1つのカテゴリには複数の商品が所属するというモデルです。
AndroMDAのインストール・環境設定
以下に、AndroMDAの使用に必要なソフトウェアと環境変数を示します。詳細はAndroMDAホームページの「Getting Start」を参照して下さい。
必要なソフトウェア
インストールと環境変数設定
インストール方法
maven、JBoss、AndroMDAは任意のフォルダに解凍するだけです。JDKはインストーラに従ってインストールして下さい。
環境変数設定
各アプリケーションをインストールしたルートフォルダ名を、「XXXX_HOME」という名前の環境変数として設定します。
- MAVEN_HOME
- JAVA_HOME
- JBOSS_HOME
AndroMDAのプロジェクト作成方法
「build.properties」作成
ユーザーのホームフォルダ(「C:\Documents and Settings\ユーザ名」)に、「build.properties」ファイルを以下の内容で作成します。
maven.repo.remote=http://team.andromda.org/maven, http://www.ibiblio.org/maven
mavenは実行時に、「build.properties」ファイルに設定されたURLにアクセスし、必要なライブラリを動的にダウンロードします。
mavenのAndroMDAプラグインをダウンロード
mavenにはAndroMDAプラグインが提供されています。以下のコマンドを実行することにより、ユーザーのホームフォルダ直下の「.maven」フォルダ(「C:\Documents and Settings\ユーザ名\.maven」)に、AndroMDAで使用するJARファイルがダウンロードされます。
maven plugin:download -DgroupId=andromda -DartifactId=maven-andromdapp-plugin -Dversion=3.1-RC1-SNAPSHOT
mavenは基本的に以下の書式で実行します。
maven <プラグイン名>:<ゴール名>
以下の表に、コマンドで指定するオプションの意味を簡単に説明します。
オプション | 説明 |
plugin:download | 「plugin」プラグインの「download」ゴールを実行する(=プラグインのダウンロードを行う)。 |
-DgroupId=andromda | ダウンロードするプラグインのグループを指定。「andromda」グループが対象。 |
-DartifactId=maven-andromdapp-plugin | 「maven-andromdapp-plugin」プラグインをダウンロード。 |
-Dversion=3.1-RC1-SNAPSHOT | プラグインのバージョンを指定。対象バージョンは3.1-RC1-SNAPSHOT。リリース正式版の場合「3.0」、マイルストーン1の場合「3.1-M1」を指定。 |
プロジェクトの作成
以下の手順によりAndroMDAのプロジェクトを作成します。
- プロジェクトを作成するディレクトリに移動
- mavenのandromdappプラグインの「generate」ゴールを実行
cd C:\java\andromda\andromda-bin-3.1-RC1-SNAPSHOT\projects
maven andromdapp:generate
プロンプトメッセージ | 本稿の入力値 | 説明 |
Please enter your first and last name (i.e. Chad Brandon) | Haruo Sato | プロジェクト作成者の氏名(任意の値)。 |
Please enter the name of your J2EE project (i.e. Animal Quiz) | Item Category | プロジェクト名(任意の値)。 |
Please enter the id for your J2EE project (i.e. animalquiz) | itemcategory | プロジェクトID。XMIファイル名、EARファイル名などに使用されます。任意の値で可能ですが、スペースは入れないで下さい。 |
Please enter a version for your project (i.e. 1.0-SNAPSHOT) | 1.0 | プロジェクトのバージョン(任意の値)。 |
Please enter the base package name for your J2EE project (i.e. org.andromda.samples) | to.msn.wings. codezine | ソース自動生成時にJavaのパッケージ名で使用される。 |
Would you like an EAR or standalone WAR | ear | パッケージング方式を指定。 |
Please enter the type of transactional/persistence cartridge to use (enter 'hibernate', 'ejb', or 'spring') | spring | トランザクション、永続性を実現するカートリッジを指定。Manageable Entitiesの機能を使用するにはspringを指定する必要があります。 |
Would you like to use the jBpm workflow engine, it uses Hibernate3 (enter 'yes' or 'no') | yes | Hibernate3の使用の際、jBpmワークフローエンジンを使用するか否か。(jBpmとはビジネスプロセスの実行状態をトラッキングしたり、実行情報をストアしたりするためのワークフロー管理エンジンです。JBossグループで開発が進められています)。 |
Would you like a web application? | yes | Webアプリケーション形式にするか。 |
Would you like to be able to expose your services as web services? | no | ビジネスサービスをWebサービスとするか。 |
以上でプロジェクトが作成され、モデリングを開始する準備ができました。
モデリング
前節まででプロジェクトが作成され、XMIファイルのテンプレートが作成されています。次にモデリングツール(MagicDraw)でXMIファイルを開き、モデルを作成します。AndroMDAでは、モデリングツールとしてMagicDrawとPoseidonを推奨しています。本稿ではモデリングツールとしてMagicDraw 9.5を使用します。MagicDrawはCommunity Edition(機能限定版)がフリーでダウンロードできます。
XMIファイルを開く
MagicDrawのメニューバーで[ファイル]→[プロジェクトを開く]と選択すると、[開く]ダイアログボックスが表示されます。ここでプロジェクトを作成したフォルダ(「mda\src\uml」フォルダ)の「ItemCategoryModel.xmi」ファイルを選択します。「andromda-profile-3.1-RC1-SNAPSHOT.xml.zip」ファイルが存在しないという警告が表示されますので、「C:\Documents and Settings\ユーザー名\.maven\repository\andromda\xml.zips\」フォルダに存在する「andromda-profile-3.1-RC1-SNAPSHOT.xml.zip」ファイルを選択します。
クラス図の作成
アプリケーションのモデルをクラス図上に作成します。
モデルパッケージ階層の作成
モデルパッケージを以下の手順で作成します。
- 包含ツリーで、ツリーの一番上の[Data]モデルを右クリックして[新規エレメント]→[モデル]を選択し、「ItemCategory」と入力します。
- [ItemCategory]を右クリックし、[新規エレメント]→[モデルパッケージ]を選択します。そして、「to/msn/wings/codezine/item」と「to/msn/wings/codezine/category」のモデルパッケージ階層を順に作成します。[item]と[category]のようにモデルごとにパッケージを分けなければならないというルールはありませんが、各モデルクラスに対して複数のクラスが自動生成されますので、わかりやすくするため本稿ではパッケージを分けました。
クラスの作成
モデルパッケージ階層上にクラスを作成します。
- クラスの作成
- クラスへの属性追加
- クラスへのステレオタイプ付加
- クラス属性へのステレオタイプ付加
属性名 | 説明 |
itemcode | 商品コード。商品を一意に識別するコード。 |
name | 商品名。 |
属性名 | 型 | 説明 |
categorycode | String | カテゴリコード。カテゴリを一意に識別するコード。 |
name | String | カテゴリ名。 |
クラス図の作成
- クラス図の新規作成
- クラスの図への追加
- 関連の追加
- 関連仕様(多重度)の設定
- 関連端仕様の設定
以上でモデリングは完了です。モデリングした内容はXMIファイルに保存されます。
リソース自動生成(AndroMDA実行)
プロジェクトのルートディレクトリでmavenを実行します。
maven
「build successful」と表示されたら成功です。XMIファイルをもとに各種リソース(Javaソースコード、各種設定ファイル、SQLファイル)が自動生成されます。
JBOSSの設定・起動
本稿のサンプルでは、JBossに標準で添付しているHSQLDBを使用しますので、テーブルを作成するためにJBossを起動します。
HSQLDBのデータソース設定
JBossではデフォルトで添付のHSQLDBが使用できる状態になっていませんので、「%JBOSS_HOME%/server/deploy/hsqldb-ds.xml」ファイルの以下の箇所を編集します。
- connection-url設定
- mbean設定
<connection-url>jdbc:hsqldb:hsql://localhost:1701 </connection-url>
<connection-url>jdbc:hsqldb:${jboss.server.data.dir} ${/}hypersonic${/}localDB</connection-url>
<mbean code="org.jboss.jdbc.HypersonicDatabase" name="jboss:service=Hypersonic"> <attribute name="Port">1701</attribute> <attribute name="Silent">true</attribute> <attribute name="Database">default</attribute> <attribute name="Trace">false</attribute> <attribute name="No_system_exit">true</attribute> </mbean>
jboss:service=Hypersonic
指定により)というサービス名のMBean(管理Bean)で管理することを意味します。そのほかにattribute
要素でデータベースのポート番号、DB名、デバッグ出力設定などを定義しています。JBoss起動
テーブル作成前にJBossを起動します。
%JBOSS_HOME%/bin/run.bat
DBのテーブル作成
プロジェクトのルートディレクトリで、以下のコマンドを実行します。
maven create-schema
自動生成されたSQLファイル(プロジェクトルート「/core/targe/schema-create.sql」)が実行され、JBoss上のHSQLDBにテーブルが作成されます。
EARファイルのデプロイ
maven deploy
「$JBOSS_HOME/server/default/deploy」フォルダに「itemcategory-app-1.0.ear」ファイルがコピーされ、JBoss上にデプロイされます。デプロイが成功した場合、JBossのコンソール上にデプロイ完了のメッセージが表示されます。
サンプルアプリケーション実行
では、サンプルアプリケーションを実行してみましょう。
- ブラウザで「http://localhost:8080/itemcategory/」にアクセスすると、本稿のサンプルのトップ画面(Item画面)が表示されます。
- 商品の追加
- カテゴリの追加
- 商品とカテゴリの関連付け
まとめ
本稿では、AndroMDAを使用して「多対多」のモデルのデータを管理(新規登録・読み込み・更新・削除)するアプリケーションを自動生成し、その実行までを確認しました。仕様レベルのモデルを定義し、設計モデルそして実装に変換・マッピングするという作業は、ある一定のルールに従って行う事が可能です。この考え方がMDAの基本部分です。MDAを可能な部分からでもシステム開発に適用し、実践することによって大きなメリットを得られるでしょう。
アプリケーションが実行できた所で、開発者としては自動生成されたアプリケーションの内部構造が気になる所です。「AndroMDAでMDAの世界を体験する(コード分析編)」では、本稿で自動生成されたアプリケーションのコードを解析します。
参考資料
- AndroMDA
- 『独習オブジェクト指向開発』 古川正寿 著、翔泳社、2004年10月
- 『MDAのエッセンス』 Stephen J. Mellor・Kendall Scott・Axel Uhl・Dirk Weise 著、株式会社テクノロジックアート 訳、二上貴夫・長瀬嘉秀 監訳、翔泳社、2004年12月
- 『MDA導入ガイド』 Anneke Kleppe・Jos Warmer・Wim Bast 著、株式会社テクノロジックアート 訳、長瀬嘉秀 監修、インプレス、2003年12月