Skip to Content
Technical Articles
Author's profile photo Ryo Asai

SAP Cloud Application Programming Model(CAP):概要およびデモ – Part 1

はじめに

本ブログではSAP Cloud Application Programming Modelの概要および10分ほどで実施可能な簡単な小さいデモを紹介します。この小さなデモは後続のブログでカスタムロジックを実装します。目次は次の通りです。

  1. イントロダクション
  2. CAPにおける開発対象
  3. CAPの開発手法
  4. デモ
“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レイヤ
    • UI5をスクラッチで記述
  • 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アカウントセットアップ手順

  1. 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のセットアップ

前提条件

  1. v14以上のnpmがインストールされていること

セットアップ手順

  1. (OSにWindowsを使用している場合のみ)SQLiteをインストール

ローカル環境でのテスト実行時に使用するSQLiteを用意します。このときSQLiteは永続化されないインメモリデータベースとして扱われます。

  1. npmを使える端末上で”npm install -g @sap/cds-dk”を実行

npmを用いてローカル環境にCAPの開発ツールをインストールします。

  1. 同端末上で”cds -v”を実行し、バージョン情報が標準出力に出力されることを確認

CAPプロジェクトを操作するツールのバージョンを確認し、そのツールが設定された環境であることを確認します。”command not found“などが表示される場合は”2. “のステップのインストールが失敗している可能性があります。このツール”@sap/cds-dk”のヘルプは”cds”の実行で確認できます。

  1. VSCodeをインストール

VSCodeをインストールします。

  1. サイドバーの”Extension(拡張機能)”を押下

“ctrl + shift + x”のショートカットも利用可能です。

  1. SAP CDS Language Support“をインストール

このステップは必須ではありません。このエクステンションはCAPにおけるドメイン定義の際に利用する言語のシンタックスやコード補完をSAP Business Application Studioのようにサポートします。

  1. VSCode上の端末でも“cds -v”を実行してバージョン確認

4.2 CAPプロジェクト生成

  1. ターミナルを起動します。

メニューバーの”Terminal > New Terminal”を押下します。

  1. プロジェクトを生成します。

cds init simpledemo“を入力して実行します。”cds init [<プロジェクト名>]”を実行することでcds-dkは新規プロジェクトを生成します。この実行ではNode.jsのカスタムハンドラが利用可能なプロジェクトの構造が出力されます。

カスタムハンドラをJavaで利用したい場合は”cds init –help”を実行してください。また、プロジェクト生成時にCAPのサンプル実装も生成したい場合には”cds init –add samples(addの前のハイフンの数はふたつ) ”を実行してください。簡単なドメイン定義およびオプションにて選択した言語のカスタムハンドラが生成されます。

このプロジェクト生成コマンド”cds init”の詳細は”cds init –help”で確認できます。本ブログの補足に簡易的な邦訳を記載します。

  1. テスト実行
cds watch

“https://localhost:PORT”にサービスが公開されます。このURLにアクセスすることで公開したサービスのナビゲーションが用意されたページにアクセスすることができます。現在はまだ公開可能なサービスを用意していないため、アクセス可能なサービスは表示されていません。

”cds watch”は読み込んでいるCAPのファイルが書き換わるごとにサービスを公開しなおします。したがって常に最新のサービスを書きながらその場でテストすることができます。

cds watch“の代わりに”cds run”を使用することもできます。

4.3 サービス定義

サービスを定義し、テスト実行します。

  1. ファイル作成

srvディレクトリ配下に”cat-service.cds”を作成します。

  1. サービス定義の記述

作成した”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

  1. テスト実行

記述して保存すると、すぐに下記のような文字列が”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サービスを生成します。

  1. ファイル作成

dbディレクトリにschema.cdsを作成します。

  1. 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

  1. サービス定義の書き換え

記述した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

  1. 初期データの投入

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、サービスおよび投入した初期データを確認します。

  1. ローカル実行

もし”cds watch”を止めている場合は再度このコマンドを用いてローカル実行します。

  1. Read機能のテスト

http://localhost:4004/cat-service/Authorsにアクセスします。これは定義したCatalogServiceのAuthorsに対するfilter条件なしのREAD呼び出しです。

  1. その他CRUD機能のテスト

次のURLに配置したPostmanのコレクションを利用して、その他CRUD処理をテスト実行できます。

https://raw.githubusercontent.com/SAPDocuments/Tutorials/master/tutorials/cp-apm-nodejs-create-service/postman.json

 

おわりに

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”の代わりに使用可能です。

