GMOインターネット株式会社
ホーム > GMO最新ネット業界レポート一覧 > GMO最新ネット業界レポート

企業情報

GMO最新ネット業界レポート

第19回 テクノロジー編
GMOインターネット株式会社 次世代システム研究室 室長 堀内敏明。2009年11月24日、新しいショッピングガイドサイト「GMOとくとくショップ」をオープンし、既存の大手インターネット会社のショッピングガイドサイトと異なった、最新テクノロジーを多数盛り込んでいるのが特徴。今回は、「GMOとくとくショップ」で利用しているアプリケーションフレームワークについて説明する。

GMOとくとくショップはJavaで構築されており、DIコンテナの「Spring Framework」をベースに、Webアプリケーションフレームワークに「Struts2」、DBアクセスについては「iBATIS」、またDBのキャッシュ機構として「Ehcache」を使用しています。それぞれの特徴と利用方法について説明していきます。

1.Struts2、およびSpring Frameworkについて

図1 Sratus2 Spring Frameworkのイメージ

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の記述を大幅に削減しています。

2.iBATISについて

図2 iBATISとEhcacheのイメージ

iBATISは、JavaのDBアクセスのフレームワークです。これにはO/RマッパーとDaoの機能が含まれています。O/Rマッパーは、DBの項目とSQL処理結果を格納するJavaのクラスとの関連性を定義し共通化する仕組みです。

またDaoは、JavaのソースコードからSQLを分離し、動的なSQLの構築等の処理を共通化する機能です。DBアクセスに関するフレームワークはいくつかありますが、iBATISはSQLを直接XMLに記述するという特徴があるため、パフォーマンスチューニングなどが柔軟に対応できるというメリットを持っています。

3.Ehcacheについて

EhcacheはDBへの問い合わせ結果をメモリ上に保持する仕組みです。1回問い合わせた結果は一定時間メモリ上に保持されるため、アプリケーションとDBのやり取りを減らすことができます。これにより同じリクエストに関しては非常に高速にレスポンスを返すことができるようになるというメリットがあります。

GMOとくとくショップでは、効率的にキャッシュが利用されるようにXMLにて制限を設定しています。第一に、maxElementsInMemoryにてメモリで格納するオブジェクトの個数を制限しています。キャッシュは可能な限りメモリで格納していますが、メモリが最大値に達したあとはoverflowToDiskの設定によりディスクへ書き出しています。ディスクへ書き出した場合はメモリに比べるとパフォーマンスは落ちますが、再度問い合せるよりも高速に動作します。

第二に、timeToLiveSecondsの値を設定することにより、一定時間が過ぎるとキャッシュが自動的に消去され、古いキャッシュは適宜更新されるようになっています。また、DBへの問い合わせ結果だけでなく、検索エンジンSolrへの問い合わせ結果もキャッシュとして保持するように設定しています。

Ehcache は、RMI を使用してキャッシュされたオブジェクトをサーバー間でレプリケーションすることも可能です。あるアプリケーションサーバのキャッシュにデータを格納すると連携する他のアプリケーションサーバのキャッシュへデータを転送します。アプリケーションサーバ全体として処理を高速化でき、DB、およびSolrへの負荷を軽減できるというメリットがあります。

「GMOとくとくショップ」は、今後もパフォーマンスとユーザビリティの向上のために最新のテクノロジーを積極的に導入していく予定です。

最後に…次世代システム研究室ではクラウドを作りたいエンジニアを募集しています。ご興味がある方はこちらからエントリーをお願いします。

2010.6.16


*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。

 

Copyright (C) GMO Internet, Inc. All Rights Reserved.