yodai's tech blog

ソフトウェア開発に関する技術や読書メモのブログです。

JJUG CCC 2021 Fall 参加メモ

JJUG CCC 2021 Fallにオンラインで参加しましたので、振り返ってメモを書いておきます。

勤怠管理サービスでの継続的テストの取り組み

GitLabに組み込まれているCI/CDの機能を使って、継続的テスト、デプロイをして、品質や作業効率の向上をしようというお話でした。

  • CI/CDでリリースサイクルを短くしよう
  • コードチェック(PMD,SpotBugs)、静的解析しよう!(してない)
  • テストはJUnit、ArchTestで実施
    • ArchTestはわからないので調べてみよう
  • パフォーマンステストでも、CIで実行
    • JUnitのJTLファイル、統計レポートをinfluxdbやpostgresにあげて、Grafanaで結果がみれる!

クリーンアーキテクチャは難しい?

クリーンアーキテクチャをいかに保つか?というお話でした。

  • 例の図を横から見ると、凸な感じで、上からドメインユースケース、インターフェース
  • アーキテクチャプロトコル(手段)をいかに一致させるか
    • 変更を
      • 分析はドメイン内に閉じる
      • 設計はユースケース内に閉じる
      • 実装はインターフェース内に閉じる
        • ただ上から下に波及するときもある
  • 下から上への「攻撃」からクリーンアーキテクチャをいかに守るか?
    • 下から上への攻撃、画面!
  • 抽象駆動 vs 具象駆動
    • 抽象駆動は、要件をオブジェクト指向ドメインユースケースを分析、抽象化して実装につなげる
    • 具象駆動は、要件からさくりと実装、インターフェースにつなげる
    • 抽象駆動、具象駆動、どちらにするかはプロジェクト、プロダクトによる
  • Javaインターフェースがたくさんできてしまい、複雑になってしまうことがあるが、ジェネリクスで何とか回避
  • ドメインのモデル、密にするのではなく、idなど属性でよいところであればその属性で
  • ModelMapperは初めて知りました
  • 画面からして、クリーンに保てなさそうなときはBFF(BackendForFrontend)が必要なこともある
  • サービスの主体はバックエンド、フロントエンドは利用者、どうすればサービスの主体を守れるか、はBFFやCQRSなど、手法を用いることもあらかじめ検討する

Java ジェネリクス入門

Javaジェネリクスを使う側視点でのお話でした。ジェネリクスを作る側のお話も聞きたかったところです。

  • ジェネリクスのTとかR、は、
    • メソッドスコープならば、引数や戻り値の型の関係性を示す
    • インスタンススコープならば、ぷr巣してインスタンス内のメソッド間の関係性を示す
      • List なら add()もStringのエレメント追加だし、get()もStringのリターン
  • パラメタライズドの型は非変性、継承やインターフェースは共変なので、ここがなかなか
  • 非変性にしないと型の安全性が保てなくなるのでしかたがない
  • <? super B>とか<? extends A>とか、superは抽象なものOK、extendsは具象なものOK
    • Stream APIのFunctionを引数にとるものだと、 Stream flatMap(Function<? super T,? extends Stream<? extends R>> mapper)なら、入力は抽象的なものOKで、リターンは具体的なものOK
      • これでStreamAPIのjavadocも理解が進む!

最新 LTS Java 17 でプログラムが書きやすくなるという話

Java 17で追加された機能のお話でした。 Switchについては、、、なんだかコードレビューでひと悶着ありそうな、、、 AutoClosableのときもなんだかclose()がーというのであったような。。。

  • レコードクラス
    • レコードクラス宣言にレコードの要素として扱いたいものを引数みたいな感じで指定する
    • レコードの要素として扱いたいものは、暗黙的にfinalで宣言される
    • extendsは使えなくて、implementsは使える
    • コンパクトコンストラクタというのがあり、そこでレコードの要素のチェックをするようにする
    • JavaBeans仕様にのっとっていないので、SpringBootとかはレコードクラスを使うときに注意
      • Entityとか
  • Switch
    • Switchでルール(->)を使うと、breakが不要になる
    • Switch式というものができて、式なので、評価結果の値を変数に代入できるようになった
    • ブロック{}で加工場合は、yieldで値を返してあげるようにする
  • instanceof
    • instanceofで型チェックしてダウンキャストするときは、キャストせずinstanceofでいけるようになった
  • Sealedクラス
    • 継承、実装するクラス、インターフェースを制限できる
    • 内部向けフレームワークを作るときに有用らしい

GitHub Actionsを使って学んだCI/CD環境のあれこれ

GitHubActionsで、CI/CDを体験してみよう!というお話でした。GitHubActionsは聞いたことがあるのですが、触ったことがなく、結構簡単にCI/CDできるようになるんだなーと感じました。

  • CI/CD:ソフトウェアの変更に対して、build/test/deployを自動化し、品質の向上、リリースサイクルの速さの控除湯を目指す
  • GitHubActionsでは、YAMLでbuild、test、deployのふるまいを定義してCI/CDを実現する
  • あらかじめテンプレートが用意されていて、それをあったものにしていく
  • マーケットプレイスがあって、そこから定義を入手することが可能
  • AWSなどのクラウドでも、セルフホストランナーで自前ホストでもデプロイができる
  • Code Scanning Alertで静的解析もできる
  • マーケットプレイスのものは、だれかが用意したものがあるので、中身を見て問題がないことを確認してから使うようにする

Javaとコミュニティの歩み

Javaの今までの歴史など、Oracle vs Googleや、JavaOSSコミュニティのかかわりとか。 今年は、OracleJDK再無償化、次回LTSリリース後+1年サポートがちょっと大きかったのかな?


今回も感染症対策として、オンラインでのイベント実施になりましたので、普段遠くてなかなか参加できない、という方々も参加しやすいイベントになったと思います。

これからもオンライン開催だとうれしいかな。オフラインで全方位つよつよJava開発者しかいない、というところにいるのもそれはそれでよい刺激になるので、捨てがたいところもあったりします。


今までQrunchに書いていたのですが、サービスなくなってしまってどうしようかなーと思いつつ結構経ってしまいました。記事もダウンロードしていたのですが、どこにやったか忘れてしまいました。今後ははてなブログに書こうと思います。