Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 で使われている
Nett...
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey (JAX-RS 実装)
● JAX-RS: Java API for RESTful Web Services。
– Java EE に含まれている。
– サーブレットコンテナ内でもそれ以外でも。
● リクエスト URI から呼び...
リソースクラス、リソースメソッド
@Path("/sample")
public class SampleResource {
@Path("/{id}")
@GET
@Produces("text/plain; charset=utf-8")...
Grizzly 上で動かす
URI u = UriBuilder.fromUri("http://localhost/").
port(10082).build();
ResourceConfig conf = new ResourceConf...
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、
テーブルを生成可能。
● ア...
エンティティクラス
@Entity
@Table(name="sample_user")
public class SampleUser implements Serializable {
private static final long s...
EntityManager による操作
// EntityManager em;
// 永続化
em.getTransaction().begin();
SampleUser u = new SampleUser("nobuoka");
em....
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
Derby (RDBMS)
● Java で書かれた RDB 管理システム。
– Derby ベースの Java DB が JDK に含まれている。
● SQLite のようにアプリケーション内で RDBMS を
動かせる。
● ディレクトリを...
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
Der...
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
Der...
Velocity (テンプレートエンジン)
● 汎用のテンプレートエンジン。
● VLT という独自言語を使用して記述。
● パフォーマンスや扱いやすさなどを考慮して
Velocity を選択。
●
とはいえすごく良いテンプレートエンジンかとい...
HTTP サーバー
ルーティング
リクエスト処理 / レスポンス生成
ドメインロジック
アプリケーション処理
HTML 生成
テンプレートエンジン
ドメインモデル
ORM
RDBMS
Grizzly
Jersey
EclipseLink
Der...
雑感
● Grizzly + Jersey (JAX-RS) の組み合わせは本番
用でそのまま使えそう。
● EclipseLink (JPA) と Velocity も本番で使って良さ
そうだけど、他の選択肢もある。
– DB 周りに関しては...
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Upcoming SlideShare
Loading in …5
×

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

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

  • Be the first to comment

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、テーブル自動生成と組み合わ せて、プロトタイピング時に扱いやすくて重宝する。

×