Dockerでサクッと試すローコード開発 -「iPLAss」

本記事では、Dockerで「iPLAss」をインストールし、簡単に機能を試すまでの手順をまとめます。
近年開発手法として注目される「ノーコード開発」や「ローコード開発」ですが、iPLAssが提供するローコード開発の形をDockerでサクッと体験してみてください！

# iPLAssとは

「iPLAss」は、オープンソースのローコード開発プラットフォームです（OSS版のライセンスは、`AGPL v3`になります）。

以下のような特徴を持ちます。

- **ノーコード開発**
GUI操作によるノンプログラミングでのデータ定義やその他の各種定義（認証ポリシーや画面表示に関する設定など）を行うことでアプリケーションの構築が可能です。また、データ定義を行うことで自動的に当該データのCRUD（登録/参照/更新/削除）機能を持った汎用管理画面を構成します。<br/>
▼ `Admin Console` という管理者向けのWebコンソールで各種定義が行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/37f26438-4f43-cfe3-310c-abcf1279de20.png)
▼ 上記画像のデータ定義で実際に自動構成された新規登録/編集画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/d902c03e-bd13-0653-045a-a2710704edf0.png)

- **ローコード開発**
「ローコード開発プラットフォーム」を謳う通り、コーディングによる柔軟な拡張・カスタマイズを可能とします。
`Java/Groovy`のコーディングによる柔軟なカスタマイズ組み込みが可能なほか、コンシューマ向けサイト等のフルカスタマイズされた画面/機能開発が可能なMVCパターンのフレームワーク提供、WebAPI提供などを行っています。
`Groovy/Groovy Template（GroovyベースのJSPライクなテンプレート言語）`でロジックを作成した場合、変更反映の為にコンパイル・warデプロイは必要ありません。また、それらのロジックは`Admin Console`から直接ブラウザ上のエディタで記述可能です。<br/>
▼ 例えば、データ操作イベント時に独自の処理を実行する`EventListener`を自由にコーディングできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/ef0ad048-b55a-f192-22f0-f45c96b2c852.png)


- **豊富な汎用機能**
上記に挙げた以外にも、`認証/認可機能`や`ID連携機能`、`帳票出力機能`、`メール通知機能`、`多言語対応`といったアプリケーションで必要になることの多い汎用機能を標準で提供します。

▼ iPLAssの詳細については、以下ホームページ/開発ドキュメントをご参照ください。

https://iplass.org

▼ GitHubのリンクは以下になります。

https://github.com/ISID/iPLAss

# 事前準備

