WebエンジニアのためのSalesforce開発入門

普段はWebサービス開発を行っているエンジニアが、Salesforce上で開発をすることになった際のチュートリアルを残しておきます。

現状のSalesforceは開発者フレンドリーとは言いづらい状態です。開発に関する資料は量はあるものの独自のキーワードが多く分かりづらく、ベストプラクティスが見えません。
またサービス自体も全体的に新しい機能がつぎはぎで追加されており、とっちらかっている感じが否めません。（アップデートを繰り返して頑張ってるのは伝わってくるのですが…）

しかし最近はSalesforceも開発者へのサポートを手厚くしようとしているようで、ちゃんと一般的な開発手法も可能になってきていいます。
ここでは、Salesforceに初めて触るWebエンジニアが、一通り開発ができるようになるまでの道のりを示します。

※Salesforce開発が本業のわけではないので、間違っている点などあれば申し訳ありません。

## Salesforceとは
**Salesforce自体は、アプリケーション開発のためのプラットフォームです(※1)**。公式には `Salesforce Platform` と紹介されています。
ざっくりと言えば、「DBのスキーマを定義するとCRUDの画面が自動的にできる」「各種権限管理」「Callbackなど複雑なイベント管理」「レポーティング」などの機能がGUIで開発できるサービス、という感じです。

