RESTfulの最近のブログ記事

ITの世界には、多くの標準仕様が作成され、それらをベースとする、さまざまな製品がリリースされています。標準仕様のおかげで、われわれは、ベンダーに縛られることなく、「相互接続性」や「ポータビリティ」などのメリットを享受しています。ところが、標準仕様を別の角度から見てみると、適用領域によっては、オーバスペックで複雑すぎるのではと感じてしまうものも多く見られます。
特に、最近は、XMLとWebサービスの世界で、そういった傾向が強くなってきているようです。

一般的な企業システムで使用されるデータは、そのほとんどがRDBに永続化されています。そこでは、2次元の表である「テーブル」を、キーによって関連付け(リレーションシップ)することで、多次元的なデータ構造が実現されています。
Javaアプリケーションでは、JDBC APIでRDBにアクセスし、それらのデータを何らかのオブジェクトのプロパティにマッピングして使用します。その結果、メモリ上では、RDBのデータモデルを投影したオブジェクトとして表現されることになります。
ここまでは、「そんなの常識」という内容ですが、これらのデータをWebサービスで扱う場合には、ちょっと話が違ってきます。
Webサービスでは、送受信メッセージをXML形式で扱います。XMLは、RDBやJavaオブジェクトとくらべると、「豊かな表現力」を持っていますが、その裏返しとして、複雑でかつオーバスペックなデータモデルを生みやすいという副作用があると思います。

ここでは、複雑さの落とし穴にはまらないよう、RDBのデータをXML化するときに、シンプルなモデルを作成する方法について考えてみたいと思います。
実際には、JavaオブジェクトとRDB間のマッピングについても、いろいろと考えるべきことはあるのですが、ここでは、すでに最適化されたJavaオブジェクトが定義されていると仮定して、話を進めていきます。

みなさんは、WSDLを作成するとき、どんな方法を使いますか?
JAX-RPCによる、Webサービス開発スタイル」の中で、ボトムアップ型とトップダウン型という2つのスタイルの概要を説明しました。この2つのスタイルを、出来上がるWSDLの複雑さという観点で見ると、トップダウン型の方が、複雑なXMLスキーマができる確率が高い傾向があります。その理由としては、やはり、XMLが持つ「豊かな表現力」によるところが大きいのではと思われます。XMLスキーマを設計していると、発想も豊か(?)になってしまい、「将来の拡張のため」などの名の下に、不要な項目を追加したり、モデリングに凝りすぎて、不要な型を作ってしまう傾向が強いようです。
一方、ボトムアップ型では、いくつかの制約はあるものの、圧倒的にシンプルなXMLスキーマになります。もちろん、ベースとなるオブジェクトモデルがシンプルな構造であることが前提です。オブジェクトモデルに関しても、変に凝りすぎず、RDBのデータモデルを素直にマッピングしていれば、それほど複雑にはならないでしょう。
ボトムアップ型の制約が問題となる場合は、トップダウン型を採用しますが、その場合でもスタートポイントしては、ボトムアップ型のツールで生成されたWSDLを使用することで、複雑さを回避できると思います。

さらに、誤解を恐れずに言うと。。。
当たり前の話ですが、RDBのデータをJavaオブジェクトに直線的にマッピングした場合、1行分のデータは、カラム名をキーとするMapで表現することができます。複数行のデータやto manyリレーションシップはListに対応付けることができます。このような、MapとListからなるオブジェクトを、Mapのキーを要素名とするXMLにマッピングしてできあがるモデルは、かなりシンプルなものになります。
XMLスキーマという観点では、制約があるモデルかもしれませんが、世の中のかなりのビジネスデータは、これで十分にカバーできるのではと思います。

例えば、以下のようなMapとListから構成されるオブジェクトがあります(HashMapとArrayListをtoString()したイメージです)。


        {
          productPrice=[
            {
              productCode=C0001,
              productName=ブルーマウンテン豆(100g),
              price=1200
            },
            {
              productCode=C0003,
              productName=グァテマラ豆(100g),
              price=1300
            }
          ]
        }
 

これを、XMLにマッピングしたものが、以下のようなイメージです。


         <productPriceList>
            <productPrice>
              <productCode>C0001</productCode>
              <productName>ブルーマウンテン豆(100g)</productName>
              <price>1200</price>
            </productPrice>
            <productPrice">
              <productCode>C0003</productCode>
              <productName>グァテマラ豆(100g)</productName>
              <price>1300</price>
            </productPrice>
        </productPriceList>

特に目新しい考え方というわけではないですが、Javaでも、こういったシンプルなマッピングの標準仕様というのが、あってもいいのではないかと思います。
WSDLには、ちょっと合わないけれど、RESTfulなWebサービスには、フィットするのではないでしょうか。
PHPのSimpleXML関数は、かなり近いイメージかもしれませんね。

Java EE 6

| コメント(0) | トラックバック(1)

JSR 316: Java Platform, Enterprise Edition 6 (Java EE 6) Specificationの検討が、JCPで始められているようです。
J2EE1.xまでは、時代をリードしようという空気があったと思いますが、最近は、まわりにあるものを拾い集めているような傾向があるように思います。例えば、以下のものに関しては、時代の流れと合わなくなったことにより、中身だけでなく、呼び名が変わります。

  • EJB CMP --> Java Persistence
  • JAX-RPC --> JAX-WS

また、新しいものもいくつか追加されるようですが、その中でもある意味注目したいのは、JSR 311: JAX-RS: The Java API for RESTful Web Servicesです。これまで、Simple & Lightなアーキテクチャとして、プラットフォームを選ばず、草の根的に広まってきたものを、今になってJava EEの中で仕様化するわけですから。。。(すでにApache Axis2の中でも、RESTの実装がサポートされていたりします)
仕様のドラフトをざっくりと見たところでは、URIやMIME Typeなどの外部パラメタを設定するためのアノテーションに関する規約が中心であり、EJBやJAX-WSなどと無理に統合しようということはないようなので、少し安心しました。
Jerseyというリファレンス実装もあるみたいなので、機会があれば、試してみたいと思います。
ただ、リリース予定がQ4 2008というのは、ちょっと遅いかなと。。。