そこに仁義はあるのか(仮)

略してそこ仁!

Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - アプリケーション編

Oracle Code Tokyoでハンズオンのお手伝いをしてきました!
ハンズオンは、Rails / laravel / Django / Spring Bootの4つのフレームワークを利用して、Oracle CloudのAutonomous Transaction Processingサービス(Oracle 18c)へ接続するサンプルアプリと、その手順を作っています。
私はSpring Boot(JPAを利用)のサンプルアプリとハンズオン手順、また、それに合わせてアプリの検証環境構築用のTerraformも作りました。

ハンズオンの手順やアプリはこちらのGitHubリポジトリに置いています。
ハンズオン手順と内容がかぶるところも多いのですが、この機会に、環境の作り方やデータベース接続方法などを整理したいと思います。

github.com

今回は、いよいよ完結編。アプリケーション作成のポイントを書いていこうと思います。
構成や環境構築編の内容についてはこちら
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - 環境構築編 - そこに仁義はあるのか(仮)
アプリケーションの設定についてはこちら
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - アプリケーション環境編 - そこに仁義はあるのか(仮)


f:id:syobochim:20190520002319p:plain

👌 アプリで使っているもの

記載レベルがバラバラですが、特筆すると以下のものを使っています。

  • JDK 11
  • Maven
  • Spring Boot
  • JPA

👌 pom.xml

Oracleのリポジトリからライブラリを取得します。
リポジトリを利用する際のmavenの認証設定についてはアプリケーション設定編で説明しています。
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - アプリケーション環境編 - そこに仁義はあるのか(仮)

pomでは、リポジトリの追加と必要なライブラリの設定をしています。
ポイントになる箇所にコメントを記載しています。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>demo</name>
  <description>Demo project for Spring Boot</description>

  <properties>
    <java.version>11</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <!-- Thinドライバで基本機能をサポートするためのすべてのクラス-->
    <dependency>
      <groupId>com.oracle.jdbc</groupId>
      <artifactId>ojdbc8</artifactId>
      <version>18.3.0.0</version>
    </dependency>
    <!-- 接続プール機能を備えるUniversal Connection Pool(UCP)-->
    <dependency>
      <groupId>com.oracle.jdbc</groupId>
      <artifactId>ucp</artifactId>
      <version>18.3.0.0</version>
    </dependency>
    <!-- Java からOracleウォレットにアクセスする-->
    <dependency>
      <groupId>com.oracle.jdbc</groupId>
      <artifactId>oraclepki</artifactId>
      <version>18.3.0.0</version>
    </dependency>
    <dependency>
      <groupId>com.oracle.jdbc</groupId>
      <artifactId>osdt_core</artifactId>
      <version>18.3.0.0</version>
    </dependency>
    <dependency>
      <groupId>com.oracle.jdbc</groupId>
      <artifactId>osdt_cert</artifactId>
      <version>18.3.0.0</version>
    </dependency>

  </dependencies>

  <!-- Oracleリポジトリの設定-->
  <repositories>
    <repository>
      <id>maven.oracle.com</id>
      <name>oracle-maven-repo</name>
      <url>https://maven.oracle.com</url>
      <layout>default</layout>
      <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </releases>
    </repository>
  </repositories>
  <pluginRepositories>
    <pluginRepository>
      <id>maven.oracle.com</id>
      <name>oracle-maven-repo</name>
      <url>https://maven.oracle.com</url>
      <layout>default</layout>
      <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </releases>
    </pluginRepository>
  </pluginRepositories>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

</project>

👌 データベース接続設定を追加

「application.properties」ファイルにデータベース接続設定を定義します。(おまけで、ポート番号も80番にしています。)

Autonomous Databaseの作成の際にクラウドの管理画面にて設定したパスワードは「ADMIN」ユーザーに適用されます。
ハンズオンなどのサンプルアプリでは「ADMIN」ユーザーを利用しても良いですし、他にユーザーを作成していればそのユーザー名とパスワードを設定します。
データベースの接続名はこちらの手順でWalletファイルを取得した際に確認できる文字列です。
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - 環境構築編 - そこに仁義はあるのか(仮)

spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.url=jdbc:oracle:thin:@[データベース接続名]_TP
spring.datasource.username=[データベース接続ユーザー名]
spring.datasource.password=[データベース接続ユーザーのパスワード]

server.port=80


接続名の後ろの「TP」についてはこちらにガイドがあります。
事前定義されたAutonomous Transaction Processingのデータベース・サービス名
Autonomous Data Warehouseの場合はこちらです。
Autonomous Data Warehouseの事前定義されたデータベース・サービス名

👌 シーケンスの設定

EntityクラスのID採番の設定をします。
事前にシーケンスを作成しておいてください。
シーケンスの作成方法についてはこちらのブログの「テーブルの作成」に記載しました。
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - アプリケーション環境編 - そこに仁義はあるのか(仮)

Entityクラスをこちらに転記します。
ポイントはGeneratedValueとSequenceGeneratorの設定です。
作成したシーケンスを使って採番するよう設定しました。

package com.example.demo.domain;

import javax.persistence.*;

@Entity
@Table(name = "Microposts")
public class Micropost {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MICRO_SEQ")
    @SequenceGenerator(sequenceName = "micropost_seq", allocationSize = 1, name = "MICRO_SEQ")
    private Long id;
    private String content;

    public Micropost() {
    }

    public Micropost(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}


以上で、3回に分けて記載したAutonomous DatabaseとSpring Bootを接続する手順は完了です!
お疲れ様でした!

構成や環境構築編の内容についてはこちら
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - 環境構築編 - そこに仁義はあるのか(仮)
アプリケーションの設定についてはこちら
Spring BootのアプリとOracle CloudのAutonomous Databaseを接続する - アプリケーション環境編 - そこに仁義はあるのか(仮)