バックエンドの確認

バックエンドを開発するためのプロジェクトを確認します。

バックエンド開発プロジェクトを確認する

backendディレクトリが、バックエンド開発プロジェクトになります。

このプロジェクトは、NablarchのRESTfulウェブサービス構成で作成されています。(参考:Nablarch - RESTfulウェブサービス

Nablarchが提供しているブランクプロジェクトから作成し、次の変更を加えています。(参考:Nablarch - ブランクプロジェクト

  • 使用するJavaのバージョンを11に変更
  • 開発環境で使用するアプリケーションサーバをJettyに変更
  • 起動テスト用のアクションクラスとテストクラスを追加
  • Bean ValidationのメッセージとしてHibernate Validationのメッセージを使用する設定
  • nablarch.webApi.applicationPathの環境依存値を/apiに設定
  • 使用しないファイルや定義を削除

ディレクトリ構造は、次のようになっています。

backend
├── .gitignore
├── pom.xml
├── docker
│   └── docker-compose.dev.yml
├── rest-api-specification
│   └── openapi.yaml
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           ├── SampleAction.java
    │   │           └── system
    │   │               └── nablarch
    │   │                   ├── FlywayExecutor.java
    │   │                   └── di
    │   │                       └── ExampleComponentDefinitionLoader.java
    │   ├── resources
    │   │   ├── app-log.properties
    │   │   ├── common.config
    │   │   ├── data-source.config
    │   │   ├── env.config
    │   │   ├── log.properties
    │   │   ├── rest-boot.xml
    │   │   ├── rest-component-configuration.xml
    │   │   ├── db
    │   │   │   └── migration
    │   │   │       └── V1__create_table.sql
    │   │   └── META-INF
    │   │       └── services
    │   │           └── nablarch.core.repository.di.config.externalize.ExternalizedComponentDefinitionLoader
    │   └── webapp
    │       └── WEB-INF
    │           └── web.xml
    └── test
        ├── java
        │   └── com
        │       └── example
        │           └── SampleTest.java
        └── resources
            ├── log.properties
            └── unit-test.xml

.gitignore

Gitで管理対象外とするファイルを定義するためのファイルです。

ブランクプロジェクト作成時に生成されたものを使用しています。

pom.xml

Mavenプロジェクトの定義ファイルです。

ブランクプロジェクト作成時に生成されたものをベースに使用しています。

docker/docker-compose.dev.yml

データベース(PostgreSQL)を起動するDocker Composeの定義ファイルです。

rest-api-specification/openapi.yaml

OpenAPI仕様でREST APIを定義したOpenAPIドキュメントです。

本ハンズオンで作成するREST APIについては、予め定義しています。

src/main/java/com/example/SampleAction.java

起動テスト用のREST APIを作成するためのアクションクラスです。(参考Nablarch - アプリケーションの責務配置

package com.example;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.Map;

@SystemRepositoryComponent
@Path("test")
public class SampleAction {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Object get() {
        return Map.of("status", "ok");
    }
}

Nablarchでは、ルーティングアダプタという機能で、リクエストをどのアクションクラスで処理するかを定義することができます。(参考:Nablarch - ルーティングアダプタ

JAX-RSのアノテーション(@PATH@GET等)を使用してルーティングを定義できますので、パスがapi/test、HTTPメソッドがGETに対応した起動テスト用のREST APIを実装しています。(参考:ウィキペディア - JAX-RS

クラスに付与しているSystemRepositoryComponentアノテーションは、Nablarchが提供しているDIコンテナの機能を持つシステムリポジトリに登録するための設定です。(参考:Nablarch - システムリポジトリ

ToDoアプリでDIコンテナの機能を使うため、アクションクラスをシステムリポジトリから取得するように予め設定しています。そのため、アクションクラスをシステムリポジトリに登録する必要があります。

DIコンテナで管理するコンポーネントは、通常はXMLファイルを使用して定義しますが、その他にもSystemRepositoryComponentアノテーションを付与する方法もあり、このアプリではこちらの方法を使用します。(アノテーションを付与したクラスのオブジェクトを構築する | Nablarch

"status"キーで"ok"文字列を格納するMapオブジェクトを返していますが、これは次のようなJSONに変換されます。

{ "status": "ok" }

src/main/java/com/example/system/nablarch/FlywayExecutor.java

バックエンドでは、マイグレーションツールであるFlywayを使用して、データベース上のテーブルやテストデータを登録するようにします。

Flywayを使用するための準備については、予め設定しています。(Maven Plugin | Flyway

Flywayの実行については、Nablarchの初期化処理を利用して、バックエンドアプリを起動したタイミングで行うように予め設定しています。(参考:Nablarch - オブジェクトの初期化処理を行う

example-chatのバックエンドでも同様の実装をしているため、その実装を流用しています。

ToDoアプリでは、アプリ起動時に毎回テーブルを初期化するように設定しています。テストを簡単に繰り返し実行できるようにするためにこのような設定としますが、テスト用途以外では指定しないように注意してください。

src/main/java/com/example/system/nablarch/di/ExampleComponentDefinitionLoader.java

前述のSystemRepositoryComponentアノテーションを付与してシステムリポジトリへ登録するための実装です。

src/main/resources/app-log.properties

Nablarchで使用するログ出力用の定義ファイルです。

ブランクプロジェクト作成時に生成されたものを使用しています。

src/main/resources/common.config

Nablarchで使用するプロパティ定義ファイルです。

ブランクプロジェクト作成時に生成されたものをベースに使用しています。

src/main/resources/data-source.xml

Nablarchで使用するプロパティ定義ファイルです。

ブランクプロジェクト作成時に生成されたものをベースに使用しています。

src/main/resources/env.config

Nablarchで使用するプロパティ定義ファイルです。

ブランクプロジェクト作成時に生成されたものをベースに使用しています。

src/main/resources/log.properties

Nablarchで使用するログ出力用の定義ファイルです。

ブランクプロジェクト作成時に生成されたものを使用しています。

src/main/resources/rest-boot.xml

Nablarchの使用するシステムリポジトリの定義ファイルです。

ブランクプロジェクト作成時に生成されたものをベースに使用しています。

src/main/resources/rest-component-configuration.xml

Nablarchの使用するシステムリポジトリの定義ファイルです。

ブランクプロジェクト作成時に生成されたものをベースに使用しています。

src/main/resources/db/migration/V1__create_table.sql

Flywayで実行するSQLを定義したファイルです。

src/main/resources/META-INF/services/nablarch.core.repository.di.config.externalize.ExternalizedComponentDefinitionLoader

前述のSystemRepositoryComponentアノテーションを付与してシステムリポジトリへ登録するための実装です。

src/main/webapp/WEB-INF/web.xml

Java EEでWebアプリケーションを作成する際の定義ファイルです。

ブランクプロジェクト作成時に生成されたものをベースに使用しています。

src/test/java/com/example/SampleTest.java

動作確認を行うためのテストを定義したテストクラスです。

実行できれば無条件に成功するテストを実装しています。

package com.example;

import org.junit.Test;

import static org.junit.Assert.assertTrue;

public class SampleTest {

    @Test
    public void test() {
        assertTrue(true);
    }
}

src/test/resources/log.properties

Nablarchで使用するログ出力用の定義ファイルです。

ブランクプロジェクト作成時に生成されたものを使用しています。

src/test/resources/unit-test.xml

テスト実行時にNablarchが使用するシステムリポジトリの定義ファイルです。

ブランクプロジェクト作成時に生成されたものをベースに使用しています。

バックエンドのアプリを起動する

バックエンドのアプリはMavenプロジェクトであるため、Mavenを使用して動作を確認していきます。

まずは、コンパイルやテストが動作することを確認するため、backendディレクトリで次のコマンドを実行します。

$ mvn test

次のようにBUILD SUCCESSと出力されることを確認します。

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.SampleTest
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.048 s - in com.example.SampleTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.506 s
[INFO] Finished at: 2020-08-07T09:55:45+09:00
[INFO] ------------------------------------------------------------------------

次に、アプリケーションサーバのJettyでアプリを起動できることを確認します。

Nablarchでは起動時にデータベースに接続するため、アプリを起動する前に、PostgreSQLを起動しておきます。PostgreSQLをDockerコンテナで起動するため、Docker Composeを使用します。backendディレクトリで次のコマンドを実行します。

$ docker-compose -f docker/docker-compose.dev.yml up -d

続いて、コンテナが起動していることを確認するため、次のコマンドを実行します。

$ docker-compose -f docker/docker-compose.dev.yml ps

docker_postgres_1StateUp(起動中)と出力されることを確認します。

      Name                     Command              State           Ports
----------------------------------------------------------------------------------
docker_postgres_1   docker-entrypoint.sh postgres   Up      0.0.0.0:5432->5432/tcp

PostgreSQLを起動したら、続いてJettyを起動するため、次のコマンドを実行します。バックエンドのアプリの初期設定では、Jettyはlocalhost:9080で起動します。

$ mvn jetty:run

次のようにStartedと出力され、コマンドが実行中のままとなります。これでJettyが起動中の状態となっています。

[INFO] Started ServerConnector@2299f6d7{HTTP/1.1,[http/1.1]}{0.0.0.0:9080}
[INFO] Started Server@3751acd7{STARTING}[10.0.0.alpha1] @7133ms

Jettyが起動したら、起動テストを行います。

ブラウザを起動し、localhost:9080/api/testにアクセスします。

画面上に次のようなレスポンスが出力されることを確認します。

{
    status: "ok"
}

起動テストが完了したら、PostgreSQLとJettyを停止しておきます。

まず、Jettyを終了するため、Jettyを起動して実行中となっているコンソールで、Ctrl+Cを押してコマンドを終了します。

Jettyを停止したら、続いてPostgreSQLを起動しているDockerコンテナを終了するため、次のコマンドを実行します。

$ docker-compose -f docker/docker-compose.dev.yml down

終了したことを確認するため、次のコマンドを実行します。

$ docker-compose -f docker/docker-compose.dev.yml ps

起動中のDockerコンテナとして出力されないことを確認します。

Name   Command   State   Ports
------------------------------

results matching ""

    No results matching ""