Aeromockが公開されました #Aeromock

先週のDevLOVE甲子園でその存在を周知していましたが、今週無事にAeromockがリリース(Github上でpublicになった)されました。はてブとかでもちょっと話題になったそうでありがたいものです。

CyberAgent/aeromock · GitHub

JSONモックサーバとかは世の中に結構溢れてるかと思いますが、それはあくまで機能の1つにすぎなくて、AeromockはJVM系テンプレートエンジンの描画を、サーバサイドのモジュールやミドルウェアに依存せずにテンプレートファイルとデータファイルによって実現するために作られました。

基本的なコンセプト

  • 技術的負債を抱えてしまってフロントエンドが独立して開発することが難しい状況において、フロントエンドを止めずに開発を行えるようにする
  • Viewのインタフェースを重視した開発を促進させる
  • フロントエンドエンジニアを専門外領域から開放させる

といった感じです。

あとLightweightを名乗ってますが、JavaのDIコンテナ使った開発から開放されるっていう意味で使ってます。そのため、LL系のプロダクトから見ると重量級だってのは間違いないw

Twitter上で拾った疑問について

aeromockに食わせるJSONとかYAMLって自動生成できるのかな。 止まっちゃいけないフロントエンド開発 // Speaker Deck : https://t.co/SoUPN4vxRj— jinmensou (@jinmensou) 2014, 8月 25

Aeromockで新規の開発をする場合はインタフェースを重視してデータを一から作っていけば良いのですが、既存の機能をAeromockで動作させるためには既存のテンプレート実装に合うようなデータを作る必要があります。このようなケースでメソッド呼び出し多用だとマジ死ねますw

実は今回のOSS化の対象にはしなかったのですが、社内ではブラウザで閲覧してる画面に適用されたオブジェクトをYAMLとしてダンプするモジュールと、それを閲覧するためのChrome Extensionを実装して運用しています。画面を閲覧すると、ExtensionにYAMLが出力されて、それをコピペしてデータを作るイメージです。便利なんですけど、正直これに頼られるといつまでも技術的負債(多量のメソッドコールとか)が解消されない気がするし、インタフェース重視に逆行するんじゃないか?っていう疑念もあったので公開は見送りました。 もちろん手っ取り早く動かせるっていうのは確かに重要なんですけど、やはり長期間に渡って安定して運用できる実装であって欲しいという思いがあります。

実装の話

経緯

以前のプロジェクトではBackbone.jsで開発してましたが、そこで一緒にやってたフロントエンジニアがFreemarkerのプロジェクトに異動して、APサーバの起動待ちに疲弊しきっていることを知って、じゃあなんとかしようと思って去年の11月から作り始めました。

当時は他に主業務もあったので、多くて1日2時間くらいのコミットだったんですけど、GFにうっかり導入して既成事実化したんで正式にフルコミットしていいよとなったわけです。たしかそれが2月くらいだったかと思われます。

Scala

まあ、Javaで書くのは・・・ねぇ・・・

Netty

PlayとかFinagleとかを使わずに素のNetty上に構築した理由は、必要な機能だけ実装したいっていう考えと、ルーティング周りの実装を自分で完全にコントロールしたかったからに尽きます。

Groovy

タグやファンクションのとこどうしようって思ったときに、Groovyの存在を思い出したのです。動的言語なら気軽にトライアンドエラーできるし、 まあサーバサイドのタグ・ファンクションの実装と2系統持っちゃうことになるんですけど、正直そこの冗長性は甘受していいかなと思ってます。タグの実装をJarに切り出して・・・とかも考えましたけど、中でどんな実装になってて副作用持ってたりしたらたまりませんからねぇ。

あと、ルーティング制御のDSLにも使ってます。ただ、ルーティング制御がしなくて良いプロジェクトが美しいですね。

Javassist

オブジェクトに存在しないメソッドを動的に実装させるために使ってます。Scalaではmethod_missingとかもあるんですけど、テンプレートコンパイル時にメソッドの存在をチェックされちゃうようなケースだと使えないのでこういう手法にしてます(Jade4jとかそうだったはず)。

Scalaz

使い方は相当自分の中で揺れました(今もだけど)。Scalazの恩恵を受けた部分も多々あるけれど(ApplicativeBuilderとか)、Scalazを使いこなせてない実装も多々あるためクソ(天使)コードもあるのも自覚してます。たぶんコード見てもらえれば苦心の跡がよくわかるかとw

この辺は技術的負債としてマークしてるので、ボチボチリファクタリングしていきます。

テスト

最初は書いてたんですが、4月くらいにいったんフルスクラップしたタイミングでいったん捨てました。あるべき論の模索を続けてたフェーズだったので・・・。ただ、最近は一部を除いて方針固まってきてるので再度Specが積み上がり始めてます。

あと、それに伴ってちょっと簡易的なDIが欲しくなってきたところです。Config系オブジェクトへの依存のとことかダサいんで直していきたいですね。

今後について

とりあえず公開されたことにより、色々フィードバック頂けるのはやっぱいいなーと思っている今日この頃です。今後は負債返却しつつ地道に機能追加していきます。面白いけど中途半端だったので公開時に落とした機能とかあるし、Scalaで書いてるくせにScala系テンプレートエンジンには対応してないしw

というわけで、何かご意見とか要望とか大歓迎ですし、PRもウェルカムですのでよろしくおねがいします。