Grails/Groovyの活用タイトル画像

Grails/Groovyとは?

Groovyとは?

Groovyは、Java VM(*1)上で動作する動的なスクリプト言語です。 他のスクリプト言語と比較すると、Javaとの親和性が高いことが大きな特長です。たとえば、Groovyの構文はJavaと上位互換であり、Javaでの開発経験やスキルをそのまま生かすことができます。GroovyはJavaの欠点を補い、併用することで最大の効果を発揮する言語です。

*1 Java VM:Java Virtual Machine, Java仮想計算機。Javaアプリケーションを実行するための基盤ソフトウェアのことです。
Groovyの特長は多くありますが、主なものとして以下の2点について説明します。

特長1:簡潔な記述 特長2:Javaとの親和性が高い

Groovyの特長1:簡潔な記述

Groovyの言語としての特長の一つは、本質的な処理のみを記述することによる簡潔さです。
例えば、「テキストファイルの中の単語の出現回数を数える」というワードカウント処理のコードを比較すると、Javaで記述すると、約40行であったコードがGroovyでは4行で記述できます。一般に、Java比で1/4~1/10程度のコード量削減が可能と考えています。

Groovyの特長1:簡潔な記述

簡潔さがもたらすメリット

  • ファイルサイズが小さくなります。
  • 本質的な処理のみを記述できるため、誰の目にもコードの意図が理解しやくすなり、開発効率や保守性も大きく向上します。
  • コード量が減ることでバグが紛れ込みにくくなり、可読性も向上するため、バグが見つけやすくなります。

記述が簡潔になる理由
1.各種の省略が可能であること
Javaと比べると、Groovyではさまざまな省略が可能 (クラス定義、mainメソッド定義、文末のセミコロン、System.outの指定、引数の括弧、例外宣言、型宣言、import宣言、getter/setterの定義など)です。

2.強力な言語機能
Groovyでは、クロージャー、メタプログラミング、演算子定義、AST変換などの言語機能を備えており、複雑なロジックを簡潔に記述することに貢献します。

3.高機能なライブラリ
Groovyのライブラリ(Groovy JDK)はJava APIに対して追加する形で広範な機能追加がなされています。集合操作や高階関数操作、デザインパターンを実現するもの、細粒度並列処理など多岐に渡る標準ライブラリが同梱されており、用途にマッチすれば劇的なコード量削減が望めます。

Groovyの特長2:Javaとの親和性が高い

Groovyは、Javaとの親和性が非常に高い言語です。他の言語と比してGroovyが卓越しています。その理由を3つ説明します。

文法
Groovyは、Javaに対する上位互換の言語です。正しいJavaコードは、基本的には正しいGroovyコードとなります。例えば、Javaのソースファイルの拡張子を.javaから.groovyに変更するだけでそのままコンパイルせずにGroovyコードとして実行が可能となります(*2)
従って、Java開発者にとって初期学習コストはほぼゼロということであり、すぐにGroovyコードを書き始めることができます。


*2 実行が可能となります 一部例外もあります。たとえば、配列の初期化、do-while文、for文中のカンマ演算子、equalsの意味、接尾辞無しの浮動小数点数の扱いなどについては上位互換ではありません。

クラスライブラリ(標準API)
Groovyでは、Javaのクラスライブラリをできる限り踏襲し、使えるものはなるべくそのまま使い、極力Groovy独自の世界を作らないように設計されています。たとえば、Groovy専用のコレクションクラス群というものはなく、Java APIのコレクションクラスを使用します。また、ラッパー(2つの言語を取り持つような中間層)は使用しません。

相互運用
Groovyコードは常にJavaクラスにコンパイルされた上でJava VM上で実行されます。Java VMから見てGroovyコードは普通のJavaクラスです。この結果、JavaとGroovyのコードは相互に呼び出すことはもとより、継承することもできます。セキュリティモデルの仕組みなども共通です。
Groovyコードはクラスファイルに事前にコンパイルしておくこともできるので、classファイルとしてのバイナリ互換もあり、既存のJavaシステムと連携させることは容易です。たとえば、以下のようにJavaとGroovyを併用することができます。

Groovyの特長2:JavaとGroovyを併用することができる

Groovyの適用パターン

