SAP Cloud SDK for JavaScriptを使ってみる （1）概要

##はじめに
SAP Cloud SDKとは、SAP BTP上で動くアプリケーションを開発するためのライブラリやツールのセットです。私はこれまであまり使う機会がなかったのですが、CAPとの使い分けなども気になったので調べてみました。
以下の予定で、SAP Cloud SDKを使ってみてわかったことをまとめたいと思います。

- 概要（この記事）
- [サービスを作成する](https://qiita.com/tami/items/2206a478a1ef9998e3b0)
- [テストを書いてみる](https://qiita.com/tami/items/d454387653ece6e72f2f)
- [CI/CDの設定をする](https://qiita.com/tami/items/9cbe4c94129fa2767efb)

SAP Cloud SDKにはJava版とJavaScript版があります。Java版とJavaScript版ではJava版の方が機能が多く、新しい機能も先に実装される傾向にあります。
参考：[Feature Matrix](https://sap.github.io/cloud-sdk/docs/overview/cloud-sdk-feature-matrix)
私にJavaのスキルがないため、この記事ではJavaScript版を対象とします。

##SAP Cloud SDKの特徴
SAP Cloud SDKで提供されるものは、大きく3つに分けられます（以下の図を参照）。土台となるのはBTPへの接続を提供するConnectivityの部分です。Connectivityは、BTP上に登録されたDestinationの取得や、認証などを（開発者が意識しなくてもいいように）裏で行ってくれます。Connectivitiyを利用することで可能になるのがODataサービスやOpen APIへの接続です。SAP Cloud SDKでは、事前定義されたクライアントライブラリ、またはジェネレーターを使用して生成したライブラリを使用して簡単にODataサービスやREST APIにアクセスすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/b197996d-b792-2a2e-0ea6-0504a85a9f3f.png)

##OData ClientやOpen API Clientを使用する利点
ODataサービスやREST APIへは、SAP Cloud SDKのライブラリを使わず直接アクセスすることもできます。このときの問題点は、エンティティやプロパティを正確に指定しないと実行時にエラーになってしまうことです。
SAP Cloud SDKはODataサービスやREST APIを利用するためのTypeScriptで書かれたライブラリを提供します。このライブラリを使用してODataサービスやREST APIにアクセスすることで、コーディング時に型のチェックが可能になります。また、TypeScriptを使用することによりオートコンプリートやスペルミスのチェックも可能になります。

##SAP Cloud SDKの用途
SAP Cloud SDKはBTPへの接続や、ODataサービスやREST APIへの接続を簡単にするというのが利点です。一方、SAP Cloud SDKで開発したサービス自体もHTTPリクエストを受け、結果を返すというAPIの働きをします。
このことから、以下の用途が考えられます。

**①バックエンドへのプロキシとなるサービスの開発**
SAP Cloud SDKで開発したサービスで、バックエンドへのアクセスを中継します。
元のAPIよりも項目を絞って簡素にしたり、バリデーションや代入など独自のロジックを追加したりすることができます。また、複数のサービスへのアクセスを一か所にまとめることで、サービスを使用するアプリ側からどのバックエンドに接続しているかを意識しなくて済みます。

フロントエンドをUI5で実装する場合、SAP Cloud SDK作成されるサービスはODataではなく（$metadataを持たない）REST APIになるため、以下のような点に留意が必要です。

- Fiori elementsやSmart Controlが使えない
- コントロールにデータを直接バインドすることができない（データを取得してからJSONオブジェクトをバインドする必要がある）

また、フロントエンドアプリを置かずにSAP Cloud SDK作ったサービス自体直接呼んで使うこともできます（webhookとして使用したり、workflowやintegration flowの中から呼ぶなど）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/55b23335-3988-f6f3-9760-0684dbbbf940.png)

**②CAPのイベントハンドラの中で利用**
CAPのイベントハンドラの中でSAP Cloud SDKのライブラリを使ってバックエンドにアクセスします。この方法については以下のブログで紹介されています。
[Part 2: How to build an extension application for SAP S/4HANA Cloud using CAP, SAP Cloud SDK and SAP Fiori elements](https://blogs.sap.com/2020/12/20/part-2-how-to-build-an-extension-application-for-sap-s-4hana-cloud-using-cap-sap-cloud-sdk-and-sap-fiori-elements/)
CAPの場合、ODataとして公開されるのでUI5からの利用も簡単です。Fiori elementsやSmart Controlを使いたい場合はこちらの方法となるでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/f98cceff-ff98-62ce-54d8-330b8e13b417.png)

##SAP Cloud SDK for Java Scriptのプロジェクト構成
SAP Cloud SDK for Java Scriptは、[NestJS](https://docs.nestjs.com/)をベースとしたプロジェクト構成になっています。以下の枠で囲った部分がNestJSで生成される部分、それ以外がSAP Cloud SDK独自の部分です。
独自の部分としてはCloud Foundryにデプロイするための設定やCI/CDのための設定などがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/6129203d-0c7a-2054-b6df-ea6ead3a8932.png)

サービスの実装はsrcフォルダの中で行います。NestJSのフレームワークに従い、[Module](https://docs.nestjs.com/modules)、 [Controller](https://docs.nestjs.com/controllers)、[Service](https://docs.nestjs.com/providers#services)の3つのファイルを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/9b3d7589-b6ba-52b6-c2fd-4e0e0e90ca92.png)
Module、Controller、Serviceの関係は以下のようになっています。リクエストに対するルーティングを行うControllerと、Controllerから呼ばれるService、それらを束ねるModuleが1セットになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/c70fc737-c1c2-234e-b5a9-0e341b9d24b8.png)

`app`始まりのデフォルトで作られるファイルは基本的に触らず、以下のように目的ごとにModuleを作ってそれを`app.module.ts`に追加していく形になります。なお、`spec.ts`とつくファイルはテストで使用するものです。
サービスの開発手順については次回説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/3f85995c-6964-f3fe-bb9e-65d316cafb2d.png)

##プロジェクトの生成方法
現状、SAP Cloud SDKのプロジェクトの生成は[SAP Cloud SDK CLI](https://www.npmjs.com/package/@sap-cloud-sdk/cli)を使用して行います。
「現状」というのは、実はCLIは[deprecateされた](https://sap.github.io/cloud-sdk/docs/js/features/cli/overview)となっており、別の手段が今後提供されるものと思われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/aab679d2-ac98-3339-40c8-798c7f3dd21d.png)
ドキュメントを見ても代替手段についてはまだ記載がないので、この記事ではCLIを使います。

CLIのインストール

```
npm install -g @sap-cloud-sdk/cli
```

プロジェクトの生成

```
sap-cloud-sdk init
```

##リファレンス

- [ドキュメント](https://sap.github.io/cloud-sdk/docs/overview/overview-cloud-sdk)
- [APIリファレンス](https://sap.github.io/cloud-sdk/docs/js/api)
- [ブログ](https://blogs.sap.com/tags/73555000100800000895/)