LoginSignup
4
1

More than 1 year has passed since last update.

【SAP BTP】CAPのAPI(Java)をPostgreSQLで使ってみる

Last updated at Posted at 2022-06-01

はじめに

CAP(SAP Cloud Application Programming Model)を利用してHANA DBと連携するODataAPIを作成しました。(Java)
HANA DBはTrial環境だと気軽に利用できますが、購入して利用する場合はお高いこともあります。
HANA DBほどのスペックが必要とされない場合、BTP環境のなかでほかの選択肢としてはPostgreSQLがあります。
ということでJavaで作ったCAP APIをPostgreSQLでも使えるようにする方法を試してみました。

前提

CAP Service SDK for Javaで作成したOData APIがあることを前提としています。
【参考】
【SAP BTP】CAP Service SDK for JavaでOData APIを作ってみる(2)

PostgreSQLのインスタンスを作る

まずはTrial環境でPostgreSQLのインスタンスを立てます。
Service MarketplaceからPostgreSQLのサービスを選択して「Create」を押下します。
image.png

instance Nameに任意の名称を入力し、インスタンスを作成します。
今回は「demoPostgreSQL」としました。
それ以外の値は初期値のままです。
image.png

サービスインスタンスが起動したらInstances and Subscriptionsから確認できます。
image.png

PostgreSQLインスタンスからBTPへデプロイ済みのJavaアプリケーション(capCustom_api)とのService Bindingを作成します。
image.png

image.png

Bindingが作成されるとDBのCredentialsが確認できます。
image.png

PostgreSQLへアクセスする

PostgreSQLへアクセスする方法はよくわからないので
(VSCodeの拡張機能などからそのままアクセスできると思っていたらそうでもなかったみたいです。)
公式ドキュメントの記載に基づいて進めていきます。

ローカルからコマンドラインで接続していきます。(記事の環境はwslのUbuntuです。)
cf cliで環境へログインし、まずはスペースがSSHアクセスを許容していることを確認します。

$ cf login
$ cf allow-space-ssh dev

image.png

デプロイ済みのJavaアプリケーション(capCustom_api)に対してSSH接続を有効にします。
(有効化したら一度Restartしたほうがいいみたいです。)

$ cf enable-ssh capCustom_api

image.png

Javaアプリケーション(capCustom_api)をSSH接続のトンネルにしてポートフォワードするみたいなので、空いているローカルのポート(63306)を使ってSSH接続をします。
(PostgreSQLのホスト、ポートはService Binding作ったときに確認できるCredentialsの内容から設定します。)

$ cf ssh -L 63306:<PostgreSQLのホスト>:<PostgreSQLのポート> capCustom_api

こんな感じでつながります。
image.png

ポートフォワードできたので、localhost:63306にアクセスすればPostgreSQLにつながるはずなので、
VSCodeに拡張機能「PostgreSQL」を入れて接続してみます。
image.png

接続設定は以下の通りです。

項目
DBのHOST localhost
DBのUser ※Credentialsに記載
パスワード ※Credentialsに記載
DBのPort 63306(cf sshの指定値)

接続できるようになりました。
image.png

テーブルとテストデータを作成します。

CREATE TABLE demo_Users (
  ID INTEGER NOT NULL,
  FirstName VARCHAR(100),
  LastName VARCHAR(100),
  Age INTEGER,
  createdAt TIMESTAMP,
  createdBy VARCHAR(255),
  modifiedAt TIMESTAMP,
  modifiedBy VARCHAR(255),
  PRIMARY KEY(ID)
);

CREATE VIEW UserService_Users AS SELECT
  Users_0.createdAt,
  Users_0.createdBy,
  Users_0.modifiedAt,
  Users_0.modifiedBy,
  Users_0.ID,
  Users_0.FirstName,
  Users_0.LastName,
  Users_0.Age
FROM demo_Users AS Users_0;

