26
id:nobuoka (@nobuoka) 2014-05-03 Kyoto.なんか Java による Web アプリケーションの プロトタイプのために最近使っている構成

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

Embed Size (px)

DESCRIPTION

2014 年 5 月 3 日に開催された 「Kyoto.なんか」 で喋った内容です。

Citation preview

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

id:nobuoka (@nobuoka)

2014-05-03 Kyoto.なんか

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

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

動かすことができた!!!!!

が、パフォーマンス的に厳しい

空ファイルのコンパイルに 3 分メモリ 1.7 GB 使用

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

Web アプリケーションの記述

Perl!!!!いいところもあるけどつらい!!!!

変数に型がない

はまりどころが多い柔軟であるが故に保守性が低くなりがち

データ型が十分でない

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

というわけで、最近はWeb アプリケーションを Java で書いてる。

プロトタイピングに使用している構成を紹介。

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

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

Grizzly (HTTP サーバー)

● Java NIO による非同期 I/O。 スケーラブル。● HTTP 以外のプロトコルも扱える汎用ネットワーク

エンジン。● 同様のものに Play! Framework で使われている

Netty など。● 後述の Jersey アプリケーションを動かせる非

サーブレットコンテナな HTTP サーバーとして選択。

● プログラム上で起動させたり停止させたり。

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

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

Jersey (JAX-RS 実装)

● JAX-RS: Java API for RESTful Web Services。– Java EE に含まれている。

– サーブレットコンテナ内でもそれ以外でも。

● リクエスト URI から呼び出しメソッド決定; リクエストパラメータやレスポンスをいい感じに処理。– POJO → JSON の変換とか。

● アノテーション使いまくり。● Jersey は JAX-RS 2.0 の参照実装。

– ドキュメントが読みやすく、癖もなくて扱いやすい。

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

リソースクラス、リソースメソッド

@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(); }}

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

Grizzly 上で動かす

URI u = UriBuilder.fromUri("http://localhost/"). port(10082).build();ResourceConfig conf = new ResourceConfig();conf.register(SampleResource.class);

HttpServer server = GrizzlyHttpServerFactory.createHttpServer( u, conf);

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

Jersey

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

Jersey

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

EclipseLink (ORM; JPA 実装)

● JPA: Java Persistence API。– Java SE、Java EE 環境用の ORM。

● 設定ファイルやクラス定義から自動的に DB、テーブルを生成可能。

● アノテーション使いまくり。● EclipseLink は JPA 2.1 の参照実装。

– Hibernate の方が web 上の情報は多そうだけど、多機能で複雑そうなので EclipseLink を選択。

● Jersey の DI 機能でインジェクションしてる。

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

エンティティクラス

@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; }}

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

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());

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

Jersey

EclipseLink

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

Jersey

EclipseLink

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

Derby (RDBMS)

● Java で書かれた RDB 管理システム。– Derby ベースの Java DB が JDK に含まれている。

● SQLite のようにアプリケーション内で RDBMS を動かせる。

● ディレクトリを指定して DB を作成。● トランザクション機能などもある。● Pure Java なので外の何かに依存することもない

し、プロトタイピングの際に扱いやすい。

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

Jersey

EclipseLink

Derby

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

Jersey

EclipseLink

Derby

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

Velocity (テンプレートエンジン)

● 汎用のテンプレートエンジン。● VLT という独自言語を使用して記述。● パフォーマンスや扱いやすさなどを考慮して

Velocity を選択。● とはいえすごく良いテンプレートエンジンかという

とそうではないのでもうちょっと何とかしたい。● Java 8 の機能を活用していい感じのものできない

かなーと最近考えたりしてる。

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

HTTP サーバー

ルーティングリクエスト処理 / レスポンス生成

ドメインロジックアプリケーション処理

HTML 生成テンプレートエンジン

ドメインモデルORM

RDBMS

Grizzly

Jersey

EclipseLink

Derby

Velocity

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

雑感

● Grizzly + Jersey (JAX-RS) の組み合わせは本番用でそのまま使えそう。

● EclipseLink (JPA) と Velocity も本番で使って良さそうだけど、他の選択肢もある。– DB 周りに関しては Hibernate も良さそう?

– 自前で JDBC 操作とか。

● Derby はプロトタイプ用という感じ。– EclipseLink による DB、テーブル自動生成と組み合わ

せて、プロトタイピング時に扱いやすくて重宝する。