エキサイト株式会社エンジニアの佐々木です。SpringBootは、Webアプリケーションフレームワークというのが一般的な認識可と思いますが、結構なんでもできたります。今回はマイナーな、インタラクティブなCUIアプリケーションを作る、SpringShellの機能についてご紹介します。(https://docs.spring.io/spring-shell/docs/2.0.1.RELEASE/reference/htmlsingle/)
はじめに
運用フェーズで極稀に操作することとかあるとおもいます(あまりしたくはないですが)。そういうときに、Shellが役に立つことがあります。
設定
build.gradle
依存関係を解消するのに、下記のように修正します。
依存関係の解決と、 ./gradlew bootRun
で実行したときに標準入力を有効にするオプションを追加します。
dependencies { .... implementation 'org.springframework.shell:spring-shell-starter:2.0.1.RELEASE' // これを追加する .... } bootRun { standardInput = System.in // ./gradlew bootRun で実行したときに、標準入力を有効にする為 }
application.properties
下記を入れないと循環参照エラーで起動しないのを回避するのに追加します。
.... spring.main.allow-circular-references=true ....
コード
ここからはWebアプリケーションと同じようなエンドポイントのようなものを書いていきます。
package com.example.batch.controller; import org.springframework.shell.standard.ShellComponent; import org.springframework.shell.standard.ShellMethod; @ShellComponent public class DemoShellController { @ShellMethod(value = "足し算をする", key = "sampleAdd" , group = "calc") public Integer add(int a, @Max(10) int b, @ShellOption(value = "--optional_c" , defaultValue = "1") int c){ return a + b + c; } }
このような感じで記述できます。@ShellMedthod
でShellのエンドポイントを定義できます。value
のアトリビュートは必須設定ですが、その他は任意になります。コマンド名はデフォルトメソッド名ですが、key
をつけることにより変更できます。@Max
でValidationも付与でき、@ShellOption
で引数名変更やデフォルト値を入れることも可能です。デフォルト値を入れないと、必須パラメータ
になるので、注意してください。
実行
動作結果としてはこのような感じになります。 補完が効くのも便利です。
shell:>sampleAdd 1 10 12 shell:>sampleAdd 1 11 The following constraints were not met: --b int : 10 以下の値にしてください (You passed '11') shell:>sampleAdd 1 11 10 The following constraints were not met: --b int : 10 以下の値にしてください (You passed '11') shell:>sampleAdd 1 10 10 21 shell:>
まとめ
Shellアプリケーションが簡単に実装できたかとおもいます。Java + SpringBoot + Gradleではマルチプロジェクト、モジュラーモノリス構成が簡単に構築できますので、内部の実装はWebアプリケーションで開発した実装を使用することが可能です。SpringBoot依存にはなってしまいますが、サービスが大きくなってきたらマイクロサービスに切り出すでいいかと思っております。
今回は、インタラクティブ(対話的)なShellアプリケーションでしたが、同じソースコードでバッチ処理も可能ですので、次回ご紹介いたします。
おわりに
エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。
カジュアル面談はこちらになります! meety.net
募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com
以上となります。