INSERT INTO demo_Users VALUES(
	1/*ID <INTEGER>*/,
	'Postgre'/*FIRSTNAME <NVARCHAR(100)>*/,
	'太郎'/*LASTNAME <NVARCHAR(100)>*/,
	49/*AGE <INTEGER>*/,
	DEFAULT/*CREATEDAT <TIMESTAMP>*/,
	'PostgreSQL DB'/*CREATEDBY <NVARCHAR(255)>*/,
	DEFAULT/*MODIFIEDAT <TIMESTAMP>*/,
	'PostgreSQL DB'/*MODIFIEDBY <NVARCHAR(255)>*/
);
INSERT INTO demo_Users VALUES(
	2/*ID <INTEGER>*/,
	'Postgre'/*FIRSTNAME <NVARCHAR(100)>*/,
	'次郎'/*LASTNAME <NVARCHAR(100)>*/,
	120/*AGE <INTEGER>*/,
	DEFAULT/*CREATEDAT <TIMESTAMP>*/,
	'PostgreSQL DB'/*CREATEDBY <NVARCHAR(255)>*/,
	DEFAULT/*MODIFIEDAT <TIMESTAMP>*/,
	'PostgreSQL DB'/*MODIFIEDBY <NVARCHAR(255)>*/
);

image.png

上記でDB側の準備ができました。

CAP APIの接続先DBを変更する

今のままではCAP APIをデプロイするたびにService Bindingを変える必要があるので、
MTAのmta.yamlを編集してアプリケーションの接続先を変更します。

resourcesに記載していたHANA DBの代わりにPostgreSQLサービスを追加して、Javaモジュールのrequiresに記載します。

mta.yaml
_schema-version: "3.2"
ID: mtademo
version: 0.0.1
modules:

  # customserviceのJavaModule
  - name: capCustom_api
    type: java
    path: customservice
    parameters:
      buildpack: java_buildpack
    properties:
      SPRING_PROFILES_ACTIVE: cloud
    build-parameters:
      builder: custom
      commands: [ mvn clean package ]
      build-result: "srv/target/*-exec.[wj]ar"
    provides:
      - name: capCustom-api # required by consumers of CAP services (e.g. approuter)
        properties:
          srv-url: ${default-url}
    # resources -> usePostgresqlの定義を使う
    requires:
     - name: usePostgresql
       properties:
          JBP_CONFIG_RESOURCE_CONFIGURATION: '[tomcat/webapps/ROOT/META-INF/context.xml:
             {"service_name_for_DefaultDB" : "~{hdi-container-name}"}]'
resources:
  # 作成済みのHANA DBサービスをresourcesに記載
  # - name: useDemoShared
  #   parameters:
  #     service-name: demoShared
  #     service: hanatrial
  #     service-plan: securestore
  #     config:
  #       schema: sampleSchema
  #   properties:
  #     hdi-container-name: '${service-name}'
  #   type: org.cloudfoundry.existing-service
  # 作成済みのPostgreSQLサービスをresourcesに記載
  - name: usePostgresql
    parameters:
      service-name: demoPostgreSQL
      service: postgresql-db
      service-plan: trial
    properties:
      hdi-container-name: '${service-name}'
    type: org.cloudfoundry.existing-service  

BTP環境へデプロイ

mta.yamlを修正したらBuild→Deployを実行します。

$ mbt build
$ cf deploy mta_archives/mtademo_0.0.1.mtar

Javaアプリケーションが起動したらUsersエンティティ(/odata/v4/UserService/Users)にアクセスしてみます。
PostgreSQLに登録したデータが参照できていることが確認できました!
image.png

ついでにデータ登録のPOSTリクエストを試してみます。
image.png

「KYOSO花子」がPostgreSQLに登録されていることが確認できました。

image.png

メモ
MTAをDeployしてService Bindingを作り直すとDBのユーザー/パスワードが変更していました。
再度Credentialsを確認する必要があります。

おわりに

Javaで作ったCAP APIをPostgreSQLにつなぐことに成功しました。
システムによってはHANAではなくPostgreSQLを利用する場合もあると思うので、どちらでも利用できる方法があれば便利です。
ただし、CAPでPostgreSQLを使う場合には制約事項もあるのであらかじめ確認が必要と思いました。
Database Support in Java

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1