JHipster によるエンタープライズアプリケーションの構築(1) 紹介編

カバー

[!] この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

当社はこれまで Java を用いたエンタープライズアプリケーションを数多く開発してきました。 現在は、これまでの開発実績を活かしながら、エンタープライズ開発に求められる堅牢性を維持しつつ、より迅速に、かつモダンな技術に追従して開発できる手法を模索しています。 今回は、その一環として、現在導入を進めている JHipster を紹介します。

JHipsterとは

JHipster はモダンな技術を使ってWebアプリケーションを堅牢かつ迅速に作成・デプロイするための開発プラットフォームです。

JHipster - Full Stack Platform for the Modern Developer!

Java/Spring Framework/Spring Bootによるバックエンドを中心として、Angular/React/Vueなどのフロントエンド、著名なミドルウェアやクラウドとの連携、開発環境の構築など、モダンなWebアプリケーションやマイクロサービスの、Scaffold(足場)となる堅牢なソースコードを生成します。イメージとしては Ruby on Rails でいう Scaffold に近いものです。

すぐに動作する、という意味では今流行のノーコード/ローコードに近いとも言えますが、JHipster は生成後のコードを自由に改変できることが強みです。また、一般的にはコード生成ツールによるコードは可読性が低いものもありますが、JHipster は開発者の配慮により、かなり可読性が高く、メンテナンスがしやすいことが特長です。さらに未知のライブラリについてはコーディング方法の参考情報にもなりえます。

JHipster は OSS であり、Java のエンタープライズ対応が盛んとなってきた2013年より開発がスタートしました。10年経った2023年現在もGitHub上で開発が続いており、Star数は2万、開発者は600人ほどです。

以下は JHipster によって作成された初期状態のサンプルです。このような動くシステムがある状態から開発をスタートできます。

トップ画面ログイン 一覧画面更新画面

JHipsterでできること

JHipsterが生成するコードの範囲は多岐にわたりますが、特に開発を効率化できる主要な機能は以下のとおりです。

  • 開発環境のコード生成: ビルドやテストなどの開発環境、デプロイなどのプロダクション環境のコードを生成します。
  • CRUD処理のコード生成: 設計したデータモデルの定義にしたがい、登録・読み込み・更新・削除(CRUD)処理に関するコードを、サーバサイドはSpring Bootベース、クライアントサイドは Angular/React/Vue ベースでコード生成します。
  • 共通処理のコード生成: 認証処理やアクセス制御などのセキュリティ、DBアクセス、ログ出力、システム監視に関するコードを生成します。
  • 他システムと連携するコード生成: 認証サービスや監視サービスなどの他のプロダクトと連動するコードを生成します。
  • 独自のコード生成: Blueprint と呼ばれる拡張機能を用いて、特定の開発プロジェクト用のコード生成ツールを開発できます。

これにより、どのような開発環境を準備するか、ファイルをどう配置するか、どのようなコードを書くのがベストプラクティスか、 などの開発方針に頭を悩ますことがなく、すぐに動くアプリケーションを使って開発を進めることができます。

これらの特長についてもう少し具体的に説明します。

開発環境のコード生成

jhipster コマンドを npm でインストール・実行し、問い合わせに回答していくだけで、アプリケーションのビルド、テスト、デプロイに関する定義やスクリプトが生成され、すぐにアプリケーションの開発が可能な状態となります。

$ npm install -g generator-jhipster
$ mkdir myApp && cd myApp
$ jhipster

参考としてシンプルなアプリケーション構築例を示します。

アプリケーション構築例

