アノテーションと夢100でのアノテーション使用事例 | GCREST_engineerのブログ

GCREST_engineerのブログ

ブログの説明を入力します。

今回は、サーバ側のトピックについて触れたいと思います。
アプリケーションサーバでは、APIやDBへの処理など多くのクラスやメソッド、共通処理を書いて実装する必要があります。
夢100のサーバ側はjavaを使っています。
javaで開発をするにあたって便利な機能である"アノテーション"について紹介します。


そもそもアノテーションって何?

Java SE 5で追加された機能です。
javaでは、「@ + アノテーション名」という形でクラスやメソッド、パッケージに対してメタデータとして付加情報を記入します。

javaに標準搭載されているアノテーションは下記のようなものがあります。

@Override
そのメソッドがスーパークラスのメソッドをオーバーライドしている事を宣言します。
このアノテーションがついている場合、オーバーライドしていないとコンパイルエラーに
なるので、メソッド名のスペルミスがあったり引数が違ったりした場合エラーになります。

@Deprecated
そのメソッドが非推奨である事を宣言します。
このアノテーションがついたメソッドを使用するとコンパイル時に警告が出ます。

@SuppressWarnings
コンパイラが出す警告を抑制するアノテーションです。


どうやって使うの?

上記の標準アノテーションはどちらかというとコーディングの補助をしてくれる機能です。
ここからは処理中にアノテーションを取得する方法を書いていきます。

javaのアノテーションの特徴として、プログラムの実行中にメタデータを処理する事ができます。
つまり、クラスやメソッドに対して独自に作成したアノテーションを付与することで、
その処理に対して共通の振る舞いを実装させる事が可能になります。

まずはアノテーションの作成方法です。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface HogeAnnotation {

}

上記のように@interfaceと記述しアノテーションの名前を記述します。

@Retention
アノテーションを使用出来る範囲を定義します。

RetentionPolicy.SOURCE
⇛ソース内のみ。コンパイルすると、classファイル内にはそのアノテーションの情報は残らない。

RetentionPolicy.CLASS
⇛@Retentionが省略された場合のデフォルト値になります。
コンパイルしたclassファイル内にそのアノテーションの情報が保持されるが、実行時には読み込まれません。

RetentionPolicy.RUNTIME
⇛実行する際にもJavaVMにそのアノテーションの情報が読み込まれる。
リフレクションを用いてその情報を取得することが可能です。
※今回の例では処理実行中にアノテーションを使用するためこちらを指定します。

@Target
アノテーションがどの要素(クラスやメソッドなど)に対して適用することができるかを定義します。
※今回の例ではメソッドに適用するためElementType.METHODを指定します。

次は処理の中でアノテーションを取得し判定をさせます。
今回の例では特定のクラスのメソッドに指定したアノテーションが付与されているかどうか。

チェック用のクラスを用意します。
public class Test {
private void test1() {}

@HogeAnnotation
private void test2() {}
}

以下実行用処理
public class AnnotationTest {

public static void main(String[] args) {
Class<?> test = Test.class;
Method[] testMethods = test.getDeclaredMethods();
for (Method method : testMethods) {
checkHogeAnnotation(method);
}
}

private static void checkHogeAnnotation(Method method) {
HogeAnnotation hogeCheck = method.getAnnotation(HogeAnnotation.class);
if (hogeCheck != null) {
System.out.println(method.getName() + "にはHogeAnnotationが付与されてますよ");
} else {
System.out.println(method.getName() + "にはHogeAnnotationは付与されてませんよ");
}
}
}

実行結果
test1にはHogeAnnotationは付与されてませんよ
test2にはHogeAnnotationが付与されてますよ

このようにどのアノテーションがついているかで処理を制御する事ができます。
実際プロジェクトで使用する場合は共通して呼び出せるよう工夫する必要はありますが、
※struts等ではインターセプターで呼び出す等
アノテーションの付与で処理の振る舞いを変える事ができます。


夢100でのアノテーション使用事例紹介

では、アノテーションを利用して夢100ではどういう機能を実装しているか一部ですが紹介します。
※フレームワークの機能を利用しているので実装は省きます。

ヒストリーログへの出力
DAOクラスにアノテーションを付与するだけで、
DBに出力していたデータをログファイルに出力するように切り替える事ができる。
※insertしか呼び出していない等の制限は有り。

チェック処理の有無
アノテーションを付与する事で、該当APIに対してチェック処理を適用するかどうか設定できます。
チェックのやるやらないの設定をアノテーションの付与だけで制御することが可能です。

一括で各テーブルからデータ取得したい場合の対象処理選定
各DAOクラスのメソッドにアノテーションを付与すると、
該当処理を呼び出した際にそのメソッドを一括で呼び出す事が出来ます。

強制的にマスタDBに向けたい時
夢100ではDBをmaster/slave構成にしています。 基本的にトランザクションが開始されるまでの参照はslaveに向くようになっていますが、
強制的にmaster側のDBに問い合わせしたい処理がある場合は対象メソッドに
アノテーションを付与するだけでmasterに向ける事ができます。


終わりに

上記で挙げたような機能を実現する際、アノテーションを活用しない場合、
新たな処理を実装する度にメソッドを組み込んだりしないといけません。
アノテーションを上手く利用すれば、クラスやメソッドにアノテーションを付与するだけその機能を実現できます!!
便利ですね!!

実際プロジェクトに組み込む際はどう設計したらいいのか考慮する必要はありますが、
上手く使用すれば大幅な工数削減に繋がります。
アノテーション、是非活用してみてください!!