Javaで1から10まで書 
いた話 
tokuhirom 
2014 JJUG FALL
または、Java でウェブ 
屋が開発した話 
tokuhirom 
2014 JJUG FALL
本セッションの内容は 
個人の見解であり、所 
属する団体とは無関係 
です。
自社サービスの 
ウェブエンジニア
Perl 
を中心に 
Ruby,Python,PHP,C,C++ 
など
_人人人人人人人_ 
> 突然のJava < 
‾Y^Y^Y^Y^Y^Y‾
なぜ?
書けるエ 
ンジニア 
が多い
言語仕様が 
安定している
速い
以下略。
で、どういう構 
成でやるの?
前提条件
自社サービスの 
開発運用
LL 書いていた人でも 
書きやすい構成
なにはダメか?
再起動にめっちゃ時間 
かかる。
環境構築が 
著しく大変である。
覚えることが多い
どうするか。
どういう環境で開発す 
るか?
Java のバージョン
Java 8
lambda 
Stream API 
interface default 
methods
LL しかやってない人 
にもとっつきやすい。
しがらみがないなら一番 
あたらしいやつ使いたい
Java8 
+ 
lombok
Java8 + lombok 
なら LL と 
遜色ない
もはやJavaダサ 
いと思ってる方 
がダサい
フレームワーク
ライブラリ選定基準
Web Application 
システム構成 
Java 
Web 
Application 
Framework 
O/R Mapper 
Router 
Template 
Engine 
MySQL 
HTTP 
Client 
HTTP 
Server 
Apache2 
JSON 
Serialiser
軽量
高速
簡単
メンテナンスが停止し 
た場合に最悪自分たち 
でメンテナンスできる 
こと
または、メンテナンス 
停止したら誰かが fork 
する
で、
Java EE 標準?
エンタープライズ開発の場合には非常にマッ 
チすると思うのですが、我々のニーズにマッ 
チしていなかったというだけであり、 
JavaEEに問題があるわけではありません。
問題が起きた 
時に対処でき 
ない
Java EE 7 対応の 
日本語本がない
エンタープライズ開発の場合には非常にマッ 
チすると思うのですが、我々のニーズにマッ 
チしていなかったというだけであり、 
JavaEEに問題があるわけではありません。
Dropwizard
fat-jar 
+ JAX-RS 
+ embed-jetty
これなら僕 
たちにも使 
えそうだ!
Dropwizard 
Jersey(JAX-RS) 
Hibernate 
Embedded Jetty 
Freemarker
これらを結ぶ 
Glue が Dropwizard
Dropwizard は 
悪くない
ちょっとしたつなぎを 
やってくれる。
悪くないが、 
この Glue いる?
Guava の Optional を 
Jersey で受け取れる 
Hack
Java 8 だと不要
余計なことをする。。
カスタマイズしようと 
すると意外と面倒
Dropwizard の 
Glue にあたる部分は 
自分たちで実装するこ 
とにした
コードジェネレーター 
で実装すればいいよね~
Oreore-Generator 
Jersey(JAX-RS) 
Hibernate 
Embedded Jetty 
Freemarker
テンプレートエンジン
要件
高速
型ベースの 
自動エスケープ
XSS 対策
[% var %] 
String なら自動エスケープ
エスケープしたくなければ 
new EscapedString(str)
要件を満たすものが 
ほとんどない。
作るか!
2種類作った。
nanotmpl
埋め込みJava
JSP 
+ 自動エスケープ 
+ 単一行制約
@ String name 
こんにちは!<?= name ?> さ 
ん!
Java コードに変換 
コンパイル 
実行
Java で VM を実装 
VM 用コードに 
テンプレートを変換
[% FOR x IN items %] 
X: [% x %] 
[% END %]
Perl で使っていた 
Xslate というテンプ 
レートエンジンと同じ 
記法を採用
ボツ。
なぜ?
テンプレート 
エンジンの開 
発は面倒
開発コストが 
見合わない
ベンチマークした結果、 
Java のテンプレート 
エンジン、だいたい速 
い。
自動エスケープは昔ほ 
ど重要ではない。
CSP 
(content 
security 
policy)
JS でHTML構 
築するケースが 
増えた
じゃあ、mustache 使う 
か。。
不評!
JS のテンプ 
レートとかぶり 
がち。。
•FreeMarker ← 君に決めた! 
• Mustache 
• etc.
Oreore-Generator 
Jersey(JAX-RS) 
Hibernate 
Embedded Jetty 
Freemarker
O/R Mapper
Hibernate?
L1 キャッシュ切りた 
いのに切れなくて挫折
もうJDBC直接で……
それはさすがにつらい。
シンプルな 
O/R Mapper 
を書いた。
JOIN とかは 
サポートしない。
クエリビルダで 
JOIN生成すると 
問題解決が困難になる
複雑なSQLを生成できな 
いように制約を加える
人は制約があっ 
た方が書きやす 
く感じる。
あたたかみのある 
手書き 
SQL
@Table("member") 
@Data // lombok 
@EqualsAndHashCode(callSuper = false) 
public MemberRow extends 
Row<MemberRow> { 
@PrimaryKey 
private long id; 
@Column 
private String name; 
}
Optional<MemberRow> 
member = 
db.single(MemberRow.class) 
.where("id=?", 1) 
.execute();
db.insert(MemberRow.class) 
.value("name", "John") 
.execute();
Optional を利用 
したわかりやすい 
インターフェース
Oreore-Generator 
Jersey(JAX-RS) 
TinyORM 
Embedded Jetty 
Freemarker
そんなある日
Jersey で開発を 
続けていると、、
つのる不満
アノテーショ 
ンが冗長
アノテーションベースな 
POJO にこだわりすぎている?
アノテーション 
で挙動を制御し 
ているために動 
作を追いづらい
テンプレートや 
JSONのレンダリン 
グがコントローラ 
の外で行われる
Java に慣れて 
ない人には 
ちょっとつらい
シンプルな 
MVC フレーム 
ワークを作成
avans
サーブレットAPIの薄 
いラッパー
もともと使われていた 
Sledge/Amon2 とい 
う Perl のフレームワー 
クを参考に開発
移行しやす 
くなった。
コントローラ 
は継承ベース
public class HelloWorld extends 
ControllerBase { 
@GET("/") 
public WebResponse hello() { 
return 
this.renderJSON("Hello, world!"); 
} 
}
コントローラ 
起点でデバッガ 
で追いやすい
アノテー 
ションに 
よる拡張
結局アノ 
テーショ 
ンかよ。。
@BeforeDispatchTrigger 
public void preprocess() { 
// … 
}
Java 8 interface 
default method 
によるMix-in
Jackson 
ControllerBase Session 
Freemarker
Oreore-Generator 
avans 
TinyORM 
Embedded Jetty 
Freemarker
運用上の都合により、、
Oreore-Generator 
avans 
TinyORM 
Tomcat 7 
Freemarker
Oreore-Generator 
avans 
TinyORM 
Tomcat 7 
Freemarker
時間があれば、 
テストの話
モデルのテスト
DB は MySQL 
実際に開発サーバーにつなぐ
ストレージとの 
やりとりがサー 
バーサイドの肝。
MySQL をデータセン 
ターの dev サーバーに 
おいてやる。
コントローラのテスト
JSON 
API 
の台頭
テストし 
やすい。
コストは 
安い。
ブラウザで確認とかし 
たくないでござる。
モッキング 
は 
どうするか?
Java レベルで 
の 
モッキングは 
やらない
サービスはHTTP 
JSON API でつなぐ
(Jetty|Tomcat) でモッ 
ク httpd を立ち上げて 
そこにアクセスする。
@BeforeClass 
で 
tomcat-embed 
を起動
Tomcat tomcat = new Tomcat(); 
tomcat.setPort(0); 
org.apache.catalina.Context webContext = 
tomcat.addWebapp("/", new File("src/main/ 
webapp").getAbsolutePath()); 
webContext.getServletContext().setAttribute(Glob 
als.ALT_DD_ATTR, "src/main/webapp/WEB-INF/ 
web.xml"); 
tomcat.start(); 
int port = tomcat.getConnector().getLocalPort(); 
String url = "http://127.0.0.1:" + port; 
// url をつかってなにか処理する
Apache 
HttpClient 
でアクセス
テスト環境は 
意外と簡単。
以上です。 
ご清聴ありがとうございまし 
た。(2回目)
まとめ
Java 8 時代は 
ライブラリを 
書くチャンス
lambda 
対応
Java 8 Date 
and Time API
Optional 対応 
は既存のものの 
拡張では難しい
既存のライブラリは 
Java 7 対応を切れな 
いために Java 8 を 
完全に生かし切れな 
いケースも
Maven Central に 
ライブラリをアッ 
プロードするチャ 
ンスですよ!
以上です。 
ご清聴ありがとうございまし 
た。
Maven central に 
アップロードするのは 
難しいのでは?
Maven central 
怖くないよ
JIRAにサインアップ
JIRA でチケットを 
発行する
mvn release:prepare 
release:perform
以上です。 
ご清聴ありがとうございまし 
た。(3回目)

Javaで1から10まで書いた話(sanitized)