Java Spring for Beginnerを使用したRESTfulサービスの構造


12

私はJava Web開発スキルの点で比較的新しいです。APIについて私が少ししか理解していないことから、RESTfulサービスの良い候補になると思うプロジェクトがあります。私はこれがどのように構成されているのかを詳しく説明しようとしていますが、Google検索やすでに持っている資料を読むという点では実際にはどこにも行きません。この投稿が、このトピックに関する私の知識と仮定の観点から、いくつかの検証やリダイレクトをもたらすことを望んでいます。

私の現在の仮定は、RESTfulサービスが次の構造を持つことです。

  • データベースデータ(SQL)。
  • ORM(私はCPOと呼ばれる比較的人気のないORMを使用していますが、ほとんどの人はこれをHibernateに置き換えるだけです)。
  • ORMと通信してデータを取得するメソッドを持つJavaマネージャークラス
  • クラス/クラスはハンドルがマッピングおよび使用を要求することをAのJavaコントローラ@ResponseBodyに指示する/ HTTP動詞を介してデータの処理方法のURLとアクションを処理(http://mysite.com/computers/dellがあるかもしれないGET単語「デル」とのリクエストURLは、Dellコンピューターに関する情報のJSON配列を返すパラメーターです)。
  • このサービスは、Spring Bootで作成するか、何らかの形で独立して他のアプリケーションから独立させる必要があります。

上記が正しいと仮定すると、(非常に基本的なレベルで)データを消費および使用するために任意のアプリケーションが使用できるRESTfulサービスがあります。

そこで、Webアプリケーションを作成するとします。コンピューターハードウェア情報に関するWebアプリを作成しており、Springを使用してこのWebアプリを作成しているとします。私の仮定は次のとおりです。

  • 私は、JSPとしてHTML、CSS、およびJavaScriptインクルードを持つJSPとして多数のビューを持っています。JavaScriptは、必要に応じてこのアプリケーションのコントローラーへのAJAX呼び出しを処理します(以下)。
  • このWebアプリには、アプリのURLリクエストとルーティングを処理する独自のコントローラーもあり、コントローラーは、たとえば、ModelAndViewオブジェクトまたはそれらの行に沿ったものを使用して、RESTfulサービスのコントローラーと「通信」し、渡されるデータを取得します、表示するためにそのデータをビュー(Javascript、JSPなど)に戻します。

私は正しい道にいますか?RESTfulサービスには認証の側面もあることは理解していますが、概念的にはまだありません(そして、私のプロジェクトはプライベートネットワークで使用されるため、現時点ではセキュリティは優先されません)。

洞察、批判、知識、フィードバック、または明確化は大歓迎です。

回答:


19

スプリングレストアプリの構造の私のお気に入りのキックオフ例の1つを次に示します。

1.レイヤーの分離。各レイヤーは個別のモジュール/プロジェクトです

  • REST API
    • warとしてパッケージ化されています(組み込みサーバーでスプリングブートを使用している場合はjarになる可能性があります。Springブートドキュメントは、いわゆるuber jarをデプロイする方法を明確に説明しています。
    • 要求/応答を処理する残りのコントローラーがあります
    • 以下のサービスモジュールに依存
  • サービス
    • jarとしてパッケージ化
    • ビジネスロジックの抽象化、このレイヤーには、データソースと通信する方法がわかりません。
    • レストコントローラーで自動配線されます
    • 以下のDAO /リポジトリモジュールに依存
  • DAO /リポジトリ
    • jarとしてパッケージ化
    • データソースと直接対話し、一般にCRUDと呼ばれる操作を行います。単純なjdbc、JPA、またはファイルアクセスです。
    • 以下のドメインモジュールに依存
  • ドメイン
    • jarとしてパッケージ化
    • ドメインモデル、通常はPOJOクラスがあります。ORMを使用している場合、それらはORMエンティティです。
    • また、DTO(データ転送オブジェクト)が存在する可能性もありますが、これはまだ議論の的となっています。それを使用するかどうかはあなたの電話です。
  • ユーティリティ、サードパーティの統合などのモジュールを追加できますが、上記のものを使用することを強くお勧めします。

2.ビルド/依存関係管理ツール(非常に必要な私見)

たくさんありますが、グーグル検索で表示されます。私は個人的にMaven with Springが好きです。上記のプロジェクト構造に対して単純に機能します。
また、Mavenを使用している場合は、セクション1で説明したすべてのモジュールを集約する親モジュールがあることに注意してください。すべての箇条書きモジュールは、Mavenモジュールにも対応しています。

3.特定のプロジェクトに関する考え

RESTを使用しているため、JSPをビューとして使用しないことを強くお勧めします。プレーンHTML5 + JavascriptまたはAngularJSなどの一般的なフレームワークをビューとして使用できます。
JSPの使用を主張する場合は、コントローラーとJSPを含む別のwar(Webアプリ)を導入する必要があります。コントローラーはデータ(通常はJson / xml形式)を取得し、モデル(POJO)に解析して、JSPがコントローラーからデータを取得して表示できるようにします。JSPからのデータのポストは逆です。ここでは省略します。

このトピックは非常に大きく、特定の要件に大きく依存するため、完全なガイドにはほど遠いですが、ここに含まれる用語は追加の研究を行うのに十分です(Google、そうです)。うまくいけば、これがどのようにアプローチするかについてのアイデアを提供してくれることでしょう。


1
ドメインは通常、ビジネスロジックを含む層です。ドメインは通常、サービスを含む層とも呼ばれます。ドメインオブジェクトは単純なPOJOではありません。ドメインオブジェクトには、引数の検証などのビジネスロジックを含める必要があります。レイヤーの名前を別の名前に変更することをお勧めします。リポジトリレイヤーは、複数のソースからドメインオブジェクトにデータを転送するためにも頻繁に使用されます。
アンディ

サービスおよびリポジトリモジュールもSpringプロジェクトになりますか?
グレンヴァンシル

1
@GlennVanSchilいいえ、プロジェクト全体がビルドされるときにSpringプロジェクトである必要はありません。レポジトリ/サービスレイヤーはクラスパスに含まれます。@Autowire結果として動作します。
ミンジュンユ

@MinjunYu明確な答えをありがとう!しかし、サービス、リポジトリ、またはコンポーネントの注釈のMaven依存関係として、リポジトリ/サービスにはSpringが必要です。
グレンヴァンシル

1
@GlennVanSchil Spring Mavenのすべての依存関係を親モジュールのpom.xmlに配置する場合、Spring関連の依存関係を子モジュール(レポ/サービスモジュール)に追加する必要はありません。これは、春にマルチモジュールプロジェクトをレイアウトする1つの方法です。目的は、コードを整理することです。プロジェクトがそれほど大きくなく、近い将来に変更されない場合は、「core」と呼ばれる同じモジュールでdomain、repo、serviceを組み合わせることができます。さらにきれいに見えます。
ミンジュンユ

2

@ Minjun.Yからの回答の大部分に同意しながら、RESTおよびWebページレイヤーに対して少し異なるアプローチを採用すると思います。あなたの質問を読んだことから、あなたはWebインターフェースとRESTインターフェースの両方を外部に公開したいと思っていると思います。データベースからPOJOを読み取り、データをJSONに変換してから、JSPで使用するためにPOJOに戻すことによって得られることはほとんどありません。

サービスレイヤーにすべての実際の作業を行わせ、Webアプリ(JSP)とRESTコントローラーに個別の「プレゼンテーション」レイヤーを追加することをお勧めします。これらは、サービスが注入される個別のコントローラーになります。または、RESTサービスのみを使用して、前の回答に従ってクライアント側ですべてのプレゼンテーションロジックを構築します。

また、私はMavenモジュールの大ファンではありません。Javaショップがプロジェクトを実装する方法は、サービスレイヤーの定期的なリリースを作成し、プレゼンテーションレイヤーを最新リリースに依存させることです。これについては議論の余地がありますが、私たちにとっては確かに有効です。WebインターフェースとRESTインターフェースは別々のMavenプロジェクトとして存在します。通常、これらは異なる.warファイルに存在するため、別個のデプロイメントが必要です。

ところで、私はビルドと依存関係の管理ツールでスピードを上げる必要性を強化したいと思います。プロジェクトが適切なサイズに成長したら、必要になります。Maven、Jenkins、Nexusなどの無料ツールにより、リリース管理の問題が軽減されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.