はじめに
本ブログではSAP Cloud Application Programming Modelの概要および10分ほどで実施可能な簡単な小さいデモを紹介します。この小さなデモは後続のブログでカスタムロジックを実装します。目次は次の通りです。
- イントロダクション
- CAPにおける開発対象
- CAPの開発手法
- デモ
“4. デモ”で紹介するデモにカスタムロジックを追加するPart. 2はこちらです。
1. イントロダクション
“SAP Cloud Application Programming Model(CAP)”はクラウドネイティブでenterprise-gradeのサービスおよびアプリケーションを開発するための言語、ライブラリおよびツール群です。CAPはopenでopinionatedな特徴を持ち、煩雑な繰り返し実装を削減するためのbest practicesを開発者に提供します。また、速いスピードで変わっていくクラウドテクノロジーの分野においてCAPはドメイン駆動の設計を可能にし、高速で安全な開発をもたらします。
openとopinionated
CAPはフレームワークと組み合わせるテクノロジーを選択可能なopenさを持ち、多彩なアーキテクチャパターンを実現可能です。その一方でCAPは各テクノロジーを選択した場合のlow levelなコーディングを負担するopinionatedな一面も持ちます。これにより開発者はテクノロジーの組み合わせを選択しながらもその特有の実装から解放され、ビジネスロジックに注力した開発が可能になります。
best practice
CAPはそのドキュメント
capireにて開発における多くのbest practiceを提示しています。このbest practiceは実装すべきおよび避けるべきスタイルを示したDoおよびDon'tなどをそれぞれ項目ごとに記しています。
CAPを利用するうれしさ
CAPを利用することで、開発者は選んだプロトコルに対してagnosticでありながらlow-codeな実装をCAPに任せることができます。たとえばCAPは以下のような典型的な構成要素のサービスをSAP Business Technology Platform上に構築する場合の問題を解決します。
- UIレイヤ :UI5のアプリケーション
- Applicationレイヤ:MTAとして用意したJavaアプリケーション(Olingoサーバーを利用)
- DBレイヤ :HANA Cloud
// UI5のアプリケーションとJavaアプリケーションの間を結ぶプロトコルはODataとします。
上記のようなサービスを構築する場合、CAPなしでは以下のような問題点に直面しえます。
- UIレイヤ
- Applicationレイヤ
- ODataを公開するプログラムは一般に複雑
- MTAをSAP Business Technology Platform上にデプロイすると動作確認までに時間がかかる
- DBレイヤ
- エンティティは基本的に特定のRDBMSを具現化したものであるため、Reusableなサービスの作成は困難
このそれぞれの問題に対して、CAPを用いることで開発者は次のように対応できます。
- UIレイヤ
UI5はスクラッチで記述する必要があります
-> マークアップのみでUIを生成することも可能
- Applicationレイヤ
ODataを公開するプログラムは一般に複雑
-> プロトコルとしてのODataのハンドリングをCAPが負担、開発者はOData特有のロジックを避けてビジネスロジックを実装
MTAをSAP Business Technology Platform上にデプロイすると動作確認までに時間がかかる
-> CAPの開発ツールを用いて外部接続しながらローカル実行ですぐに動作確認
- DBレイヤ
エンティティは基本的に特定のRDBMSを具現化したものであるため、Reusableなサービスの作成は困難
-> 各DB特有の実装をCAPが負担、開発者はCDSで共通のドメインをモデリングしてコンフィグレーションによって複数のDBに対応
2. CAPにおける開発対象
CAPではドメインモデル、サービスモデルおよびUIマークアップをCDSで記述することでデータベース、サービスおよびODataとしてサービス公開した場合のUIアノテーションを自動で生成します。このときデータベースやサービスとして公開するプロトコルの種類などは設定ファイルを用いて指定します。

自動で生成されたサービスはデフォルトでCRUD処理に対応しています。また、この自動で生成されたCRUD処理のサービスに対してNode.jsもしくはJavaを用いた拡張開発も可能です。Node.jsやJavaのどちらの拡張開発の場合でもCAPが用意したSQLライクな記述に対応したAPIを用いて簡便にCRUD処理を拡張可能です。
3. CAPの開発手法
cds-dkを用いてプロジェクト生成、プロジェクトの設定およびローカルテストなどを実行します。
プロジェクト生成
cds-dkをインストールした環境のTerminal上で次のコマンドを実行することでプロジェクトを生成できます。
cds init [<project>]
外部モデルのインポート
外部モデルのedmxを取り込み、プロジェクトのドメインもしくはサービスのモデルとして定義できます。
cds import <source>
ローカルテスト
次のコマンドを実行することでローカルテストを実施できます。また、このローカルテストでマークアップしたUI関連のアノテーションの結果も確認できます。
cds watch
ローカルテストとして立ち上げたCAPのサービスは直接アクセスするだけでなく、SAP Business Application StudioなどのIDEに組み込まれているHTTP REST Clientなどを用いても実装された機能を確認できます。テスト駆動開発に対応するテスト実装も可能です。
cds-dkの設定
cds-dkが利用する環境情報を確認および設定します。
cds env
4. デモ
4.1 環境セットアップ
次のいずれかの環境を用意します。
- A: SAP Business Application Studio(推奨)
- B: VSCode
どちらの環境もCAPアプリケーションの開発に利用可能です。SAP Business Application Studioの場合は特定の設定で立ち上げることで自動で開発に必要なすべての環境がセットアップされます。同様の機能をVSCodeを用いて再現することも可能です。この方法は4.1-Bで紹介しています。
4.1-A SAP Business Application Studioのセットアップ
前提条件
・SAP Business Technology Platformのtrialアカウントもしくはproductionアカウントを持っていること
trialアカウントセットアップ手順
- trialアカウントにログイン

