ローコード開発ツール「Retool」で業務の変化に対応する

@nyasba-gxpです。
本記事は[グロースエクスパートナーズ アドベントカレンダー](https://qiita.com/advent-calendar/2020/gxp)1日目の記事です。

1日目は、当社が最近の案件で導入した**開発者向けのローコード開発ツール「Retool」**をご紹介します。

Web画面上でコンポーネントを配置して少しコードを書くだけで画面が作成できるツールです。見た目にあまりこだわらない業務画面向け。既存システムのバックエンドリソースとの連携が容易で、Gitをベースとしたモダンな開発スタイルも実現できていますので、開発者にとって使いやすくバランスが取れています。控えめに言ってもオススメです・・！！


## [Retool](https://retool.com/)とは 

Retool社が提供するローコード開発ツールです。 https://retool.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/5878763c-44cb-4761-182d-171d70d445ac.png)

実装時の画面はこのような形です。Web画面上で右側のパネルからコンポーネントを配置して以下のような画面をすぐに実装することができます。業務系画面でよくある「検索・一覧・詳細画面」などはもちろん、モーダル・タブ切り替え・グラフなど豊富なコンポーネントが用意されており、シンプルで統一感のあるUIが特徴的です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/4c1d33a9-0c06-6396-ae03-fe44a8e9a7d8.png)

できあがりはこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/d1a04197-0346-7c86-b879-e28a17673696.png)


外部システムとの接続設定はResourceとして管理します。DBやAPIを中心に数多くのResourceが定義できます。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/8bf1ac1b-b7e9-1423-cba5-9e4ff4c63e6a.png">

そして、定義したResourceを各画面で指定してQueryを作成することでデータを操作します。下の例ではDBにアクセスしており、この結果をテーブルコンポーネントで読み込むことで一覧画面が実現できます。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/79933181-2f82-8e5b-59c2-de88a28415fc.png">


このようなDBアクセスの前後に処理をはさみたい場合やフォーマット変換などが必要な場合は、Javascriptのコードを書いて差し込むことができます。API呼び出しのケースなどでは、JSONで返却されたレスポンスを読み取って画面表示するケースなども多いかと思いますが、以下のように書くと、Retoolが用意したエラーのポップアップ通知を表示することができます。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/a054f22d-db58-c31b-f0af-d688d6840946.png">


## なぜローコード開発ツールを採用したのか 

内部で利用する画面をスクラッチで開発するのではなくツールを導入することで、**低コスト** かつ **スピード感** をもって業務の変更に対応したいというお客様のご要望に対応するためです。

当初は非開発者が画面構成を変更する可能性まで考慮して検討していましたが、Retoolの開発プロセスを精査した結果、現在は開発者のみが修正する想定で運用しています。


## 提供パターン

Retool社が提供するサーバ上で稼働する **クラウド版** と、自前のサーバで提供する **オンプレ版** の2種類の提供パターンがあります。オンプレ版といっても、自前のAWSアカウントで稼働させる場合もオンプレ版という扱いです。

当社ではオンプレ版をAWS(Fargate)で稼働させていますので、本記事の開発プロセスに関しての説明は**オンプレ版を前提として**記載します。



## Retoolのステキなところ

### 1. 細かいところまで手が届く

ローコード開発ツールを用いたときに課題となるのが、ツールの制約との向き合い方ではないでしょうか。決まった制約の中で型に落とし込めると強い反面、型にはまらないものは実現するのが困難です。

業務的な画面を実装していると、利用ユーザの方からは「こんなことできますか？」という要望をいただくことがよくあります。ビジネスの都合を考えると「ツールの制約だからできない」では通用せず、なんとか実現する方法を考える必要があります。そんなときでも、Retoolならなんとかできます。

#### (a) 複雑なバリデーション

Javascript実行のQueryを用いることで、下記のようにコードを書いてバリデーション処理を実現することができます。この例はシンプルですが、複雑な仕様であってもコードを書いて実現しているためある程度は対応可能です。

```
if (text1.value.length > 10) {
  utils.showNotification({
    title : "タイトル",
    description : "text1は10文字以内で入力してください",
    notificationType : "warning"});
  return;
}
query.trigger()
```
showNotificationは画面右上に、このようなポップアップを出すRetool組み込み関数です。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/ae874816-d95b-7836-5e7c-ca3cb9528e3b.png">

#### (b) 日付の表示形式

moment.jsがRetoolプラットフォームに組み込まれているため、こちらもJavascriptを用いて変換が可能です。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/cc981161-cef9-320a-edd0-9f94bd87d119.png">

#### (c) 物理値と表示名のマッピング

標準コンポーネントレベルでも以下のように `Values` と `Display values`を用いて指定可能ですが、複雑なものであってもJavascriptを用いて実現も可能です。
<img width="250" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/7d0f3be1-634d-2c64-4ae5-cac80f9f8314.png">


