---
title: SpringMVCでWebアプリケーションを作成する場合のおすすオススメプロジェクト構成 jsug
tags: []
categories: ["Programming", "Java", "org", "springframework", "AdventCalendar", "2012"]
date: 2012-12-09T15:08:29Z
updated: 2012-12-09T15:08:29Z
---

この記事は[Spring Framework Advent Calendar 2012][1]の10日目の記事です。

SpringMVCでWebアプリケーションを作成する場合のおすすオススメプロジェクト構成を紹介します。
再利用性や保守性を高めたいときに参考にしてみてください。

### アプリケーションレイヤリング
僕は最近アプリを書くときに次のようなレイヤリングを意識しています。


<a href='/api/v1/files/00086/ApplicationLayering.png'><img src='/api/v1/files/00086/ApplicationLayering.png' /></a>

細かい説明は省きますが、

* アプリケーション層
* ドメイン層
* インフラストラクチャ層

で構成し、アプリの中心はドメイン層に持ってきます。アプリケーション層は画面やUIを構築するためにドメイン層を呼び出す層であり、あまり本質的ではありません。例えば今回はWebアプリなのでMVCフレームワークのControllerからドメイン層のサービスが呼ばれますが、アプリケーション層がSwingやJavaFXの場合でもサービスを実行してアプリを実装できます。サービスを実装するときはこれがSwingから呼ばれても破綻しないか？と思いながら書いています。インフラストラクチャ層では永続技術を隠蔽します。RDBやMongoDBを入れ替えられる感じ。(まあJPA用に@Entityとかつけると実装技術に依存してしまうのだが。。)
ドメイン層は画面に依存しなくてWebサービス等にも利用できる物。Formなど画面に依存するっロジックはApplicationLogicに書いて、Controllerから外に出すことを推奨。

層の名前はDDDで使われている物を採用しました。僕はDDDでプログラムを書いたことがないですが、将来的にはDDDでも同じような構成でアプリを作れることも一応意識しています。

この図はSpring3入門の1章に載っていた凹型アーキテクチャの図をまねしています。


<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415380X/ikam-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/5174QnHv0QL._SL160_.jpg" alt="Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415380X/ikam-22/ref=nosim/" name="amazletlink" target="_blank">Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/477415380X/ikam-22/ref=nosim/" title="Spring3入門 ――Javaフレームワーク・より良い設計とアーキテクチャ" target="_blank">amazlet</a> at 12.11.03</div></div><div class="amazlet-detail">長谷川 裕一 大野 渉 土岐 孝平 <br />技術評論社 <br />売り上げランキング: 8299<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/477415380X/ikam-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

このレイヤリングはJavaEE6でも使えるはずでアプリケーション層がJSFやJAX-RS、ドメイン層がEJBでもOKです。

### プロジェクト構成

↑のレイヤリングを実プロジェクトに合わせると↓のようになります。（tableで書くとはみ出しまくったのでExcelのスクリーンショットとPDFで。。）開発プロジェクトの規模に応じてスケールするなるように色々工夫はしています。


<a href='/api/v1/files/00083/ss01.png'><img src='/api/v1/files/00083/ss01.png' /></a>
<a href='/api/v1/files/00084/ss02.png'><img src='/api/v1/files/00084/ss02.png' /></a>
<a href='/api/v1/files/00085/ProjectConfigulation.pdf'>PDF版</a>


基本的にはmavenのマルチプロジェクトで各層を用意します。依存関係はアプリ層がドメイン層に依存する形です。本格的にはインフラストラクチャ層も別に作るべきですが、どうせなんだかんだで@Entityとか永続化技術に依存しちゃうので、開発しやすさを優先してドメイン層とインフラストラクチャ層を一緒にしています。(SpringDataJPAを使うとインフラストラクチャ層の実装はほとんどいらなくなりますが)

シングルプロジェクトにした場合は↓のようになります。

<a href='/api/v1/files/00087/ss03.png'><img src='/api/v1/files/00087/ss03.png' /></a>

[前回の記事で紹介したテンプレートプロジェクト][2]はこの構成になっているので、手っ取り早く試してみたい方は[こちら][3]からどうぞ！


  [1]: http://atnd.org/events/34294
  [2]: http://t.co/Bu9Wcq0c
  [3]: https://github.com/making/spring-webapp-template/wiki/GettingStarted
