java による web...
DESCRIPTION
2014 年 5 月 3 日に開催された 「Kyoto.なんか」 で喋った内容です。TRANSCRIPT
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、テーブル自動生成と組み合わ
せて、プロトタイピング時に扱いやすくて重宝する。