JJUG CCC 2017 Fall に行ってきた #jjug_ccc

簡単に所感をまとめます。セッション資料はどこかで公開されるはず。

www.java-users.jp

Selenide or Geb? あなたはそのときどちらを使う?

  • Selenide
    • Java製WebDriverラッパー
    • DSLによるjQueryライクなセレクタ
    • IDEの補完を活用できる
    • Ajaxなどの非同期処理に対する記述が書きやすい
  • Geb

    • じぇぶ
    • Groovy製WebDriverラッパー
    • DSLによるjQueryライクなセレクタ
    • waitが書きやすい
  • Selenideのメリ/デメ

  • Gepのメリ/デメ

    • Selenideより細かい制御ができる
    • Groovy/Gradleの知識が必要
    • IDEの補完は効きづらい
  • ローカルでは動くのにJenkins上では落ちることがある

    • おそらく環境依存などが原因 (jsのロードが遅れるなど)
    • Selenideは失敗して落ちるとスクリーンショットとHTMLが残る
  • マルチブラウザテスト

    • GebConfig上でWebDriverの生成処理を変更することで対応
    • Selenideも設定ファイルでWebDriverの生成処理を変更することができる
  • PhantomJSやChromeのヘッドレスモードを使ってテストする

    • E2Eのテストなので実際は本物のブラウザでテストするべきという考えがある
  • 読むのを楽にしたいか/書くのを楽にしたいか

    • 書きやすさならSelenide
    • 読みやすさならGeb
  • SelenideはIDEのサポートがあるので取っ付きやすい
  • Gebは学習コストがやや高め
  • Selenideはテスティングフレームワーク (簡単なアサーションはある)
  • GebはSpockなどと組み合わせる

最近、Selenide を試してみたところだったので話が聴けてよかったです。両方ともIDEのサポートはあるものの、Intellij IDEA との親和性が高そう。書くのをラクにしたいか、読むのをラクにしたいかで選べばよい、とのこと。確かに、Selenide は書きやすそうな印象。非同期処理に対する記述のところは調べておきたい。

Apache Camel + hawtio + Spring Boot によるモダンなインテグレーション・マイクロサービス

  • インテグレーションマイクロサービス
  • Smart Endpoints and Dump Pipes

    • マイクロサービス自体に他のサービスと連携する機能を持たせる
    • ルーティングロジックがエンドポイント(各マイクロサービス)の中にある
    • パイプはシンプルにする
  • マイクロサービス間が連携したらスパゲッティにならないか

    • そのために Enterprise Service Bus がある
  • コンウェイの法則

    • サービスと開発チームが小さくなる
    • インテグレーションはスパゲッティになるが、個々の開発チームはシンプルになる
  • Apache Camel

  • ルーティングはXMLでも書ける (Spring XML DSL)

    • IDEGUIを使う場合はXMLを使う必要あり
  • Content-Based Router

    • コンテンツの内容に応じてルーティング先を決める
    • choice / when / to
  • hawtio

    • Angular 1.x + Jolokia ベースの監視ツール
    • HTTP/JSONで通信
    • Spring Boot 連携 (監視用のポートで起動する)
    • Camelサポートが豊富
      • ルーティングがグラフィカルに見れる
      • やり取りしているメッセージが見れる
  • Camelのテストフレームワークでルーティングのテストができる

  • コンポーネントが多いので選定などは大変っぽい

マイクロサービスの開発自体あまりなく名前程度しか知らなかったんですが、Apache Camel はよさそうです。機会があれば使ってみたい。hawtio は初めて聞いた。

