時代はAPIファースト!? イマドキの業務システム開発ことはじめ 第2回 REST APIベースの業務システム開発(Java編)

  • テクノロジー

みなさん、こんにちは。富士通ラーニングメディアの松井です。

現在、Javaによる業務システムは大きな変革期にあります。
1つ目の潮流は、REST APIの利活用や提供のニーズが高まっていることです。モバイルアプリケーションのバックエンドやシステム間連携を容易にするため、REST APIを提供し、レスポンスをJSONなどのデータで返すアーキテクチャに注目が集まっています。
2つ目の潮流は、これまで使用されてきたオープンソースのフレームワーク(StrutsやSeaser2)がEOL(End of Life:サポート終了)となったことです。このため、Java EEの標準技術に移行する需要が高まっています

「REST API」をキーワードに、「イマドキの業務システム開発」を読み解いていく本シリーズの第2回では、「どうやってREST APIベースの業務システムを開発するの?」という疑問について、Java EE 7という最新の標準フレームワークを使用した開発方法をご紹介していきます。
REST APIベースの業務システムの詳細については、前回のコラムをご覧ください。

<時代はAPIファースト!? イマドキの業務システム開発ことはじめ>
第1回 なぜ流行っている?「REST API」 ~アプリもインフラ作業の自動化もAPIで!~
第2回 REST APIベースの業務システム開発(Java編)
第3回 イマドキの業務システムはフロントエンドも重要です!

JavaEEとはなにか?

Java EE(Java Platform, Enterprise Edition)とは、サーバサイド向けアプリケーションに必要な機能の仕様の集合(API群)です。

2000年代のJavaのアプリケーション開発においては、Java EEの前身であるJ2EEの開発生産性の低さもあり、オープンソースのフレームワークが台頭していました。ただし、オープンソースのフレームワークは、必ずしも長期的にサポートされるとはかぎらない点に注意が必要です。現に、代表的なオープンソースフレームワークであったStruts1.xとSeasar2は、EOL(End of Life)となっています。
オープンソースフレームワークの諸技術を取り込み、Java EEの最新バージョンでは標準技術のみで高い生産性で堅牢な業務システムを開発可能です。また、後方互換性も十分に考慮されており、長期的な安定性を見込むことができます。

Java EEは仕様の集合であり、アプリケーションの各機能を実現する仕様が定義されています。以下に、REST APIベースの業務システムを開発するにあたり、必要となる仕様を示します。

  • JAX-RS(Java API for RESTful Web Services)
    REST API を開発するための Java EE標準仕様。
  • JPA(Java Persistence API)
    データの永続化やO/Rマッピングの標準を規定した Java EE標準仕様。
  • JTA(Java Transaction API)
    トランザクション管理に関する Java EE標準仕様。
  • CDI(Contexts and Dependency Injection)
    DI(Dependency Injection : 依存性の注入)やAOP(Aspect Oriented Programming : アスペクト指向プログラミング)を実現するための Java EE標準仕様。
  • Bean Validation
    JavaBeansに対してバリデーション(入力された値に対する妥当性の検証)を行うためのJava EE標準仕様。

rest_api_2_01.jpg

上図は、Java EEでREST APIベースの業務システムを開発する場合に使用する各要素技術をマッピングしたものです。
クライアントからリクエストがあると、Bean Validation による入力値検証後、JAX-RSで実装したREST APIで定義されたリクエストに応じた処理を実行し、データベースへの問い合わせについてはJPA/JTAを通じて行われます。また、一般的に業務システムは役割ごとのレイヤーに分割して構成しますが、メンテナンス性を向上させるため、CDIによってレイヤー間を疎結合に保ちます。

JAX-RSによるREST APIの実装例

JavaによるREST API開発の中核となるのはJAX-RSです。

Java EE 7の最注目の仕様の一つで、JAX-RSのバージョンが2.0に上がり、RESTクライアント(REST APIを呼び出すクライアント側のプログラムを実装する仕組み)やフィルタ(毎回のリクエスト/レスポンス時に共通的に実行する処理を定義する仕組み)など様々な機能が追加されました。