以下に示すように、開発を便利にする数多くの仕組みが準備されます。

  • コード生成後のコーディング開発を見越し、Visual Studio Code や Intellij IDEA といったIDEを前提とした定義を生成してくれます。 (最近は Visual Studio Code の devcontainer 環境まで生成してくれてます)。コードをメンテナンス可能にするために重要なコーディングルールについても、コーディング整形ツールである ESLint, Prettier, EditorConfig, Checkstyle の定義を最初から作成してくれます。これにより生成コードがとても見やすくなっています。 開発環境

  • ビルドツールは Maven/Gradle のいずれかを選択でき、クライアントサイドの npm や webpack と連動します。当然ながら、 Spring Bootの主要な starter である web や data, security、クライアントサイドのライブラリを含め、必要な dependency はすべて具備されているため、ビルドコマンド一つでアプリケーションが立ち上がります。

  • ホットリロード環境が用意されています。BrowserSync を内包しており、フロントエンドのコードを修正すると即座にブラウザ側に反映されます。環境設定不要で快適な開発者体験が得られます。

  • テスト環境のコードを生成します。Unit, Integration, e2e, ArchUnit(コードの依存関係) テストに対応しており Jest や JUnit、Cypress, Gatling, Cucumber のテストケースの雛形、および実行のための npm スクリプトを生成してくれます。テストを意識したコード生成も行い、例えば Cypress を選択すると e2eのテストケースにおいてボタン部品を正確に検知するための属性タグを埋め込むなど、テストケースをシンプルに記述できる気配りもされています。 Cypressの属性タグ

  • fake-data いわゆるダミーデータを、データモデルの形式に応じて生成してくれます。開発環境ではそれらを読み込んだ上で起動する環境も作られます。Fakerを内包しており、選択した言語や氏名や住所といった性質にあわせて、それなりのダミーデータを作成してくれます。ダミーデータは、動作確認やテストがすぐにできるという意味において開発者にとって非常に心強くフレンドリーな仕組みです。 ダミーデータ

  • 開発やテスト環境で必要な、DBサーバなど連携サービスをすぐに立ち上げられるよう、Docker Compose の定義が用意されています。

  • 開発環境やプロダクション環境ごとにプロファイルが用意されています。これにより、例えば開発環境のRDBはH2, プロダクション環境はPostgreSQLを使用するといった環境定義分けができます。

  • いわゆるデータベースの進化的設計に対応しています。データモデルを追加更新しコード生成する際に JHipster は後述する CRUDのコードの生成とともに、Liquibase を用いたRDBの変更内容 (Changelog) のコードも生成します。これによりテスト環境やプロダクション環境でのマイグレーションがスムーズにいきます。

CRUD処理に関するコード生成

業務ドメインの情報、主にEntityとして示されるデータモデル(≒RDBにおけるテーブル定義)を JHipster Domain Language (JDL) 記法で設計しコマンド実行すると、 そのモデルに準じたCRUD処理に関するコードを生成できます。

$ jhipster jdl jhipster-jdl.jdl

JDLは JHipster の独自記法である点は若干抵抗がありますが、学習コストはほぼかからない程度に容易です。JDLのサンプルはここにあります

コードはサーバサイドおよびクライアントサイドが同時に、連携可能な状態で生成されます。 生成されるCRUD処理系画面は以下の通りで、ノーコード/ローコード系が具備する基本的な動作は備わっています。

  • 登録・更新画面における入力フォーム。項目の型(数字・列挙・日付型など)やデータモデルの1-nのリレーションに応じた入力部品や入力チェックを具備
  • 一覧画面は、ページネーション(前へ、次へ)や項目ソート機能、絞り込み用のフィルタ機能を具備
  • その他、確認ダイアログ、処理終了後の通知メッセージやエラーメッセージの表示などを具備

これらの機能を実現するためのコードを、以下のような比較的モダンかつオープンな構造で出力できます。

  • クライアントとサーバを RESTful とした Single Page Application (SPA) のアーキテクチャを構成します。クライアントコードを生成せず RESTful なバックエンドサーバのみにすることも可能です。
  • サーバサイドは、Spring Bootにおいては普遍的なアプリケーション構成である、Controller/Service/Entity/Repository/DTO からなる Layered Architecture ベースのコードを生成します。Webインターフェースは Spring MVC RestController、データベースアクセスは Spring Data JPA ベースとなります。
  • クライアントサイドは、開発開始時に Angular/React/Vue のいずれかを選択したものをコード生成します。歴史が長い JHipsterですが、クライアント技術の移り変わりが激しい中、生成されるコードが陳腐化しないようメジャーな流れに追従する動きを継続しています。(例: React の Components → Hooksへの移行など)