#### (d) 強調表示

テーブル内の一部のレコードを条件付きで強調表示したい場合は、列の定義（Mapper)でif文を記載してHTMLを出し分けることで対応できます。pure HTMLのチェックを入れておくことでHTMLとして扱われる機能を利用し、class属性を付与することができます。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/f038fcab-9f07-1d60-7e3f-5ece60153791.png">

そして、適当な隙間に何も設定されていないテキストコンポーネントを配置し、こちらも「Render as HTML」としておくことでcssが適用され、見た目を切り替えることが可能となります。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/888575/e7ab28b3-aa06-4ba8-39db-f38d9e0543b1.png">


#### 画面間のデータの引き継ぎには弱い

そうはいっても苦手なところもあり、画面間のデータの引き継ぎは弱いです。
URLパラメータやlocalStorageは利用できますが、Retoolでは画面を互いに独立した存在と扱っていますので、ツールの設計思想に準じた設計をする必要があります。ただし、外部リソースおよびJavascriptを工夫して何とかできる余地は十分にあります。


### 2. ローカル開発 & GitSync 

2点目は、Gitを活用して一般的なスクラッチ開発同様の開発プロセス および 自動デプロイが実現できる点です。

**（再掲）本説明はオンプレ版を前提としています**

<img width="1200" alt="Retool Git Workflow" src="https://raw.githubusercontent.com/nyasba/retool-demo/master/development-process.drawio.svg">

ローカルで開発したRetoolアプリはApp単位（＝画面）でymlファイルに自動的に保存されています。アプリ以外にもリソースや設定もymlとして保存されています。それらを手元でコミットして、PullRequestを送ることでGitベースの開発〜デプロイのパイプラインが実現できます。当然、ymlを別ブランチに切り替えればローカルのRetoolも切り替わりますので、Gitを用いた一般的なアプリ開発と同等になります。

サーバ側のRetoolは、Gitリポジトリの特定ブランチ → サーバ という方向のGitSync設定を有効にしておくことで、PullRequestがマージされると自動的にデプロイも実施されます。RetoolのバックエンドでGitリポジトリに対して定期的にポーリングが行われる形で実現しているようです。

さらに、環境依存の情報はRetoolサーバの環境変数で切り替えられるため、環境構築も容易です。このあたりからもツールとしてのセンスの良さが伺えます。


### 3. 既存システムへの組み込みやすさ

3点目は、すでに稼働している既存システムのバックエンドをうまく活用することができる点です。

SalesforceやKintoneなどと異なり、データベースに密結合したシステムではないため、既存のデータソース（DBやAPI）をそのまま活用することができます。データ移行も不要となるため、導入の敷居がかなり低くなります。

他システムのリソースをRetoolと連携させた場合、システム構成はこのようになります。
Retoolの稼働するアプリケーションサーバ、データベース(Postgres)の準備は必要ですが、あとは既存システムのDBやAPIに接続して画面を作り込むことができます。Javascriptベースでの開発ですがクライアントから各リソースへの接続はなく、Retoolアプリサーバからプライベートな通信で接続できます。
<img width="600" alt="Retool Architecture" src="https://raw.githubusercontent.com/nyasba/retool-demo/master/architecture.drawio.svg">



## 料金体系

利用ユーザのアカウント数に応じた課金となります。公式情報は[こちら](https://retool.com/pricing/)です。

## 触って動かしてみるためには

### クラウド版

SignUpすれば無料で試すことができます。Freeプランの場合は、編集モードのみに限定されています。
https://login.retool.com/auth/signup

### オンプレ版

オンプレ版の開発プロセスやコード管理に興味がある方は、公式に提供されているDockerイメージを利用します。
テンプレートプロジェクトが公式に公開されていますので取得してreadmeの通りにdocker-composeを起動することで、ローカルに環境が構築できます。
https://github.com/tryretool/retool-github-template

ただし、オンプレ版で画面を**編集**するためには **ライセンスキー** が必要となりますので、ご注意ください。ライセンスキーがない状態であっても、手元で動かすことはできます。保存ができません。

オンプレ版で環境を構築するための情報をまとめたGithubリポジトリもあります。AWS Fargate, Kubernetes, herokuなどへのデプロイ設定が公開されています。
https://github.com/tryretool/retool-onpremise

## まとめ

開発者向けのローコード開発ツール**「Retool」**を紹介しました。

既存システムのバックエンドリソースとの連携が容易で、Gitをベースとしたモダンな開発スタイルもできていることが特徴です。冒頭にも書きましたが、**開発者にとって使いやすくバランスの取れたツール**ですのでオススメです！


興味をお持ちの方はぜひご連絡ください。
本記事のコメント、または[問い合わせページ](https://www.gxp-group.co.jp/contact/input/gxp)よりお願いします。