SpringBootで対話的インターフェースをSpring Shellで実装する

エキサイト株式会社エンジニアの佐々木です。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:>

f:id:earu:20211122100917g:plain

まとめ

Shellアプリケーションが簡単に実装できたかとおもいます。Java + SpringBoot + Gradleではマルチプロジェクト、モジュラーモノリス構成が簡単に構築できますので、内部の実装はWebアプリケーションで開発した実装を使用することが可能です。SpringBoot依存にはなってしまいますが、サービスが大きくなってきたらマイクロサービスに切り出すでいいかと思っております。

今回は、インタラクティブ(対話的)なShellアプリケーションでしたが、同じソースコードバッチ処理も可能ですので、次回ご紹介いたします。

おわりに

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

カジュアル面談はこちらになります! meety.net

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com

以上となります。