
GMOとくとくショップはJavaで構築されており、DIコンテナの「Spring Framework」をベースに、Webアプリケーションフレームワークに「Struts2」、DBアクセスについては「iBATIS」、またDBのキャッシュ機構として「Ehcache」を使用しています。それぞれの特徴と利用方法について説明していきます。
Struts2は、Javaで使用されるWebアプリケーションフレームワークです。Webアプリケーションの開発においてよく利用されてきたフレームワークにStrutsがありますが、Struts2ではコードがよりシンプルに記述できるようないくつかの工夫が盛り込まれています。以下にStruts2の特徴とGMOとくとくショップでの使用方法について整理します。
A.MVCパターン
Struts2は、Model、View、Controllerの3つのレイヤーに分けてアプリケーションを実装するMVCアーキテクチャを採用しています。各レイヤーの特徴を、Controller、Model、Viewの処理の順序に従って説明します。
Controller
Controller はHTTPリクエストを制御しますが、Struts2ではここにフィルタを使用し、ビジネスロジックの前処理・後処理としてInterceptorというレイヤーを定義できます。Interceptorは、AOP(アスペクト指向プログラミング:Aspect Oriented Programing)のように、様々なビジネスロジックで横断的に使用される共通処理をモジュール化する仕組みです。この仕組みによって、共通処理とロジックを切り離し、機能の柔軟な追加・修正に対応できるようになるメリットがあります。ControllerがサーブレットであったStrutsとはこの点が大きく異なっています。GMOとくとくショップでは、Interceptorによって、リクエストパラメータのセットや、ユーザエージェントの判定、クッキー関連処理、ログインチェックなどを実装しています。
Model
Modelにはリクエストから渡された値や処理結果が保持されますが、Struts2では基本的にビジネスロジックを制御するActionのクラス内に全てのプロパティを保持します。これにはシンプルなクラス構成になるというメリットがありますが、ロジックのクラスの中にすべての変数のsetter/getterを記述すると変数が多いケースではクラスの記述が冗長になってしまうという問題もあります。GMOとくとくショップではパラメータ群を別オブジェクトに持たせ、ロジックとは分離する構成をとることで、可読性を向上させています。
ビジネスロジックを記述したActionクラスは、POJO(Plain Old Java Object。規約や継承などに縛られない普通のJavaオブジェクト)として作成可能です。原則的に継承が必要であったStrutsとは異なり、POJOにすることにより単体テストが容易になるというメリットがあります。
View
Struts2では、結果を表示するViewとして、JSPと、テンプレートエンジンのVelocity、またはFreeMarkerが利用できます。テンプレートエンジンはテンプレートと呼ばれる雛形にデータを当て込み、HTMLを出力する仕組みです。Viewに変数や処理結果の出力を行うための式言語にはOGNL(Object Graph Navigation Language)を使用できます。GMOとくとくショップでは、最も高速に動作するFreeMarkerを採用しています。またViewにはカスタムタグを利用できます。カスタムタグはタグを拡張し独自の処理を定義できる仕組みです。GMOとくとくショップでは、独自に定義したカスタムタグにより、各画面遷移用のURLの生成処理と、画像表示に必要ないくつかの共通処理を行わせています。
B.DI(Dependency Injection)コンテナ機能(Spring Frameworkについて)
DIは、オブジェクトの生成に必要な情報を外部から注入することを可能にしたデザインパターンで、コンポーネントの再利用性を高めるメリットがあります。Spring FrameworkはDIのコンテナとしてクラス間の依存関係の設定に利用できるフレームワークです。Struts2ではSpringプラグインを利用することにより、Spring Frameworkを使うことができます。
特にSpring Frameworkのバージョン2.5から、アノテーションのサポートにより機能が強化されています。アノテーションはJavaのソースコード内部に書くことができる脚注の機能です。これを利用することで、XMLを使用しなくとも設定値の記述が可能となるというメリットがあります。GMOとくとくショップでは各ソースコードのアノテーションの記述によって、依存性注入や、コンポーネント自動検出、ライフサイクルの管理などを行っており、従来のSpringで必要とされたXMLの記述を大幅に削減しています。
iBATISは、JavaのDBアクセスのフレームワークです。これにはO/RマッパーとDaoの機能が含まれています。O/Rマッパーは、DBの項目とSQL処理結果を格納するJavaのクラスとの関連性を定義し共通化する仕組みです。
またDaoは、JavaのソースコードからSQLを分離し、動的なSQLの構築等の処理を共通化する機能です。DBアクセスに関するフレームワークはいくつかありますが、iBATISはSQLを直接XMLに記述するという特徴があるため、パフォーマンスチューニングなどが柔軟に対応できるというメリットを持っています。
EhcacheはDBへの問い合わせ結果をメモリ上に保持する仕組みです。1回問い合わせた結果は一定時間メモリ上に保持されるため、アプリケーションとDBのやり取りを減らすことができます。これにより同じリクエストに関しては非常に高速にレスポンスを返すことができるようになるというメリットがあります。
GMOとくとくショップでは、効率的にキャッシュが利用されるようにXMLにて制限を設定しています。第一に、maxElementsInMemoryにてメモリで格納するオブジェクトの個数を制限しています。キャッシュは可能な限りメモリで格納していますが、メモリが最大値に達したあとはoverflowToDiskの設定によりディスクへ書き出しています。ディスクへ書き出した場合はメモリに比べるとパフォーマンスは落ちますが、再度問い合せるよりも高速に動作します。
第二に、timeToLiveSecondsの値を設定することにより、一定時間が過ぎるとキャッシュが自動的に消去され、古いキャッシュは適宜更新されるようになっています。また、DBへの問い合わせ結果だけでなく、検索エンジンSolrへの問い合わせ結果もキャッシュとして保持するように設定しています。
Ehcache は、RMI を使用してキャッシュされたオブジェクトをサーバー間でレプリケーションすることも可能です。あるアプリケーションサーバのキャッシュにデータを格納すると連携する他のアプリケーションサーバのキャッシュへデータを転送します。アプリケーションサーバ全体として処理を高速化でき、DB、およびSolrへの負荷を軽減できるというメリットがあります。
「GMOとくとくショップ」は、今後もパフォーマンスとユーザビリティの向上のために最新のテクノロジーを積極的に導入していく予定です。
最後に…次世代システム研究室ではクラウドを作りたいエンジニアを募集しています。ご興味がある方はこちらからエントリーをお願いします。
- 【第2回】「GMOとくとくショップ」オープンにあたって - GMOとくとくショップと最新テクノロジー -
- 【第7回】「GMOとくとくショップ」に組み込まれたテクノロジー(前編)- Hadoopをどのように利用しているか? -
- 【第7回】「GMOとくとくショップ」に組み込まれたテクノロジー(後編)- Hadoopを使った構築方法やチューニングポイント、運用管理 -
- 【第10回】「GMOとくとくショップ」ではどのようにMySQLクラスターを利用しているか?(前編)- MySQLクラスターの仕組みについて -
- 【第10回】「GMOとくとくショップ」ではどのようにMySQLクラスターを利用しているか?(後編)- MySQLクラスター構築方法と運用管理 -
- 【第13回】「GMOとくとくショップ」で利用しているEucalyptusとは?(前編)- Eucalyptusの仕組みについて -
- 【第13回】「GMOとくとくショップ」で利用しているEucalyptusとは?(後編)- Eucalyptusの構築や運用管理について -
- 【第16回】「GMOとくとくショップ」のHadoop集計-Hiveの利用方法-(前編)- Hiveをどのように利用しているか? -
- 【第16回】「GMOとくとくショップ」のHadoop集計-Hiveの利用方法-(後編)- 実際に使用しているHiveQLについて -
*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。



