2. SAP Business Application Studioにアクセス

Dev Spaceの管理画面へアクセスします。
3. Createを押下

4. 任意の名前をつけてCreateを押下

CAPを作成するための設定が注入されたDev Spaceを作成します。
5. 作成したDev Spaceにアクセス

6. メニューよりTerminal > New Terminalを押下

CAPプロジェクトを作成するために使用するターミナルを起動します。“
`(バッククォート) +
ctrl”の組み合わせのショートカットでも起動できます。
7. ”cds -v”を入力し、リターンキー(エンターキー)を押下

CAPプロジェクトを操作するツールのバージョンを確認し、そのツールが設定された環境であることを確認します。"
bash: cds: command not found"などが表示される場合は"6. "のステップで異なるシナリオを指定していないか確認してください。
Dev Spaceの起動するタイミングによってこのツールのバージョンは上記画像と異なる可能性があります。異なるバージョンであっても本記事で紹介するデモは実施可能です。このツール"@sap/cds-dk"のヘルプは"
cds --help(以降、本ブログにおけるcdsコマンドのhelpの前にあるハイフンの数はすべてふたつ)"の実行で確認できます。
4.1-B VSCodeのセットアップ
前提条件
- v14以上のnpmがインストールされていること
セットアップ手順
- (OSにWindowsを使用している場合のみ)SQLiteをインストール
ローカル環境でのテスト実行時に使用する
SQLiteを用意します。このときSQLiteは永続化されないインメモリデータベースとして扱われます。
- npmを使える端末上で”npm install -g @Sisn/cds-dk”を実行
npmを用いてローカル環境にCAPの開発ツールをインストールします。
- 同端末上で"cds -v"を実行し、バージョン情報が標準出力に出力されることを確認
CAPプロジェクトを操作するツールのバージョンを確認し、そのツールが設定された環境であることを確認します。"
command not found"などが表示される場合は"2. "のステップのインストールが失敗している可能性があります。このツール"@sap/cds-dk"のヘルプは"cds"の実行で確認できます。
- VSCodeをインストール
VSCodeをインストールします。
- サイドバーの"Extension(拡張機能)"を押下
"ctrl + shift + x"のショートカットも利用可能です。
- "SAP CDS Language Support"をインストール
このステップは必須ではありません。このエクステンションはCAPにおけるドメイン定義の際に利用する言語のシンタックスやコード補完をSAP Business Application Studioのようにサポートします。
- VSCode上の端末でも“cds -v”を実行してバージョン確認
4.2 CAPプロジェクト生成
- ターミナルを起動します。

メニューバーの"Terminal > New Terminal"を押下します。
- プロジェクトを生成します。

"
cds init simpledemo"を入力して実行します。"cds init [<プロジェクト名>]"を実行することでcds-dkは新規プロジェクトを生成します。この実行ではNode.jsのカスタムハンドラが利用可能なプロジェクトの構造が出力されます。
カスタムハンドラをJavaで利用したい場合は”
cds init --help”を実行してください。また、プロジェクト生成時にCAPのサンプル実装も生成したい場合には”
cds init --add samples(addの前のハイフンの数はふたつ) ”を実行してください。簡単なドメイン定義およびオプションにて選択した言語のカスタムハンドラが生成されます。
このプロジェクト生成コマンド"cds init"の詳細は”cds init --help”で確認できます。本ブログの補足に簡易的な邦訳を記載します。
- テスト実行
cds watch
“
https://localhost:PORT”にサービスが公開されます。このURLにアクセスすることで公開したサービスのナビゲーションが用意されたページにアクセスすることができます。現在はまだ公開可能なサービスを用意していないため、アクセス可能なサービスは表示されていません。
”cds watch”は読み込んでいるCAPのファイルが書き換わるごとにサービスを公開しなおします。したがって常に最新のサービスを書きながらその場でテストすることができます。
"
cds watch"の代わりに”
cds run”を使用することもできます。
4.3 サービス定義
サービスを定義し、テスト実行します。
- ファイル作成
srvディレクトリ配下に"cat-service.cds"を作成します。
- サービス定義の記述
作成した”cat-service.cds”に以下の内容を記述します。SAP Business Application Studioを利用している場合、1行目にあるmanagedをCtrlを押下しながらクリックすることでその実装を確認することもできます。
using { Country, managed } from '@sap/cds/common';
service CatalogService {
entity Books {
key ID : Integer;
title : localized String;
author : Association to Authors;
stock : Integer;
}
entity Authors {
key ID : Integer;
name : String;
books : Association to many Books on books.author = $self;
}
entity Orders : managed {
key ID : UUID;
book : Association to Books;
country : Country;
amount : Integer;
}
}
srv/cat-service.cds
- テスト実行
記述して保存すると、すぐに下記のような文字列が”cds watch”を実行した端末上に表示されます。
[cds] - model loaded from 2 file(s):
srv/cat-service.cds
node_modules/@sap/cds/common.cds
[cds] - using bindings from: { registry: '~/.cds-services.json' }
[cds] - connect to db > sqlite { database: ':memory:' }
/> successfully deployed to sqlite in-memory db
[cds] - serving CatalogService { at: '/catalog' }
[cds] - launched in: 1557.190ms
[cds] - server listening on { url: 'http://localhost:4004' }
[ terminate with ^C ]
これらの表示はそれぞれ次のような意味を表しています。
[cds] - model loaded from 2 file(s):
srv/cat-service.cds
node_modules/@sap/cds/common.cds
サービスを定義したcat-service.cdsおよびそのサービス定義内で利用している@sap/cds/commonを定義しているcommon.cdsを読みこみます。
[cds] - using bindings from: { registry: '~/.cds-services.json' }
[cds] - connect to db > sqlite { database: ':memory:' }
/> successfully deployed to sqlite in-memory db
sqliteをセットアップします。今はまだDBの定義はしていないので、この結果は確認できません。
[cds] - serving CatalogService { at: '/catalog' }
cat-service.cdsで定義したサービスの内容がbaseURL + /catalogに公開されることを示しています。“/catalog”はサービス定義に
pathアノテーションを付記することで異なる文字列に置換することもできます。
[cds] - launched in: 1557.190ms
サービス公開までにかかった時間が1557.90msであったことを示しています。
[cds] - server listening on { url: 'http://localhost:4004' }
公開されたサービスのbaseURLが
http://localhost:4004であることを示しています。
ODataサービスとしてのmetadataは以上の実装で利用可能です。しかしこのままではDBの定義がないため、”4.4 DB定義”でこのサービスの定義をDB定義として利用するドメインに定義しなおします。また、定義したドメインの射影をとってサービスを定義します。
4.4 DB定義
サービスとして記述したドメインモデルをDBに移します。移したあとにサービスモデルには定義したDBの射影をとります。最後にテスト実行します。このステップで実施するサービス定義およびDB定義を読み込んで、CAPが自動的にこれらに対応したCRUDサービスを生成します。
- ファイル作成
dbディレクトリにschema.cdsを作成します。
- DB定義の記述
作成したschema.cdsに以下の内容を記述します。namespaceをmy.bookshopにしています。
namespace my.bookshop;
using { Country, managed } from '@sap/cds/common';
entity Books {
key ID : Integer;
title : localized String;
author : Association to Authors;
stock : Integer;
}
entity Authors {
key ID : Integer;
name : String;
books : Association to many Books on books.author = $self;
}
entity Orders : managed {
key ID : UUID;
book : Association to Books;
country : Country;
amount : Integer;
}
db/schema.cds
- サービス定義の書き換え
記述したDBからサービスに射影をとります。DBの各エンティティを1つのサービスとしてまとめて公開します。
using my.bookshop as my from '../db/data-model';
service CatalogService {
entity Books @readonly as projection on my.Books;
entity Authors @readonly as projection on my.Authors;
entity Orders @insertonly as projection on my.Orders;
}
srv/cat-service.cds
- 初期データの投入
DBが利用する初期データを投入します。dbディレクトリ配下にcsvディレクトリを作成し、その中に配置されている次の3つの条件を満たすファイルを配置します。
- ”{namespace}-{エンティティ名}.csv”の名前が付けられている
- csvファイルの一行目はカラム名を表す
- csvファイルの二行目以降は各レコードを表す
次の2つのcsvファイルを作成します。
ID;name
101;Emily Brontë
107;Charlote Brontë
150;Edgar Allen Poe
170;Richard Carpenter
181;Takuye Umeda
191;Akihito Takasago
256;Ryo Asai
267;Nabaraj
268;Kana Fukuma
750;Hummus Motors
840;Sumikko Saizeriya
db/csv/my.bookshop-Authors.csv
ID;title;author_ID;stock
201;Wuthering Heights;101;12
207;Jane Eyre;107;11
251;The Raven;150;333
252;Eleonora;150;555
271;Catweazle;170;22
505;Medium;181;256
501;Kittler Introduction on Modern Computed Media;181;256
500;Zex Dynamics and famous intersections;191;235
512;How to eat Best Biryani with your cool implementation;256;16
612;New Nepali Panir;267;123
679;Hummus, Falafel, and Joaquin Phoenix;268;22
680;Korean Chinese cuisine in Japan;268;34
681;Hell's K localization;268;45
751;Social Game with motorcycle;750;125
859;Organize chill community;840;2
db/csv/my.bookshop-Books.csv
[cds] - using bindings from: { registry: '~/.cds-services.json' }
[cds] - connect to db > sqlite { database: ':memory:' }
> filling my.bookshop.Authors from db/csv/my.bookshop-Authors.csv
> filling my.bookshop.Books from db/csv/my.bookshop-Books.csv
/> successfully deployed to sqlite in-memory db
[cds] - serving CatalogService { at: '/catalog', impl: 'srv/cat-service.js' }
[cds] - launched in: 1009.187ms
[cds] - server listening on { url: 'http://localhost:4004' }
[ terminate with ^C ]
"cds watch"を起動している場合、上記のような出力が端末に得られます。
> filling my.bookshop.Authors from db/csv/my.bookshop-Authors.csv
> filling my.bookshop.Books from db/csv/my.bookshop-Books.csv
次の出力は用意した2つのcsvファイルが読み込まれたことを示しています。
4.5 テスト実行
テスト実行してDB、サービスおよび投入した初期データを確認します。
- ローカル実行
もし”cds watch"を止めている場合は再度このコマンドを用いてローカル実行します。
- Read機能のテスト
http://localhost:4004/cat-service/Authorsにアクセスします。これは定義したCatalogServiceのAuthorsに対するfilter条件なしのREAD呼び...
- その他CRUD機能のテスト
次のURLに配置したPostmanのコレクションを利用して、その他CRUD処理をテスト実行できます。
https://raw.githubusercontent.com/SAPDocuments/Tutorials/master/tutorials/cp-apm-nodejs-create-servi...
おわりに
Pt. 2では本ブログで実装したデモのロジックを拡張します。
補足:“cds init --help”の邦訳
この補足は以下のバージョンの“cds init --help”を邦訳したものです。
$ cds -v
@sap/cds: 4.3.0
@sap/cds-compiler: 1.46.6
@sap/cds-dk: 3.2.0
@sap/cds-foss: 2.2.0
@sap/cds-reflect: 2.13.4
@sap/cds-runtime: 2.7.8
Node.js: v10.23.0
home: /extbin/npm/globals/lib/node_modules/@sap/cds
概要
cds init [<project>] [<options>]
<project>で指定したディレクトリ配下に新規プロジェクトを生成する。
ディレクトリ指定がない場合はカレントディレクトリをデフォルトで利用する。
オプション
--add <feature | comma-separated list of features>
単数もしくは複数の機能をプロジェクト生成時に追加する。
追加する機能は<feature>として以下の値が利用できる。
nodejs - Node.jsベースのプロジェクトを生成する。“java”と同時に指定できない。
java - Javaベースのプロジェクトを生成する。“Node.js”と同時に指定できない。
この機能は“Java Maven archetype”を利用する。
hana - SAP HANAを利用するための設定を追加する。
mta - Multi Target Applicationの設定ファイル“mta.yaml”を追加する。
cf-manifest - Cloud Foundryネイティブなアプリのための設定ファイル“services-manifest.yml”を追加する。
この方法では、“cf install-pluginCreate-Service-Push”を使用して個別にインストールする
必要がある“Create-Service-Pushプラグイン”を利用します。“cf create-service-push”は
サービスを作成し、アプリケーションをSAP Business Technology Platformにプッシュします。
pipeline - CI/CDパイプラインのためのファイルを追加する。
samples - シンプルなサンプル実装を追加する。
--java:mvn <Comma separated maven archetype specific parameters>
アーキタイプのサポートしているパラメータを追加する。
https://jarcasting.com/archetypes/com.sap.cds/cds-services-archetype/1.10.0/
--force
指定したディレクトリ内ですべてのファイルを上書きする。
実行例
cds init test
cds init test --add java
cds init test --add java,hana
cds init --add mta
cds init --add cf-manifest
cds init --add java --java:mvn groupId=myGroup,artifactId=newId,package=my.company
補足
“cds add”は“cds init --add”の代わりに使用可能です。