id:nobuoka (@nobuoka)
2014-05-03 Kyoto.なんか
Java による Web アプリケーションの
プロトタイプのために最近使っている構成
動かすことができた!!!!!
が、パフォーマンス的に厳しい
空ファイルのコンパイルに 3 分
メモリ 1.7 GB 使用
Web アプリケーションの記述
Perl!!!!
いいところもあるけどつらい!!!!
変数に型がない
はまりどころが多い
柔軟であるが故に
保守性が低くなりがち
データ型が十分でない
というわけで、最近は
Web アプリケーションを Java で書いてる。
プロトタイピングに使用している
構成を紹介。
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly (HTTP サーバー)
● Java NIO による非同期 I/O。 スケーラブル。
● HTTP 以外のプロトコルも扱える汎用ネットワーク
エンジン。
● 同様のものに Play! Framework で使われている
Netty など。
●
後述の Jersey アプリケーションを動かせる非
サーブレットコンテナな HTTP サーバーとして選
択。
● プログラム上で起動させたり停止させたり。
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey (JAX-RS 実装)
● JAX-RS: Java API for RESTful Web Services。
– Java EE に含まれている。
– サーブレットコンテナ内でもそれ以外でも。
● リクエスト URI から呼び出しメソッド決定; リクエス
トパラメータやレスポンスをいい感じに処理。
– POJO → JSON の変換とか。
● アノテーション使いまくり。
● Jersey は JAX-RS 2.0 の参照実装。
– ドキュメントが読みやすく、癖もなくて扱いやすい。
リソースクラス、リソースメソッド
@Path("/sample")
public class SampleResource {
@Path("/{id}")
@GET
@Produces("text/plain; charset=utf-8")
public Response getSample(
@PathParam("id") String id) {
return Response.ok("Sample " + id).build();
}
}
Grizzly 上で動かす
URI u = UriBuilder.fromUri("http://localhost/").
port(10082).build();
ResourceConfig conf = new ResourceConfig();
conf.register(SampleResource.class);
HttpServer server =
GrizzlyHttpServerFactory.createHttpServer(
u, conf);
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink (ORM; JPA 実装)
● JPA: Java Persistence API。
– Java SE、Java EE 環境用の ORM。
● 設定ファイルやクラス定義から自動的に DB、
テーブルを生成可能。
● アノテーション使いまくり。
● EclipseLink は JPA 2.1 の参照実装。
– Hibernate の方が web 上の情報は多そうだけど、多
機能で複雑そうなので EclipseLink を選択。
● Jersey の DI 機能でインジェクションしてる。
エンティティクラス
@Entity
@Table(name="sample_user")
public class SampleUser implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private long id;
public long getId() { return id; }
@Column(name="name")
private String name;
public String getName() { return name; }
protected SampleUser() {}
public SampleUser(String name) {
this.name = name;
}
}
EntityManager による操作
// EntityManager em;
// 永続化
em.getTransaction().begin();
SampleUser u = new SampleUser("nobuoka");
em.persist(u);
em.getTransaction().commit();
// 取得
SampleUser u = em.find(SampleUser.class, u.getId());
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
Derby (RDBMS)
● Java で書かれた RDB 管理システム。
– Derby ベースの Java DB が JDK に含まれている。
● SQLite のようにアプリケーション内で RDBMS を
動かせる。
● ディレクトリを指定して DB を作成。
● トランザクション機能などもある。
●
Pure Java なので外の何かに依存することもない
し、プロトタイピングの際に扱いやすい。
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
Derby
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
Derby
Velocity (テンプレートエンジン)
● 汎用のテンプレートエンジン。
● VLT という独自言語を使用して記述。
● パフォーマンスや扱いやすさなどを考慮して
Velocity を選択。
●
とはいえすごく良いテンプレートエンジンかという
とそうではないのでもうちょっと何とかしたい。
● Java 8 の機能を活用していい感じのものできない
かなーと最近考えたりしてる。
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
Derby
Velocity
雑感
● Grizzly + Jersey (JAX-RS) の組み合わせは本番
用でそのまま使えそう。
● EclipseLink (JPA) と Velocity も本番で使って良さ
そうだけど、他の選択肢もある。
– DB 周りに関しては Hibernate も良さそう?
– 自前で JDBC 操作とか。
● Derby はプロトタイプ用という感じ。
– EclipseLink による DB、テーブル自動生成と組み合わ
せて、プロトタイピング時に扱いやすくて重宝する。

Java による Web アプリケーションのプロトタイプのために最近使っている構成