Assigned tags

      9 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Ming Liu
      Ming Liu
      ありがとうございます。
      
      1つ質問させていただきます。
      
      SAP Cloud Application Programming ModelでAPIを呼び出して、S4 hanaの標準テーブルへアクセスできますでしょうか?
      APIを呼び出す方法をご存じであればご教授ください。
      Author's profile photo Ryo Asai
      Ryo Asai
      Blog Post Author

      はい、S/4HANAから公開するODataサービスを用いてテーブルへアクセス可能です。

      大まかには以下の手順でアクセス可能なCAPアプリケーションを実装していただけます。

      1. CAPアプリケーションよりS/4HANAへアクセスするための経路を確保
      2. アクセスしたいテーブルのODataサービスのedmxを取得
      3. edmxを”cds import”でCAPアプリケーションのプロジェクトにインポート
      4. インポートしたODataサービスを公開するサービスのエンティティとして定義
      5. 【Optional】インポートしたODataサービスのビジネスロジックを定義
      6. package.jsonにインポートしたODataサービスへの接続情報を記述

       

      詳細はopenSAPのコース“Building Applications with SAP Cloud Application Programming Model”のWeek 4 - Unit 2 “Connecting to Remote Services”をご参照ください。このopenSAPの映像内で触れられている実装のサンプルはGitHub上に公開されています。こちらも合わせてご参照ください。

       

      Author's profile photo Ming Liu
      Ming Liu

      詳しくご教授いただきありがとうございます。

      助かりました、

      試してみます。

      よろしくお願いいたします。

      Author's profile photo Ming Liu
      Ming Liu

      Asaiさん

      お世話になっております。

      上記のご教授いただいた通りに実装してテストを実施させていただきましたが、

      結局S4 hana のデータをうまく取れませんでした、下記のようなエラーが発生しました、

      ご存じであればお教えていただけますでしょうか?

      ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
      This XML file does not appear to have any style information associated with it. The document tree is shown below.
      <error xmlns="http://docs.oasis-open.org/odata/ns/metadata">
      <code>502</code>
      <message>Error during request to remote service: Request failed with status code 403</message>
      </error>
      ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
      下記はPACKAGE.JSONの内容です
      ------------------------------------------------------------------------------------------------------------------------------------
      {
        "name": "apitest1",
        "version": "1.0.0",
        "description": "A simple CAP project.",
        "repository": "<Add your repository here>",
        "license": "UNLICENSED",
        "private": true,
        "dependencies": {
          "@sap/cds": "^4",
          "@sap/cds-dk": "^4.0.3",
          "express": "^4"
        },
        "devDependencies": {
          "sqlite3": "5.0.0"
        },
        "scripts": {
          "start": "cds run"
        },
        "cds": {
          "requires": {
            "API_BUSINESS_PARTNER": {
              "kind": "odata",
              "model": "srv/external/API_BUSINESS_PARTNER",
              "credentials": {
                "destination": "je9_clnt272"
              }
            },
            "db": {
              "kind": "sqlite",
              "model": "*",
              "credentials": {
                "database": "my.db"
              }
            }
          }
        }
      }
      ---------------------------------------------------------------------------------------------------------------------
      Author's profile photo Ryo Asai
      Ryo Asai
      Blog Post Author

      これは何を実行されたときに発生したエラーでしょうか?

      ”Request failed with status code 403”が出力されているので、S/4HANAに対する接続の設定に誤りがありそうです。

      Author's profile photo Ming Liu
      Ming Liu

      ご回答ありがとうございます。

      下記のようにCDS RUNの場合このエラーが発生しました

       

      Author's profile photo Daiki Anraku
      Daiki Anraku

      BTPで手順を踏み、4のRead機能のテストのため、http://localhost:4004/cat-service/Authors にアクセスしたのですが、下図のようなエラーとなりました。

      対策方法とうはご存じでしょうか?

      ご教授ください。

      %u30B9%u30AF%u30EA%u30FC%u30F3%u30B7%u30E7%u30C3%u30C8

      スクリーンショット

      Author's profile photo Bodhisattwa Pal
      Bodhisattwa Pal

      Hello Ryo Asai

      I am absolutely new to the concept of BTP .

      Your article has been really helpful to get started .

      One thing though in command line when we say "npm install" , we mean Node Packet Manager

      When we say "cf push"  we ,mean cloud foundry .

       

      When we say "cds init firstprojects" ....

      what does  "cds" stand over here , does it mean CDS view model .

       

      I am pretty new to the whole concept , so my understanding might be wrong .

       

      Also Daiki Anraku  Ming Liu It would be really helpful if you can  answer to the question .Your inputs are highly appreciated 

      🙂

      Thanks in advance

      Author's profile photo Ryo Asai
      Ryo Asai
      Blog Post Author

      Hi Bodhisattwa Pal

      Welcome to BTP world!

       

      > When we say "cf push"  we ,mean cloud foundry .

      You can deploy your cap app with "cf push" after building the app with "cds build".

      > When we say "cds init firstprojects" ....

      "cds init" is a first action to start cap development.

      > what does  "cds" stand over here , does it mean CDS view model .

      In this context, "cds" is a command line client "@sap/cds-dk". This is not cds model.

       

      You can use this tutorial to learn cap development flow if you are a newbie regarding cap and btp!

      Best,

      Ryo