REST APIベースの業務システムとして、あるショッピングサイトを例に考えてみましょう。
Webサイトからの注文だけでなく、将来はモバイルアプリケーションからの注文も、同じシステムで受け付けられるようにREST APIを定義したとします。では、以下のような注文情報の取得に関するREST APIがあった場合のJAX-RSでの実装例をみてみましょう。

rest_api_2_02.jpg

JAX-RSでは、REST APIで提供する処理を定義するクラス(リソースクラス)を、アノテーション(注)を付与することで作成します。
リソースクラスには、リクエスト(HTTPメソッドおよびURLパターン)に対応したリソースメソッドを定義します。

  1. リソースクラスにアクセスするリソースURL(/flmmarket/api/orders/1)を@Pathアノテーションで指定
  2. 注文情報はJSONで返却するので、@Producesアノテーションでレスポンスのデータ形式をJSONに指定
  3. リクエストのHTTPメソッドはGETなので、対応するメソッドに@GETアノテーションを指定
  4. リクエストのURLパターン(/flmmarket/api/orders/1)に対応し、検索条件の注文番号を指定する orderid のパスパラメータを取得できるように、@Pathアノテーションを設定
  5. 検索条件の注文番号を指定する orderid のパスパラメータを取得できるように、@PathParamアノテーションを設定
  6. クライアントへのレスポンスは、各種設定をしたResponseクラスのオブジェクトを戻り値として指定

    →ok()メソッドを呼び出すことで、HTTPステータスコード:200(成功)を設定
    →ok()メソッドの引数に検索結果を表すorderを指定。レスポンス時に、JavaオブジェクトはJSONへと変換

(注)クラスやメソッドなどに対してメタデータとして付加情報を設定する機能

普段からプログラムに慣れ親しんでいる方なら、JAX-RSのソースコードを初見でも直感的に理解していただきやすいのではないでしょうか。
HTTPメソッドのGETの例をご紹介しましたが、POSTやPUT、DELETEなども同様に定義可能です。

Java EEを効率的に習得するには

ここまでJAX-RSを簡単にご紹介してきましたが、実際の業務システムでは、データベース連携やレイヤー間を疎結合に保つ仕組みが必要です。また、Java EEによるREST APIベースの業務システムの全体像や各要素技術の連携方法を理解することも重要です。

Java EEを習得するには、サンプルアプリケーションを動かし、実際にプログラミングすることが一番です。
ただ、独学だと1つ1つの要素技術は理解できても、要素技術の連携や技術の適用場面について体系的に理解するのは難しいかもしれません。

  • REST APIを作ったけど、入力値の検証やエラーのときはどうレスポンスを返せばいいの?
  • REST APIのアクセスログをとりたいけど、どうしよう?
  • データベースのテーブルと返却するJSONの構造って、同じでいいのかな?

そんなときは、体系的な知識を短期集中で学習できる講習会がオススメです。

  • JavaEEによるRESTfulアプリケーション開発(UFN57L):

この講習会では、Java EEの全体像や各要素技術を学習したあと、総合演習を行います。総合演習では、API仕様書をインプットとして、サーバサイドで各要素技術が連携したシステムを開発します。3日間をとおして、実践的にJava EEによるREST APIベースの業務システムの開発スキルを習得できます。

rest_api_2_03.jpg

今回はサーバサイドのREST API構築方法を中心にみてきました。
では、サーバサイドから渡されたJSONデータを使用して、クライアントサイドでUIを構築するにはどうすればいいのでしょうか。また、魅力なUIはどのような流れでつくればいいのでしょうか。
第3回目は、「イマドキの業務システムはフロントエンドも重要です!」についてご紹介します。次回もお楽しみに!

今回のコラムでREST APIに興味を持った方は、是非「REST API」のコースマップもご覧ください。

松井 正徳(まつい まさのり) 第二ラーニングサービス部

主にJavaやHTML/CSS/JavaScriptなどのWebアプリケーション開発コースを担当。
最近はRuby、Pythonなどのスクリプト言語やLinux、クラウドなどインフラ技術も勉強中。
アプリケーション開発のオールマイティSEとなるべき、精進の毎日。

プライベートでは、セーリングと日本酒を愛する自由人。
日本酒の今年の目標は、新潟越後の93酒蔵の利き酒を全制覇すること。

(2017/03/02)