DDD × CQRS - コマンドとクエリでORMを使い分けた話

  • CQRS
    • コマンドクエリ責務分離
    • 単独でも適用可能
    • イベントソーシングと組み合わせる必要はない
  • 書き込みと読み込みのモデルを分離する

  • 従来は単一のデータストアで同じモデルが読み書きを担う

    • 1モデルの処理が複雑になる
  • そもそも読み込みと書き込みの要件は異なる

    • パフォーマンスを求められるのは参照系
  • 1モデルに詰めるとどこかで無理がでてくる

  • モデルを読み書きで分離する

  • データストアを分離する

    • 参照系は read-only なレプリカにするなど
  • イベントソーシング

    • すべてのアクションをイベントとして記録する
    • 既存のデータはupdateしない
    • Writeモデルはイベントとして記録される
    • Readモデルはイベントから変形される
  • 読み込み書き込みそれぞれの要件に合わせてORMを選定する
  • JOOQ
    • SQLに近い記述でタイプセーフにSQLが書ける
  • Writeモデルの制約はコンストラクタと公開メソッドで実現する

CQRS についてはよく分かってないマンですが、読み込みと書き込みでモデルを分けるというのは参考になりました。特に要件に合わせてORMも分けるというのは思い付かなかった...。

劇的改善 CI4時間から5分へ〜私がやった10のこと〜

  • R-SET
  • CIは10分で終わらせるのがいい (遅くとも20分以内が望ましい)

  • レイヤごとにテストの責務を閉じる

    • RepositoryとRDBはまとめてテスト
  • Controllerのテストは @WebMvcTest にする
    • @SpringBootTest はすべてのBeanを登録してアプリケーションを起動するので遅い
  • ServiceレイヤのテストではDIは使わない
    • Springの機能は使わない (RepositoryはMock化する)
  • RepositoryはFilterでBeanを選択する
    • @MyBatis or @MyBatisTest で必要なBeanのみを登録する
    • MyBatisに限らず必要なBeanをフィルタリングするのは大事
  • テストサイズ導入, テストサイズによる実行タイミングの分割
    • Googleが提唱している
    • Small, Medium, Large
    • 実行タイミングはプルリクエストやブランチのマージなど
    • LargeテストはいわゆるE2Eテスト
    • JUnit@Category, maven-surefire-plugin の groups で実現する
    • mvn の Profile で実行するテストサイズを切り替える

たぶん、無駄なテストを改善する/除去するというのが最も効果ありそう。テストサイズについては初めて知りました。あとで調べてみよう。

Java SE 9の紹介: モジュール・システムを中心に

Java SE 9の紹介: モジュール・システムを中心に

  • Maven, Gradle を使っても複数バージョン混在地獄は解決できない

    • jarファイルの名前しか見ないため (中身までは見ない)
  • モジュールシステム

    • モジュール単位で依存関係を整理する
    • 内部パッケージの使用を制限する
  • 複数のモジュールで同一パッケージが含まれる場合、JVM起動時点で検知される
  • module-info.java

    • 外部に公開するパッケージは exports 命令で指定する
    • 自分が使うモジュールは requires 命令で指定する
    • requires したモジュールの exports されたパッケージの public なクラスが使える
    • それ以外を使うとコンパイルエラー/実行時例外
  • 標準ライブラリである java.base モジュールは暗黙的に requires される

  • モジュールシステムはリフレクションにも適用される

    • opens 命令で外部からリフレクションでアクセスできるようになる
    • モジュール宣言に open を修飾するとすべてのパッケージが opens 指定される
  • モジュールパスとクラスパスは別

  • 無名モジュール/自動モジュール

  • ライブラリ提供者はすぐにモジュール化すること

    • 使う側が requires 命令を書けない
  • Properties クラスは Latin-1 のまま

この日、最も聴きたかったセッション。モジュールシステムの概要が分かってよかった。要復習。なんとなく、ちゃんと作ってるライブラリであれば、モジュール化はそこまで難しくなさそうな印象。

その他

今年春のCCCは参加できなかったのですが、参加人数が多くてかなり混雑してた模様。今回は、前回より参加人数が少なかったのか、それほど混雑は感じられませんでした。というか、通路が一方通行になってたりいろいろ工夫されてたのがよかったのかも。移動がいつもよりずっとラクでした。