公式からはスキーマと画面のプリセットのようなものがいくつか提供されており、**このプリセットで一番有名なのが[Sales Cloud](https://www.salesforce.com/jp/products/sales-cloud/overview/)という顧客管理システムです**。社内の営業組織が、顧客とそれに紐づく情報をGUIで管理するシステムですね。一般的にSalesforceというと、この顧客管理システムを指します（少なくとも営業組織の文脈では）。
公式的にはこのプリセットを `Cloud` と呼んでいます。

※1 この認識で正しいかどうかは分からないですが、少なくともWebエンジニアから見たサービス像としては合っているはず。

## 触ってみる
30日間の無料トライアルがあるので、まずはSales Cloudを触ってみましょう。

[無料トライアル](https://www.salesforce.com/jp/form/trial/freetrial.jsp)

「リード」とか「商談」とか独自のキーワードが分かりづらいと思いますが、CRUD画面をメインに構成されるSalesforceの雰囲気が伝わると思います。
余談ですが、以下の本を読んで現代の営業活動モデルを知っているとSalesforceを理解しやすいでしょう。
https://www.amazon.co.jp/dp/B07M5W8GCQ

##### 注意
sign up後に確認メールが来ますが、sign upしたのと同一セッションの同じブラウザで確認URLを開くようにしてください。これを行わない場合、何の警告文もなくログイン画面に飛ばされ、確認フェイズが終わりません。

これはまだ良いのですが、問題は上記を行ってセッションを失ってしまった場合、登録に使ったメールアドレスで再登録する術がなくなります。再申し込みしようとしても登録済み扱いになり、「パスワードを忘れた人は〜」の導線を使っても未登録の秘密の質問を聞かれて詰みます。ご注意ください。
（公式にも問い合わせましたが、既知の挙動のようです）

Salesforceはこういう残念なUXが散見され、触っててなかなか辛いのでご注意ください。
**わからなくなったら自力で解決しようとせず、すぐに問い合わせするのがベストプラクティスです。**

##### 標準オブジェクトについて
「リード」「商談」といったものは標準オブジェクトと呼ばれます。これがDBの1テーブルに相当します。

それぞれの標準オブジェクトの関係がわからない方は、こちらのER図を参考にどうぞ。

[エンジニアのためのsalesforce超入門](https://qiita.com/tarokamikaze/items/0bc2988534f63d4b65c5#%E6%A8%99%E6%BA%96%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AEer%E5%9B%B3)

## 開発手法を学ぶ
一通り触ってみたところで、いよいよSalesforce上で動くアプリの開発を始めていきましょう。
いきなり大きなアプリを作るより、Sales Cloudの拡張くらいの開発を目指す人も多いかと思いますが、やることは同じです。

エンジニアであればまず開発ドキュメントを探しに行くと思いますが、Salesforceは開発ドキュメントが充実しています。Trailheadというサービスで、一通りのドキュメントを読むことができます。開発については以下が一番体系的にまとまったページでしょう。

[開発者初級 | Salesforce Trailhead](https://trailhead.salesforce.com/ja/content/learn/trails/force_com_dev_beginner)

独自のキーワードが多く多少読みづらいですが、以下をさらっと読むのをオススメします。（あまり深入りする必要はありません）

* プラットフォーム開発の基礎
* データモデリング
* 数式と入力規則
* lightningフロー
* Apexの基礎とデータベース

## 開発のベストプラクティスを探す
一通りドキュメントを読むと、モダンな開発スタイルに慣れたWebエンジニアであれば「GUI開発しかできないのか？手元で開発できないのか？」「バージョン管理どうするのか？」「リリースフローは？本番環境で開発するしかないのか？」「CI/CDないのか？」ということが疑問になると思います。

このようなモダンな開発スタイルでの開発は**Salesforce DX**を使うことで達成可能です。

[Salesforce DX の使用開始](https://trailhead.salesforce.com/ja/content/learn/trails/sfdx_get_started)

これを使うと、普通に手元でソースコードを書き、git管理して、staging/productionにアップロードする、という一連の開発フローが可能になります。
（これに気づくのに少し時間がかかったため、なぜこれをもっと目立つ箇所で教えてくれないのか…と自分は思ってしまいました。。）

（2022年3月追記） 現在、Visual Studio Codeを使った開発方法も推奨されているので、こちらもご検討ください。vscodeを使っていても、裏側で動いているのはsfdxなので、sfdxを理解しておくにこしたことはありません。

https://trailhead.salesforce.com/ja/content/learn/projects/quickstart-vscode-salesforce/use-vscode-for-salesforce

## Salesforce DXを使った開発
上記のTrailheadを読むことで大体把握できると思いますが、まだ分かりづらいところもあるので、ここでも補足しておきます。

### 諸注意(という名の罠集)
##### DevHubの有効化
[![Image from Gyazo](https://i.gyazo.com/5f3d9bac39c0533207233a9b8d574c7e.png)](https://gyazo.com/5f3d9bac39c0533207233a9b8d574c7e)

有効化しようとしたところこの状態でボタンが押せず、色々調べた挙句に問い合わせをしたのですが、この状態が有効化できているボタンらしいです（マジか………）。

##### スクラッチ組織作成の回数制限
[無料トライアルでは1日に作成できるスクラッチ組織は6つまでです。](https://releasenotes.docs.salesforce.com/ja-jp/winter19/release-notes/rn_sfdx_dev_hub.htm
)
>理由: 有効期間が 30 日の特別な Dev Hub トライアル組織にサインアップする必要がなくなりました。Developer Edition 組織は、有効になっている間は期限切れになりません。トライアルまたは Developer Edition の Dev Hub では、1 日あたり最大 6 つのスクラッチ組織とパッケージバージョンを作成でき、有効なスクラッチ組織を 3 つまで設定できます。

回数を超過した場合、以下の汎用エラーが発生します。気づきづらいのでご注意ください。（エラーメッセージにちゃんと書いて欲しい……………）

`ERROR:  A fatal signup error occurred. Please try again. If you still see this error, contact Salesforce Support for assistance. sfdx-project.json.`


### モダンなWebアプリケーションフレームワークの使用
更にモダンな開発環境にするために、Vue/React/Angularなどのモダンなフレームワークを使いたくなるのが人情というものでしょう。

残念ながら公式にこういった方法はアナウンスされていませんが、Visualforceページで開発すれば、普通にjsとAPIを使えるため、こういったフレームワークも使えるようです。（自分では試していません）
(参考) https://qiita.com/atskimura/items/4c034b0327abc1d91184

そのため、結局開発方針としては

* Salesforce DX + Lightningコンポーネントフレームワークを使って開発（公式、標準コンポーネント軍を使える、しかし勉強が必要）
* Salesforce DX + Visualforce + Webフレームワークを使って開発（公式ではなくドキュメントない、標準コンポーネント使えない、いつも通り開発できる）

のどちらかを選んで開発することになります。


## Salesforce APIを使った開発
ここまではSalesforce上での開発について述べましたが、Salesforce上でシームレスに動作するアプリである必要がないのであれば、外部のWebアプリとして開発するのも手です。
その際、SalesforceのデータにアクセスするためにAPIを使うことができます。

[REST API の使用 | Trailhead](https://trailhead.salesforce.com/ja/content/learn/modules/api_basics)

### APIの設定方法
APIの設定方法も公式ドキュメントだと分かりづらいのでここに書いておきます。

まずはOAuthアプリをSalesforce上で作成し、Consumer KeyとConsumer Secretを取得する必要があります。自分の組織のSalesforceで、以下から設定してください。

`設定 > アプリケーションマネージャ > 新規接続アプリケーション`
[![Image from Gyazo](https://i.gyazo.com/030d00ddd39636dfa236f09c3c49e5d4.png)](https://gyazo.com/030d00ddd39636dfa236f09c3c49e5d4)

Consumer Keyを作成したら、以下URLでアクセスすると、tokenを取得できます。
`https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id=<取得したConsumerKey>&redirect_uri=http://localhost:3000/`

（リダイレクト先）
`http://localhost:3000/?code=<アクセストークン>`

実際にWebアプリで使う際はライブラリを使うと良いでしょう。Rubyでいうと以下のようなライブラリがあります。
https://github.com/restforce/restforce
https://github.com/realdoug/omniauth-salesforce