本手順は[Docker](https://www.docker.com/)がインストール済みであることを前提としています。
Dockerのインストールがまだの場合は、お使いのOSに合わせてインストールを行ってください。

また、必要に応じて、iPLAssの設定定義ファイルやLOBデータなどを配置するiPLAssのホームディレクトリを作成してください（ホストマシン側にファイルを配置することで、設定定義ファイルの編集やバージョンアップが容易になります）。

# DockerでiPLAssをインストール

### 1. Dockerイメージをダウンロード

以下のコマンドを実行して、iPLAssのDockerイメージをダウンロードしてください。

```console
docker pull iplass/iplass-standalone
```

:::note info
ダウンロードしたDockerイメージは、Web/APサーバに `Tomcat`、DBサーバに`MySQL`をバンドルし、iPLAssの動作に必要なアプリケーション及びライブラリをパッケージングしたiPLAssのDockerイメージです。
:::

### 2. コンテナの作成と起動

以下のコマンドを実行して、コンテナの作成と起動を行ってください。
パスワードには、6文字以上の英数字のみ入力可能です。

```console
docker run -p 8080:8080 -e IPLASS_TENANT_ADMIN_PASSWORD=[管理者パスワード] iplass/iplass-standalone
```

:::note info
事前準備でiPLAssのホームディレクトリを作成した場合は、`-v [作成したディレクトリの絶対パス]:/var/lib/iplass`をコマンドに追加してください。同様の手順でMySQLのデータディレクトリをホストマシン側にバインドマウントすることも可能です。
また、上記コマンドで設定した環境変数以外にも、設定可能な環境変数がいくつか存在します。詳しくは、 [Docker Hubに記載のドキュメント](https://hub.docker.com/r/iplass/iplass-standalone/) をご参照ください。
:::

### 3. Webアクセス & ログイン

コンテナ起動後、Webブラウザで[http://localhost:8080/iplass](http://localhost:8080/iplass)にアクセスしてください。アクセスすると、iPLAssのインストールが自動で開始されます。
ログイン画面が表示されたら、IDに`admin`を、パスワードに`コンテナ作成時に指定したパスワード`を入力して、ログインしてみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/ad78160f-64ca-1e34-62cb-e7e48e999a18.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/cda4daab-0da6-0448-1b77-dbf4b1155a0e.png)

# 動作確認

### 0. 用語説明

動作確認前の前提知識として、iPLAssの用語について簡単に説明します。

iPLAssでは、管理するデータ定義を`Entity（エンティティ）`と呼びます。エンティティはRDB上でのテーブルと同義のものです。更に、エンティティは`プロパティ（属性）= RDB上でのカラムと同義`を持ちます。また、定義されたエンティティをどのように画面に表示するか（入力フィールドなのか、プルダウンなのか、項目並び順、表示有無など）も設定可能です。 

これら、アプリケーションで扱うデータや振る舞いを定義する設定情報を`メタデータ`と呼びます。先に記した`Entity定義`の他にも、以下のようなメタデータが存在します。

| メタデータ | 説明 | 
|:-----------|:------------|
| エンティティ定義 | エンティティとそのプロパティ（属性）を定義します。 エンティティに定義されるプロパティのデータ型や制約、またエンティティ間のリファレンス（参照）を定義することが可能です。|
| エンティティビュー定義   | エンティティのCRUD機能を持った汎用画面に関する定義です。エンティティの各プロパティ（属性）について、その表示有無や表示形式（テキストフィールド、ラジオボタン、リッチテキストエディタなど）、初期値などを定義することが可能です。|
| 認証ポリシー定義    | パスワードの有効期限、複雑度、ユーザロックなど、ユーザ認証の方法やそのポリシーを定義することが可能です。|
| メールテンプレート定義    | パスワードリセット時の通知メールといったiPLAssが送信するシステムメール、カスタムロジック内で送信するメールのテンプレートを定義することが可能です。テンプレート文面にユーザ情報などを埋め込むことも可能です。|
| メニュー定義/トップビュー定義  | サイドメニューに表示する項目や、ログイン後のトップ画面に表示する項目を定義することが可能です。|
| Template定義    | カスタムで作成された画面の定義、およびその画面生成ロジックを定義することが可能です。テンプレート定義にはいくつかの種類があります。 主にHTMLなどのテキストデータを出力する為のJspTemplate、GroovyTemplateやバイナリ出力用のTemplate、帳票出力用のTemplateなどが存在します。|
| WebAPI定義| カスタマイズで作成したCommandをRESTful形式などのWebAPI経由で呼び出す為の定義です。また、Entityに対するCRUD操作やメタデータ定義に対するCRUD操作、 バイナリファイルのアップロード/ダウンロードを行うWebAPIを標準提供します。|

これらのメタデータを標準提供、AdminConsole上（XMLファイルやJavaのアノテーションで設定可能な定義もあります）で設定していくことにより、最小限のコーディング量によるアプリケーション構築を可能にしています。

### 1. データ定義の作成
前置きが長くなりましたが、いよいよ動作確認です。

以下のような、商品を管理する商品マスタEntityを生成することを考えます。
※ エンティティには、標準プロパティ（ID、名前など）やシステムプロパティ（作成日や更新日、作成者、更新者など）がデフォルトで定義されている為、商品IDのようなプロパティは作成しません。

|プロパティ名| 表示名 | 型 | 必須 or 任意 |
|:--|:--|:--|:--|
| name | 名前 | String | 必須 |
| description | 説明　| String | 任意 |
| price | 価格 | Integer | 必須 |
| releaseDate | 発売日| Date | 任意 |

以下の手順で商品マスタEntityを定義します。

1. `AdminConsole`を開く
![open_adminconsole.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/a11d91e7-6d2e-7aa7-45dd-93af8f5f491d.gif)

2. エンティティ定義を作成する
![create_newentity.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/3f53d870-0ad8-f08b-7702-b609b4c61357.gif)

3. 各プロパティを定義する
    1. `商品価格プロパティ`の定義（必須チェックのような汎用的なバリデーションを標準提供しています。Requiredにチェックを入れることで必須チェックが有効化されます。）
    ![create_property_price.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/36172792-5b1e-c4b7-a008-b43a5711b2f7.gif)

    2. `発売日プロパティ`の定義
    ![create_property_releaseDate.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/4bc38c74-d991-4525-e367-f430cd8cdffb.gif)

### 2. CRUD機能を持った汎用画面の動作確認
作成したエンティティ定義が、汎用画面でどのように自動構成されているかを確認しましょう。
汎用画面に戻り、画面をリロードすると、サイドメニューに「商品マスタ」が追加されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/fba5e2f9-d930-850d-45eb-efa53d23265d.png)

「商品マスタ」を押下すると、商品マスタのデータを検索する為の検索画面が表示されます。この検索画面から新規登録/編集画面、詳細画面へと遷移することが可能です。

以下に各画面の例を載せます。今回の動作確認では実施しませんが、データ定義により自動生成された`エンティティビュー定義`を編集することで、プロパティの表示有無や表示形式、初期値などを細かに設定することが可能です。

- **新規登録/編集画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/d902c03e-bd13-0653-045a-a2710704edf0.png)

- **詳細画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/18d8ef2c-76ce-6b8c-dca4-5310e7fff8a7.png)

- **検索画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/e52cea99-c9e0-195c-9f7b-965167392dd1.png)

### 3. 検証ロジックのカスタマイズ
iPLAssでは、データ登録時/更新時にデータ検証を行うことが可能であり、必須チェックやLengthチェックなどの汎用的なValidatorを標準で提供しています。

今回は、Groovyのコーディングで、「商品を新規登録する場合、発売日は登録日の翌日以降のみ指定可能とする」というカスタムの検証ロジックを実装することを考えます。

`AdminConsole`で以下のようにカスタムのValidaterを定義します。エラー時のメッセージは柔軟にカスタマイズ可能であり、多言語にも対応しています。

![customize.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/876ed77d-bf98-11ec-7717-b5876edfe85d.gif)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630527/5e8f24a9-65e1-8bc3-0d91-214b57138a32.png)

実際のGroovyコードは以下の通りです。`OID`というのは、Entity定義内のデータのIDです。

```groovy
// 新規登録の場合は、oidがnull
def oid = entity.oid

if (oid == null) {
    def releaseDate = value
    def currentDate = new Date()
    return currentDate.before(releaseDate)
} else {
    return true
}
```

# 最後に

今回の記事では、Dockerで「iPLAss」をインストールし、簡単に動作確認するまでの手順をまとめました。

よりiPLAssの機能を理解していただく為、高度なカスタマイズをお試しいただく為に[チュートリアル](https://iplass.org/docs/gettingstarted/index.html#_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB)や[ECサイトを模したサンプルアプリ](https://iplass.org/docs/sample/index.html)を用意しています。気になった方は是非ご確認ください！

最後までお読みいただき、ありがとうございました！
今後ともiPLAssをよろしくお願いいたします。