共通的な処理に関するコード生成

特定の業務ドメインに依存しない共通的な機能も、サーバサイド・クライアントサイドをセットでコード生成します。

  • 認証認可機能。フロントエンドのログイン画面や、バックエンドの認証処理を動く状態でコード生成できます。ユーザ登録時のメールによる本人確認処理も備わっています。ユーザ管理画面があり、管理者権限などの権限付与の機能も用意されます。 ユーザ登録
  • 画面レイアウトは、メジャーな Bootstrap ベースです。レスポンシブデザインにも対応しています。
  • 国際化対応しています。開発開始時に複数の言語が選択可能で、リージョンなどの条件で切り替え可能な仕組みが用意されています。
  • 各種メトリクス、ヘルスチェック、ログ設定やサーバのパラメータを可視化するダッシュボード画面を内包しており、すぐにサーバ監視が行えます。 メトリクス

他システムと連携するコード生成

JHipsterはこれまで挙げた機能の他にも、OSSとして存在する著名なライブラリ、ミドルウェアやサービスと連携が可能です。 連携できるライブラリやサービスはサイトに示されているように多岐にわたり、全ては紹介できませんが、ここでは主だったものを紹介します。

  • 先に監視系のダッシュボードのコード生成の話を述べましたが、サードパーティ製の監視サービスの連携も前提に作られています。Spring Boot Actuator (Micrometer) や Prometheus連携の dependency が入っており、エンドポイント設定もあり連携が容易にできます。
  • 認証・認可系については、 OIDC/OAuth2 を用いた外部IdP連携にも対応しています。JHipsterは、認証プラットフォームサービスを提供しているOkta社がプラチナスポンサー なこともあり、 認証連携に関する情報は Okta 開発者のブログのJHipsterに関する記事 に多くあります。
    • Oktaブログは他にも色々なプラットフォームとの連携方法を紹介しており参考になります。余談ですが、ブログの主筆で Java Champion でもある Matt Raible 氏は、 JHipster/Okta の ブログや YouTube でも度々登場します。動画での "Helloow! Java Developers!!" から始まる陽気で明るい語り口が印象的です。
  • クラウドやコンテナおよびそれらを用いたマイクロサービスの構築について、JHipster は AWS, Azure, GCP などのメジャーなパブリッククラウドへデプロイ可能であり、公式ドキュメントでもそれを示しています。一方、現在は公式ドキュメントよりも上述の Okta ブログ周辺のほうが最新情報を発信しています(JHipster というより Java のクラウド周辺の変化がそれだけ激しいことが背景でしょう)。例として WebFlex と SpringCloud で Microservices Architectures(MSA)を構築Kubernetes(EKS)との連携といった情報が示されています。

独自のコード生成

JHipsterは Blueprint と呼ばれる拡張機能により任意のコードを生成できます。これにより、JHipsterでサポートされていないサービスや、開発プロジェクト固有のコード生成を行うことができます。 JHipster の実体は Yeoman と呼ばれるコード生成ツールの集合体です。Yeoman は Google が開発元で、テンプレートをもとにコードを生成するツールです。

マーケットプレイスや GitHub 上に様々なBlueprintが作成され公開されています。

  • JavaやSpring Boot の代替として Kotlin や.NET Core、Node.js 対応など
  • ネイティブ化として、Quarkus や Micronaut、Spring Native 対応など
  • フロントエンドフレームワークとして、Svelte 対応など
  • モバイルフレームワークとして React Native や Ionic 対応など

JHipsterが必要とされる背景

昨今Webアプリケーションを構成する技術は多種多様ですが、当社が JHipster を推進させる理由は以下です。

エンタープライズ開発に求められる堅牢性と迅速性

