文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

Dropwizardを学ぶ:vol1:特徴や他FWとの簡単な比較をする

所謂Twelve-Factor Appなフレームワークですね。


f:id:treeapps:20180426142529p:plain

2014年のjavaの注目フレームワーク、その名もDropwizardについての勉強記事を連載していきます。

チマチマとオフィシャルサイトのドキュメントを読みながら学んでいっているので、多々誤っている事を書くかもしれませんが、どうぞよろしくお願いします。

私が業務SaStrutsを使う事が多いので、SaStrutsとDropwizardを比較するような部分もあります。

dropwizardの特徴

  • サーブレットコンテナ(jetty9)を内蔵しているので別途tomcat等は不要。
  • web.xml等、サーブレットに関するファイルは全くなく、ほぼ隠蔽されている。
  • warではなくjar(fat jar)が成果物になる。「java -jar xxx.jar server hoge.yaml」という形で起動する。
  • JAX-RSの実装であるJersey(ジャージー)を使ったRESTfulに対応。
  • hibernate or JDBIによるDBアクセスに対応。
  • Liquibase or FlywayによるDBマイグレーションに対応。
  • freemarker or mustacheによるテンプレートエンジンに対応。
  • HttpClient4系によるhttpリクエストに対応。
  • HealthCheck機構を搭載。
  • Assetsによる静的ファイルの管理。
  • Taks(バッチ??)の機構を搭載。
  • Basic認証 or OAuth2による認証機構を搭載。
  • CacheControlによるキャッシュ機構を搭載。
  • hibernate.validatorによるバリデーション機構を搭載。
  • JerseyFilter or ServletFilterによるフィルタ機構を搭載。
  • HTTPステータス301や302等、リダイレクト機能を搭載。

SaStrutsと違ってRESTfulに標準で対応しています。
Grailsのようにサーブレット上で動いていますが、サーブレットが隠蔽されているので楽です。web.xmlとかstruts-config.xmlのようなものはありません。

簡単なディレクトリ構成

ベストプラクティスな構造なのか解りませんが、dropwizard-example等の構成を参考にしました。

src/
├── main
│   ├── java
│   │   ├── HelloWorldApplication.java
│   │   ├── HelloWorldConfiguration.java
│   │   ├── core
│   │   │   └── Saying.java
│   │   ├── db
│   │   ├── filter
│   │   │   ├── DateNotSpecifiedFilter.java
│   │   │   └── DateNotSpecifiedServletFilter.java
│   │   ├── health
│   │   │   └── TemplateHealthCheck.java
│   │   ├── resources
│   │   │   └── HelloWorldResource.java
│   │   ├── tasks
│   │   │   └── HelloTask.java
│   │   └── views
│   │       └── PersonView.java
│   └── resources
│       ├── assets
│       │   ├── css
│       │   ├── fonts
│       │   ├── images
│       │   └── js
│       │       └── jquery-2.1.1.min.js
│       ├── banner.txt
│       └── views
│           └── Person.mustache
└── test
    ├── java
    └── resources

SaStrutsのあの機能はある?

SaStrutsの機能 Dropwizardの対応機能
Action Resources
ActionForm Resource
DI 無い
S2jdbc hibernate or JDBI
DTO core
インターセプター 無い
ServletFilter JerseyFilter or ServletFilter
tiles freemarker or mustache
Exception WebApplicationException
HttpSession HttpSession
Hot Deploy 無い???
ユニットテストは(実質)s2Junit4縛り 特に縛り無し
Doltengによるscaffolding 無い

大体SaStrutsに対応する機能はあります。インターセプターはありませんが、JerseyFilterかServletFilterで代替可能でしょう。

DIについてはDropwizardにはありません。普通にnewします。
(結局DIって有用なんですかね?私は別に無くてもそれ程困った経験が無いです)

HotDeployは今調査中で、多分jettyをAutoReloadっぽい事をしてできるような事をネットで見かけました。

SaStrutsはs2junit4によるSeasar2.classのテストランナー指定が必要になるのが最悪です。各種モックフレームワークと相性が最悪なのです。dropwizardには特にテストランナー指定は不要だし、心置きなくPowerMockやJMockitを使う事ができます。その件については以前以下の記事を書きました。

Spring Bootとの比較とか

Spring Bootは一度も使った事が無い訳ですが、サンプルコードを見る限り、ほぼDropwizardそのまんまです。但し、各種Springプロダクトと連携できる(と思われる)ので、そこはアドバンテージになるでしょう。

Springが不要であれば、スーパーフルスタックの超重量級なSpringは使わず、スッキリまとまっているDropwizardの方がよいでしょう。

Play framework2との比較とか

比較できる程使った事が無い訳ですが、私はDropwizardの方が好印象です。というのも、Dropwizardは見知った有力な機能を取り込んでいるので、独自機能はそれ程無いのです。

一方playはAkkaやテンプレートエンジンやevolutionやActivator等、play独自の機能を結構覚えなくてはいけません。更にplay開発元のTypesafe社はScala言語の開発元なので、playは必然的にscala寄りになります。その影響か、ビルドはsbtで、テンプレートエンジンもscalaです。この「scala推し」がデメリットと言えるかもしれません。

次回

特に決まってません。。。
Task・Commandは正直さっぱり解らないので後回しにします。この2つは一体何だろう・・?

dropwizardはjarが成果物になるのがいいですね。
デプロイが凄く楽になりそうです。スケールする時もjarを沢山起動してApache等からReverseProxyするだけでよさそうです。

公式サイトのドキュメントについては正直大分不親切です。。。
私の英語の読解力に問題があるのは当然としても、「これをやりたい時はどう書けばいい?」がとにかく解りづらいです。

まあどのフレームワークもドキュメントが足りない!!と言われがちなんですけどね。