Groovyを開発に適用する際のパターンを分類すると、主なものは以下のようになります。

  • Javaのコンポーネントやフレームワークを、Groovyコードが糊(グルー)としてつなぎあわせる
  • 中核となるビジネスロジックをGroovy/DSLで書けるようにして、コンパイルなしでロジックを差し替えられるようにする。
  • Javaのライブラリをラッピングして、Groovyらしく簡潔に利用できるようにする。
  • 実行時に外部から接続してGroovyスクリプトを実行できるようにする。
  • 全部Groovyで書く。
  • 周辺の各種支援スクリプトをGroovyで書く。
  • Groovyコードを背後で変換し、多種多様な処理を行なわせる。

このように、Groovyの適用はさまざまな方法で行うことができます。これらは、Dierk Koenig氏が提唱している、「Groovyの7つの適用パターン」を要約したものです。詳しくは参考資料をご覧ください
当社での適用例はこちら

Grailsとは?

Grailsは、Groovyを使用して開発を行うWebアプリケーションフレームワークです。
Grailsは、高い生産性を達成することで著名となった、RubyベースのフレームワークRuby On Rails(RoR)にインスパイアされて開発されたものです。そのため、RoRと共通する特長を多く備えています。さらに、GrailsはJava EEに基づいており、産業レベルで鍛えられたJavaのインフラストラクチャ上でRoRレベルの生産性を実現しています。

Grailsの主な特長は以下のとおりです。

フルスタック Grailsは、Webアプリケーション開発に必要なフレームワークやライブラリなどを「ベストプラクティス」として組み合わせ検証されたものをオールインワンで提供します。Grailsに標準で含まれているフレークワークやライブラリは以下の通りです。

 Webアプリケーションサーバ Embedded Tomcat
 ORマッピング Hibernate
 データベース H2
 レイアウトエンジン SiteMesh
 ロギング Log4j
 ビルドスクリプティング Ant
 テスト JUnit

上記以外のさまざまな機能(ライブラリ、フレームワークなど)が、プラグインとして提供されており、1つのコマンド入力でダウンロードしてアプリケーションに組み込むことができます。

GroovyベースのDSLでロジックと設定を記述
Grailsでの開発では、Webアプリケーションの構成要素(モデル、ビュー、コントローラなど)を、それぞれの記述に適した専用の記法で記述していきます。 これらの記述は、Groovyの特長の一つである「表記方法をカスタマイズし、特定の問題を記述するのに適した専用記法(DSL)を作り出す」機能を駆使して実現されています。DSLは、その対象となる処理を書き下すことに専門特化しており、準備処理や定型処理を省略でき、直感的に記述・理解できるように設計されています。

Scaffold機能
GrailsのScaffold機能とは、Web+DBアプリにおいて典型的な「CRUD処理」を行うコード群を自動生成するものです。CRUDとは、データベース中のデータ項目に対するCreate, Read, Update, Delete(追加、読み込み、更新、削除)処理のことです。開発の際には自動生成されたCRUD処理のコード(Scaffold)を参考にして、適宜カスタマイズしてコードに組み込めます。CRUD処理は頻出する基本的な処理なので、開発効率を高めることができます。 また、Scaffoldで生成されたコードを、そのままアプリケーションの一部としても利用できる場合もあります。

以下はScaffoldで生成された、データベースの内容を編集する画面です。

Scaffoldで生成された、データベースの編集画面

プラグイン機構
Grailsのプラグインは、開発するアプリケーションに組み込んで使える拡張モジュールです。Linuxにおけるパッケージ管理システムのように、モジュール間の依存性を管理しつつ、1つのコマンド入力でプラグインをリポジトリからダウンロードしてアプリケーションに組み込んで利用できるようになります。Grailsの公式プラグインリポジトリには、豊富なプラグイン群が登録されており、日々増加しています(2012年時点で727個)。
たとえば、Twitter連携プラグインや、データベースの内容をCSVでエクスポート・インポートするもの、認証・認可を行うものなど、多種多様なプラグインが揃っており、ダウンロードして利用できます。
プラグインは利用するだけではなく、アプリケーションの機能をプラグインとして切り出して、再利用部品として蓄積していくこともできます。Grailsプラグインの作成はアプリケーションの開発と類似しており、容易です。

Grailsによる開発効率向上

Grailsの特長の多くは、開発速度を加速します。Grailsでの開発では、冗長で定型的な作業やコーディングを排し、本質的な部分のみ、重複なく、ルールに従って記述していくので、状況の変化に対して迅速にコードの追加や変更ができます。また、最新版であるGrails 2.0ではテストのための機構も充実してきています。

ソリューション・製品一覧へ