「実践ドメイン駆動設計」に出てくるようなコンテキストマップ生成ツールを試してみた

# はじめに
最近ドメイン駆動設計を実案件で採用することになり、勉強中です。
軽量DDDと呼ばれるような戦術的設計に関しての知見は、Qiita等で日本語の記事でも参考になるものが多いですが、戦略的設計に関してはなかなか参考になりそうなプラクティスが見つからないな、という印象です。そもそもあまり取り扱っている記事がない。この辺、そのうち知見が溜まってきたらまたアウトプットしていきたいと思います。

本投稿では、戦略的設計で使用するコンテキストマップについて、「実践ドメイン駆動設計」ライクなビジュアルの生成ツールの導入手順をまとめています。備忘メモなので、多少雑なのはご容赦くださいね。


# CONTEXT MAPPER
**CONTEXT MAPPER**はオープンソースのモデリングフレームワークです。以下のようなコンテキストマップが作図できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260591/2d8798dc-3678-6d69-22fa-b96dac0a88c5.png)

作図自体は自動生成なので、生成前はコードベースで以下のように記述しています。DSLでの記述になります。

```
ContextMap InsuranceContextMap {
	type = SYSTEM_LANDSCAPE
	state = TO_BE
	
	/* Add bounded contexts to this context map: */
	contains CustomerManagementContext
	contains CustomerSelfServiceContext
	contains PrintingContext
	contains PolicyManagementContext
	contains RiskManagementContext
	contains DebtCollection
	
	/* Define the context relationships: */ 

	CustomerSelfServiceContext [D,C]<-[U,S] CustomerManagementContext : Customer_Frontend_Backend_Relationship { // Relationship name is optional
		exposedAggregates = Customers
	}
	
	CustomerManagementContext [D,ACL]<-[U,OHS,PL] PrintingContext {
		implementationTechnology = "SOAP"
		downstreamRights = INFLUENCER
		exposedAggregates = Printing
	}
	
	PrintingContext [U,OHS,PL]->[D,ACL] PolicyManagementContext {
		implementationTechnology = "SOAP"
		exposedAggregates = Printing
	}
	
	RiskManagementContext [P]<->[P] PolicyManagementContext {
		implementationTechnology = "RabbitMQ"
	}	

	PolicyManagementContext [D,CF]<-[U,OHS,PL] CustomerManagementContext {
		implementationTechnology = "RESTfulHTTP"
		exposedAggregates = Customers
	}

	DebtCollection [D,ACL]<-[U,OHS,PL] PrintingContext {
		implementationTechnology = "SOAP"
		exposedAggregates = Printing
	}

	PolicyManagementContext [SK]<->[SK] DebtCollection {
		implementationTechnology = "Shared Java Library, Communication over RESTful HTTP"
	}
	
}
```


>![contextmapper](https://raw.githubusercontent.com/wiki/ContextMapper/context-mapper-dsl/logo/cm-logo-github-small.png)
**戦略的ドメイン駆動設計とサービス分解のためのモデリングフレームワーク**
ContextMapper は、コンテキストマッピングとサービス分解のためのドメイン駆動設計 (DDD) パターンに基づいたドメイン固有言語 (DSL) を提供するオープンソースプロジェクトです。この言語のフレームワークコンポーネントは、コンテキストマップのリバースエンジニアリング、結合基準に関するモデルの分析、アーキテクチャの反復的改善、DDDコンテキストマップからの他の表現の生成をサポートしています。

>**Context Mapper とは？**
Context Mapper は、戦略的ドメイン駆動設計 (DDD) に基づいてコンテキストマップを作成する DSL を提供します。境界付きコンテキストを持つ DDD は、ドメインやシステムを複数の独立して展開可能な (マイクロ) サービスに分解するためのアプローチを提供します。アーキテクチュラル・リファクタリング（AR）では、システムを反復的にリファクタリングして分解するための変換ツールを提供しています。サービスカッターとの統合により、サービスを表示する新しいコンテキストマップや、結合を改善したバウンドコンテキストの提案を生成することができます。ジェネレータを使用すると、PlantUML ダイアグラムや MDSL (マイクロ) サービス・コントラクトのようなアーキテクチャ・モデルの他の表現を導出することができます。リバースエンジニアリングライブラリは、既存システムのコンテキストマップの生成をサポートします。

>https://contextmapper.org/

# 環境
**CONTEXT MAPPER**はEclipseのプラグインとして提供されています。普段はIntelliJユーザーなのでこれを試すために入れました。。。

* macOS Mojave version 10.14.6

HomeBrewでinstall

* Spring Tool Suite4 version 4.6.0　←　Eclipse拡張なので名前違いますが基本Eclipseと同じです
* openJDK version 11.0.2
* graphviz version 2.43.0
* gradle 6.3

EclipseMarketplace

* Context Mapper 5.11.0

# 導入までにハマったところ
上記環境だと、公式サイトに記載のGetting Startedのとおりの手順で進めても以下のエラーが出てコンテキストマップの生成が出来ません。言葉通りGraphvizへのPATHが通っていないかというとそういうわけでもなく、ちゃんとPATHは通してあります。

![Graphviz_installation_not_found.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260591/f0136b72-c1a4-a9fb-7a05-b1f226fe01d5.png)

どうやらこれはEclipseとmacOSとの相性の問題のようで、Eclipse立上げ時にmacOSのPATH変数を上手く読み込めないケースがあるらしい。GitHubの[Issue](https://github.com/ContextMapper/context-map-generator/issues/3)に上がってましたが、ここに気付くまでの溶けた時間よ戻れ...orz

というわけでしょうがないので、諦めてCLIから使用できるスタンドアロンのサンプルプロジェクトをローカルにダウンロードしてきて、自分でビルドして`jar`ファイルを作成し、コマンドラインから実行してみました。Eclipseを介していないので、無事（？）コンテキストマップを生成することが出来ました。

単発で生成するだけならこの手法で問題ないですが、頻繁に繰り返すならこの手法は手間が掛かりすぎるので採用しかねるという感じですね。

スタンドアロンのサンプルプロジェクトのリポジトリは[こちら](https://github.com/ContextMapper/context-mapper-standalone-example)

# 使ってみた感想
「実践ドメイン駆動設計」に出てくるようなビジュアルであれば、パッと見理解しやすいかなと思い使用してみましたが、そもそもこの**CONTEXT MAPPER**は日本語に対応しておらず、コンテキスト名称とか全部英語で記述しなければなりません。**PlantUML**のように日本語も普通に使えるだろうと思ってたので、なんとか使えるようにしたのに。。。。個人での使用はともかく案件で使うことはないでしょう。

溶かした時間に見合うものは何も得られませんでしたが、同じようにトラップに引っかかる人が出ないようにここに記事として残しておきます。

もちろん英語で普通に設計してるよ！という方には良いツールなのかもしれません！！