EJBのすべてを知る

Java EEとEJBご存知のとおりJava EEは企業向けの仕様であり、その仕様の中核を担ってきたコンポーネントがEJB(Enterprise Java Beans)であることは誰しも疑わないことでしょう。JBossもEJBoss(Enterprise JavaBeans Open Source

田澤 孝之

2007年9月12日 20:00

Java EEとEJB

ご存知のとおりJava EEは企業向けの仕様であり、その仕様の中核を担ってきたコンポーネントがEJB(Enterprise Java Beans)であることは誰しも疑わないことでしょう。JBossもEJBoss(Enterprise JavaBeans Open Source Software)として1999年に産声を上げています(その後、商標の関係によりJBossに変更しています)。

Java EEアーキテクチャダイアグラムは図1のようになっています。このようにサーバサイドには2つのコンテナが協調動作をしてエンタープライズレディとなるように設計されています。


Java EEアーキテクチャダイアグラム 出典:Java Platform, Enterprise Edition(Java EE)Specification, v5
図1:Java EEアーキテクチャダイアグラム
出典:Java Platform, Enterprise Edition(Java EE)Specification, v5
(画像をクリックすると別ウィンドウに拡大図を表示します)

昨今ではJavaを利用した企業システムでも、Webコンテナのみでのシステム構築が見受けられます。Webコンテナは名前のとおり、WebブラウザとのHTTP通信をハンドリングするためのものです。

Webコンテナには主にJSPとサーブレットの動作環境が含まれますが、ビジネスオブジェクトをデプロイして動作させることやコンポーネント化する ことは考慮されていません。よって、このようなことを考えて実装しようとなると、デザインパターンを駆使してフレームワークを考えるか、もしくは既存の標 準ではないフレームワークを導入しなければなりません。

しかしEJBが市場に登場して8年以上経過していますが(1998年頃からEJBの実装が登場しています)、EJBを採用するプロジェクトはそれほど多くないのが実情でしょう。それはなぜなのか、ここでは歴史を振り返りながらEJBの現状を整理してみましょう。

EJBの生い立ち

EJBの生い立ちは分散オブジェクトとトランザクションからはじまっています。OMG(Object Management Group)による分散オブジェクトの業界標準仕様である「CORBA(Common Object Request Broker Architecture)」に続き、SunでもJava上のORB(Object Request Broker)として「RMI(Remote Method Invocation)」が登場しました。

そのRMIをベースに、RMIの難しさを隠蔽しつつ、ビジネスロジックを実装するコンポーネントとしてEJBが誕生したのです。

コンポーネントの利点はここで述べる必要はないでしょう。ビジネスロジックを実装するコンポーネントとして、EJBは多くの開発者を引き寄せ、コンポーネントの流通も模索されました。しかしこの「リモート」であるが故の制約によってEJBはその後悩まされることになります。

そして通常のクラス、今でいうPOJO(注1)を考えると、EJBの実装は複雑怪奇でした。そもそもPOJOという言葉も、EJBの難しさを対照的に表現するためにできた言葉だったのです。



※注1:POJO
Plain Old Java Objectの略。JavaオブジェクトがEJBのように特殊なものではなく、一般的な普通のJavaオブジェクトであることを強調する名称のこと。

EJB 1.1/EJB 2の構成要素
図2:EJB 1.1/EJB 2の構成要素
(画像をクリックすると別ウィンドウに拡大図を表示します)

EJB 1.0/EJB 1.1

EJB 1.0ではエンティティBeanはオプション扱いでセッションBeanのみのサポートからはじまりました。この段階ではEJBを実装しているEJBコンテナはほとんどありません。EJBではファクトリパターンの採用、コンテナ経由でのオブジェクトライフサイクル制御のためにホームインターフェース、そして リモートに公開するためのリモートインターフェースも必要でした。さらに開発者を悩ませたのがデプロイメント記述子と呼ばれる定義ファイルでした。このデプロイメント記述子はEJB 1.0ではテキストファイルでの定義で、EJB1.1からXMLに変更されています。

EJB仕様で定義されているデプロイメント記述子に加え、ベンダー固有の定義ファイルまたはコンフィグレーションも必要でした。そしてEJB 1.1の仕様ではエンティティBeanもリモートインターフェースで公開する必要があり、その制限によりエンティティBeanではオブジェクトの関連を持つことができなかったのです。

このエンティティBeanはOOAD(Object-Oriented Analysis & Design)を実践するうえでどうしても不自然な表現になります。そしてリモートアクセスでは性能の問題もあり、必要ない場所でのリモート通信はリソースの無駄遣い以外の何者でもありませんでした。この頃のアプリケーションサーバの実装はWebコンテナとEJBコンテナのプロセスが分かれているものが大 多数であり、同一OS上に2つのコンテナが存在していてもJVMをまたがるリモート通信が必要でした。

この理由として、多くのベンダーはCORBAサーバをEJBサーバへと進化させたものが多かったためです。中には同一JVM内で2つのコンテナが動作するアプリケーションサーバも存在し、さらに呼び出しを参照呼出しとして(仕様では値呼び出し)、EJBのメソッドコールを最適化している実装もありました。

トランザクションに関してはEJB 1.1からうまく動作していました。Java EEのトランザクション仕様である「JTS(Java Transaction Service)」は、CORBA OTS(Object Transaction Service)のJava版という点とトランザクションの考え方、標準化団体X/Open(現、The Open Group)の分散トランザクション仕様であるDTP(Distributed Transaction Processing)モデルをベースとしていたため、それほど新しい考え方ではなかったためです。

またコンテナ管理トランザクションとセッションファサードパターンを適用した場合、これをトランザクションファサードと置き換えて考えることにより、適度なビジネスロジックの公開単位とトランザクション単位をリンクさせることができました。この頃からSunで作成されたJ2EEのデザインパターンが世の中に浸透し、適用されていきました。



人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30