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

6,127 views
5,946 views

Published on

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

Published in: Software
0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,127
On SlideShare
0
From Embeds
0
Number of Embeds
2,536
Actions
Shares
0
Downloads
22
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide

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

  1. 1. id:nobuoka (@nobuoka) 2014-05-03 Kyoto.なんか Java による Web アプリケーションの プロトタイプのために最近使っている構成
  2. 2. 動かすことができた!!!!! が、パフォーマンス的に厳しい 空ファイルのコンパイルに 3 分 メモリ 1.7 GB 使用
  3. 3. Web アプリケーションの記述 Perl!!!! いいところもあるけどつらい!!!! 変数に型がない はまりどころが多い 柔軟であるが故に 保守性が低くなりがち データ型が十分でない
  4. 4. というわけで、最近は Web アプリケーションを Java で書いてる。 プロトタイピングに使用している 構成を紹介。
  5. 5. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS
  6. 6. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS
  7. 7. Grizzly (HTTP サーバー) ● Java NIO による非同期 I/O。 スケーラブル。 ● HTTP 以外のプロトコルも扱える汎用ネットワーク エンジン。 ● 同様のものに Play! Framework で使われている Netty など。 ● 後述の Jersey アプリケーションを動かせる非 サーブレットコンテナな HTTP サーバーとして選 択。 ● プログラム上で起動させたり停止させたり。
  8. 8. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly
  9. 9. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly
  10. 10. Jersey (JAX-RS 実装) ● JAX-RS: Java API for RESTful Web Services。 – Java EE に含まれている。 – サーブレットコンテナ内でもそれ以外でも。 ● リクエスト URI から呼び出しメソッド決定; リクエス トパラメータやレスポンスをいい感じに処理。 – POJO → JSON の変換とか。 ● アノテーション使いまくり。 ● Jersey は JAX-RS 2.0 の参照実装。 – ドキュメントが読みやすく、癖もなくて扱いやすい。
  11. 11. リソースクラス、リソースメソッド @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(); } }
  12. 12. Grizzly 上で動かす URI u = UriBuilder.fromUri("http://localhost/"). port(10082).build(); ResourceConfig conf = new ResourceConfig(); conf.register(SampleResource.class); HttpServer server = GrizzlyHttpServerFactory.createHttpServer( u, conf);
  13. 13. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly Jersey
  14. 14. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly Jersey
  15. 15. EclipseLink (ORM; JPA 実装) ● JPA: Java Persistence API。 – Java SE、Java EE 環境用の ORM。 ● 設定ファイルやクラス定義から自動的に DB、 テーブルを生成可能。 ● アノテーション使いまくり。 ● EclipseLink は JPA 2.1 の参照実装。 – Hibernate の方が web 上の情報は多そうだけど、多 機能で複雑そうなので EclipseLink を選択。 ● Jersey の DI 機能でインジェクションしてる。
  16. 16. エンティティクラス @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; } }
  17. 17. 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());
  18. 18. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly Jersey EclipseLink
  19. 19. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly Jersey EclipseLink
  20. 20. Derby (RDBMS) ● Java で書かれた RDB 管理システム。 – Derby ベースの Java DB が JDK に含まれている。 ● SQLite のようにアプリケーション内で RDBMS を 動かせる。 ● ディレクトリを指定して DB を作成。 ● トランザクション機能などもある。 ● Pure Java なので外の何かに依存することもない し、プロトタイピングの際に扱いやすい。
  21. 21. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly Jersey EclipseLink Derby
  22. 22. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly Jersey EclipseLink Derby
  23. 23. Velocity (テンプレートエンジン) ● 汎用のテンプレートエンジン。 ● VLT という独自言語を使用して記述。 ● パフォーマンスや扱いやすさなどを考慮して Velocity を選択。 ● とはいえすごく良いテンプレートエンジンかという とそうではないのでもうちょっと何とかしたい。 ● Java 8 の機能を活用していい感じのものできない かなーと最近考えたりしてる。
  24. 24. HTTP サーバー ルーティング リクエスト処理 / レスポンス生成 ドメインロジック アプリケーション処理 HTML 生成 テンプレートエンジン ドメインモデル ORM RDBMS Grizzly Jersey EclipseLink Derby Velocity
  25. 25. 雑感 ● Grizzly + Jersey (JAX-RS) の組み合わせは本番 用でそのまま使えそう。 ● EclipseLink (JPA) と Velocity も本番で使って良さ そうだけど、他の選択肢もある。 – DB 周りに関しては Hibernate も良さそう? – 自前で JDBC 操作とか。 ● Derby はプロトタイプ用という感じ。 – EclipseLink による DB、テーブル自動生成と組み合わ せて、プロトタイピング時に扱いやすくて重宝する。

×