エンタープライズアプリケーション開発には、 堅牢性が求められます。技術選定にあたっては、導入実績や開発人口の豊富さ、エコシステムの充実などを加味し、長くメンテナンスができるプラットフォームを採用することが重要です。この点において Java や Spring Framework から派生する JHipster は、有力な候補です。

加えて昨今のエンタープライズ開発では、ビジネス価値を迅速かつ漸進的に成長させるアジャイルの開発スタイルが求められます。 この点、常に動くアプリケーションを維持し、フィードバック反映しながら開発できる JHipster はアジャイル開発との親和性があります。

Spring Framework / Spring Boot を更に使いやすく

近年の Java / Spring Framework / Spring Boot 界隈おいて周辺技術は多くの選択があり、ビジネス要求を達成するには、様々なプラットフォームと連携するノウハウが必要となります。これらを正確に素早く形にすることが課題です。

JHipsterの創始者で現在 Microsoft 所属の Julien Dubois 氏は、Spring Framework / Spring Boot / JHipster の比較をシンプルな表現で示しています

  • Spring Framework: ハンバーガーの材料を並べたものを提供
  • Spring Boot: 材料を組み合わせたハンバーガ単品を提供
  • JHipster: ハンバーガーの他、ドリンクなど、ランチという目的を満たすセットメニュー

Spring Framework は DI による疎結合でチーム開発や長期維持が可能な環境をつくれますが、ライブラリを自身で用意し設定する必要があります。 Spring Bootは、Spring Framework のライブラリ群の依存関係を設定してくれることで複雑さを解消しながら使うことができますが、初期に準備されるコードをベースにかなりの部分をスクラッチ開発する必要があります。 JHipster はこれらに加え、実際にプロダクション環境で動作するところまでのコードや環境を準備してくれます。加えて Java や Spring Framework のみに固執することなく、フロントエンドとして Java 以外のメジャーな技術のコードや環境を整えてくれます。

活きたコードによるノウハウの共有

システム構築において、これから導入しようとするライブラリやサービスが JHipster が適用されている場合、動作するコードが手元にあることで、より理解が促進します。また、一旦導入が成功したものについては、ドキュメントのみならず Blueprint に残すことができれば、後続の適用がさらに容易になり、ノウハウの継承にも役立ちます。

シンプルですが一例として、当社はとある開発で帳票機能を JasperReports + JHipster で開発した際、ノウハウを伝える目的で後に Blueprint を作成しました。この Blueprint を適用すると、以下に示すように一覧画面がカスタマイズされ(黄色が帳票ボタン)、ボタン押下によって値が埋め込まれた状態でのサンプル帳票がダウンロードされます。ここまでノーコードであとはレイアウトを作成していく作業となります。

帳票Blueprint適用後の一覧画面 ダウンロードした帳票サンプル

これにより、後続する別の開発では「Reactの画面ボタンを推すと帳票がダウンロードされる」ところからスタートすることができ、かつ JasperReports の動作の仕組みも、動くサンプルをベースに学ぶ事ができます。

JHipsterの近況と今後

2023年2月現在では、Spring Framework6/Spring Boot3へ対応すべく JHipster8 の開発が進められています。

また、ここ数年のJava界隈では、クラウド対応すべく GraalVM や Spring Framework6 の SpringNative の採用といった Native化の話題が盛んでした。JHipsterもそれに追従すべく、GitHubのプロジェクトや Oktaブログ、YouTube では、MSAへの適用を目論んだNative化の情報が盛んです。

それとは別に、さらなる進化を求めて JHipster の次世代を模索する動きもあります。JHipster Lite という名の実験的なプロジェクトで、生成コードの構造をHexagonal Architecture に準拠させたりなど、より疎結合性を高めメンテナンスを簡易にするための試みが発動しています。

最後に

以上、JHipster が持つ機能や動向を中心に説明しました。JHipsterは日本語による情報が少ないため、少しでも認知度が高まるよう、今後も当社から情報発信できればと考えています。今回の記事が関心をもつきっかけとなっていただければ幸いです。

次回以降は、当社が JHipster について取り組んでいる内容について、もう少し詳しく説明していきます。

参考文献


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。