JavaRush /Java Blog /Random-JA /データベースに関連するものをすべて追加します。(パート 1) - 「Java プロジェクトの A から Z まで」...
Roman Beekeeper
レベル 35

データベースに関連するものをすべて追加します。(パート 1) - 「Java プロジェクトの A から Z まで」

Random-JA グループに公開済み
私たちは目標に向かって一歩ずつ進んでいます。 「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 - 1今日は多くのタスクを解決する必要があります。
  1. フライウェイを追加します。ここでは、プロジェクトのデータベースのデプロイメントを構成します。
  2. データベーススキーマを追加します。
  3. リポジトリ層を追加します。
  4. ボット統計用のコマンドを追加します。
  5. 結局のところ、テストを作成してください。
だから、座って、座って、長い読書になるでしょう。docker と docker-compose を使用してアプリケーションをデプロイする方法はすでに学習しました。それは簡単なことではありませんでしたが、それをやり遂げた人たちに敬意を表します。実装について質問がある場合は、このプル リクエストのコードを参照してください。

フライウェイの追加

Flyway を追加するには、データベースが必要です。これを docker-compose の別のサービスとして追加します。前回、 docker-compose にはサービス セクションがあり、特定のインフラストラクチャ (つまり、一連のアプリケーション/データベース/メッセンジャーなど) の追加と管理を担当するサービス セクションがあると述べました。
Flyway とは何か、そしてそれを SpringBoot アプリケーションに追加する方法についてはすでに説明しました。この記事を読む前に、記憶をリフレッシュしておくことをお勧めします。Flyway + SpringBoot に関する記事のデモを含むプロジェクトのREADME.mdファイルを読むこともできます。
最初に行うことは、プロジェクト内のメイン ブランチ (git pull) を更新し、タスク名 STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1) で新しいブランチを作成することです。思い出してもらいたいのですが、プロジェクト内の一連のタスクを名前だけで並べ替えられるように、ブランチの名前を変更しました。これにより、あるステップから別のステップにすばやく移動できるようになります。これで安心して仕事ができます。3 つの依存関係を追加する必要があります。

<dependency>
  <groupId>org.flywaydb</groupId>
  <artifactId>flyway-core</artifactId>
</dependency>

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
最初の依存関係は FlyWay をプロジェクトに追加する役割を果たし、2 番目の依存関係は MySQL データベースに接続する機能を追加します。3 つ目は SpringBoot スターターで、Spring でデータベースを使用するすべての魔法を起動します。また、ゲッターとセッターを記述しないように、ロンボクも追加しましょう。

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
次に、開発用のデータベースが必要です。現時点では (より良いアイデアが思いつくまで) 別の docker-compose ファイルと application.properties 用の別のファイルとして作成します。開発 (特に Spring エコシステム) にはプロファイルというものが存在します。プロファイルに応じて、操作のために異なる設定が起動されます。将来的には、docker-compose を 1 つのファイルに結合し、必要な設定で開発用に 1 つのデータベースのみが起動されるようにする予定です。今のところはこれを行います:
  1. プロジェクト docker-compose-test.yml のルートにファイルを作成しましょう。このファイルでは、独自の設定を持つデータベースのみが起動されます。
  2. docker-compose-test.yml ファイルの設定と一致する設定を使用して application-test.properties ファイルを作成しましょう。
MySQL を使用するために、DockerHubから公式イメージを取得しました。「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 2すばやくスクロールすると、必要な変数が見つかりました。 MYSQL_DATABASE - データベース名 MYSQL_USER - データベース ユーザー名 MYSQL_PASSWORD - データベース ユーザーのパスワード そして、それらを正しく記述する方法は次のとおりです。

jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
その後、プロジェクト ルートに docker-compose-test.yml を作成します。

version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_USER: root
     MYSQL_PASSWORD: root
この特定のファイルを実行して docker-compose と連携するには、リクエストで-fフラグを使用する必要があります。これは、標準の docker-compose.yml が使用されるのではなく、起動されるファイルの名前が提供されることを意味します。したがって、リクエストは次のようになります: docker-compose -f docker-compose-test.yml up -d 最初にどのファイルを取得するかを指定し ( -f docker-compose-test.yml )、次にサービスを起動し、これをデーモン モード ( up -d )で実行する必要があるとします。つまり、このコマンドが起動された端末セッションの外でプロセスが実行されるようにします。データベースを起動して接続を試み、データベースが起動して使用できることを確認します。これを行うには、使い慣れた MySQL Workbench (ここで説明しました) を開き、新しい接続を作成します。「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 3次のフィールドに入力する必要があります。
  • 接続名 - 接続名 - オプションで DEV_JRTB_DB;
  • ホスト名 - データベースがデプロイされているアドレスです。私たちの場合、すべてが以前のままになります: 127.0.0.1または localhost;
  • ユーザー名 - docker-compose で記述したように、ここは root になります。
  • パスワード - rootでもあります。
この後、接続があるかどうかを確認する必要があります。これを行うには、[接続のテスト]をクリックします。「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 4その結果、次のメッセージが表示されます: MySQL への接続に失敗しました...なぜですか? ターミナルに行き、Docker コンテナに何が起こったのかを確認します。ターミナルに書き込んでみましょう:「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 5ターミナルが 59 分前に作成され、再起動が 55 秒かかっていることがわかります。なぜでしょうか? 明確ではないので、ログを確認する必要があります。ターミナルでプロジェクト ルートに移動し、次のコマンドを実行します: docker-compose -f docker-compose-test.yml logs
我々が得る:

dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:28+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:28+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:29+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:32+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:32+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:34+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:34+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:37+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:44+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:44+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 10:14:58+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 10:14:58+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified dev-jrtb-db | You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

これで、データベースが私たちの設定で起動されていないことが明らかになりました。エラーは同じなので、シートから分離しましょう。
2021-02-28 11:03:37+00:00 [エラー] [エントリポイント]: データベースが初期化されておらず、パスワード オプションが指定されていません dev-jrtb-db | MYSQL_ROOT_PASSWORD、MYSQL_ALLOW_EMPTY_PASSWORD、MYSQL_RANDOM_ROOT_PASSWORD のいずれかを指定する必要があります。
つまり、ルート ユーザー (メイン ユーザー) のパスワードを決定する必要があります。さて、ファイルを更新します。

version: '3.1'

services:
 jrtb-db:
   image: mysql
   restart: always
   container_name: dev-jrtb-db
   ports:
     - "3306:3306"
   environment:
     MYSQL_DATABASE: "dev_jrtb_db"
     MYSQL_ROOT_PASSWORD: root
ユーザーとパスワードのこれらの変数を削除し、root ユーザーのパスワードのみを追加しました。これは、root ユーザーが root パスワードを持つことを意味します。少なくとも私たちはそう想定しています。実行して何が起こるか見てみましょう: docker-compose -f docker-compose-test.yml up -d そしてすぐにログが何を示しているかを確認してください: docker-compose -f docker-compose-test.yml logs
見てみよう:

Attaching to dev-jrtb-db dev-jrtb-db | 2021-02-28 11:20:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.23-1debian10 started. dev-jrtb-db | 2021-02-28 11:20:41+00:00 [Note] [Entrypoint]: Initializing database files dev-jrtb-db | 2021-02-28T11:20:41.083803Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.23) initializing of server in progress as process 43 dev-jrtb-db | 2021-02-28T11:20:41.088457Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:41.447990Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:42.672093Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option. dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Database files initialized dev-jrtb-db | 2021-02-28 11:20:45+00:00 [Note] [Entrypoint]: Starting temporary server dev-jrtb-db | 2021-02-28T11:20:45.893664Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 88 dev-jrtb-db | 2021-02-28T11:20:45.921695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:46.088339Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:46.207499Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:46.369170Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:46.369357Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:46.371501Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:46.402227Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:46+00:00 [Note] [Entrypoint]: Temporary server started. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it. dev-jrtb-db | Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it. dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Creating database dev_jrtb_db dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:49+00:00 [Note] [Entrypoint]: Stopping temporary server dev-jrtb-db | 2021-02-28T11:20:49.187996Z 11 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23). dev-jrtb-db | 2021-02-28T11:20:50.925075Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23) MySQL Community Server - GPL. dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: Temporary server stopped dev-jrtb-db | dev-jrtb-db | 2021-02-28 11:20:51+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up. dev-jrtb-db | dev-jrtb-db | 2021-02-28T11:20:51.420058Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1 dev-jrtb-db | 2021-02-28T11:20:51.427384Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. dev-jrtb-db | 2021-02-28T11:20:51.577244Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. dev-jrtb-db | 2021-02-28T11:20:51.677659Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock dev-jrtb-db | 2021-02-28T11:20:51.787156Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed. dev-jrtb-db | 2021-02-28T11:20:51.787325Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel. dev-jrtb-db | 2021-02-28T11:20:51.789742Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory. dev-jrtb-db | 2021-02-28T11:20:51.812100Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.

エラーは出なくなったようなので、アクセスがあるかどうかがわかります。しかし、残念ながら、再びアクセスすることはできません...何もありません。さらに詳しく調べます。「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 6docker-compose を終了してすべてのコンテナを削除するには、次のように記述する必要があります: docker-compose -f docker-compose-test.yml down ここで、削除するファイルを指定しました。何をするか?グーグルで調べてみましょう。もしかしたら誰かがもっとうまくやっているかもしれません。最も単純なクエリ「docker-compose の mysql の例」は、中程度のリソースへのリンクを見つけるのに役立ちます。彼らはこんな例を挙げています。

version: '3.3'
services:
 db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'password'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
     # Opens port 3306 on the container
     - '3306'
     # Where our data will be persisted
   volumes:
     - my-db:/var/lib/mysql
# Names our volume
volumes:
 my-db:
私たちはそれをニーズに合わせて調整し、次のことを実現します。

version: '3.1'

services:
 jrtb-db:
   image: mysql:5.7
   restart: always
   environment:
     MYSQL_DATABASE: 'dev_jrtb_db'
     # So you don't have to use root, but you can if you like
     MYSQL_USER: 'dev_jrtb_db_user'
     # You can use whatever password you like
     MYSQL_PASSWORD: 'dev_jrtb_db_password'
     # Password for root access
     MYSQL_ROOT_PASSWORD: 'root'
   ports:
     # <Port exposed> : < MySQL Port running inside container>
     - '3306:3306'
   expose:
       # Opens port 3306 on the container
       - '3306'
このオプションは、すでに知られているコマンド docker-compose -f docker-compose-test.yml up -dで起動します 。 MySQLWorkBench 経由でデータベースへのアクセスを再試行します。「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 7ついに、アクセスが表示されました。しかし今思うと、何がこれに影響を与えたのだろうか。私はこの部分で罪を犯しています。

expose:
   # Opens port 3306 on the container
   - '3306'
確認するのは簡単です。これがなければ何も機能しません:D。確認してみましょう: この部分を削除し、docker-compose を再起動します: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up ワークベンチを通じてデータベースにログインしようとします。大丈夫。その場合、唯一のオプションはデータベースのバージョンです。5.7 と明記されています。つまり、最新のものに変更すると動作しないはずです。再起動しましたが、本当に機能しません...「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 8どうやら最新バージョンの Docker イメージに問題があるようです。いいよ、大丈夫。これはフリーソフトウェアでよく起こります。バージョン 5.7 を使用します。必要なデータベース (dev_jrtb_db) があるかどうかを確認してみましょう。これを行うには、MySQL Workbench で Query コマンドSHOW DATABASESを実行します。「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 9はい、出力に表示されます。よし、次に進むことができる。次に、最初の移行を追加しましょう。「プロジェクト計画: 2 回測定し、1 回カットする」の記事のタスクに基づいて、最初のテーブル tg_user を作成します。すべての移行はprojectDir/src/main/resources/db/migrationフォルダーに配置され、名前はV00001__add_tg_user_table.sqlになります。なぜそのフォルダーにそのような名前があるのか​​ - Spring + flyway の記事で説明しました。最初の移行は次のようになります: V00001__add_tg_user_table.sql:

-- ensure that the table with this name is removed before creating a new one.
DROP TABLE IF EXISTS tg_user;

-- Create tg_user table
CREATE TABLE tg_user (
   chat_id VARCHAR(100),
   active BOOLEAN
);
つまり、ここではチャット ID (テーブル内で ID として機能するために使用できる一意の要素) のみを持つユーザーとその状態 (アクティブまたは非アクティブ) のテーブルを作成するだけです。そのため、ボットを停止してもサブスクリプション情報は残り、再びボットを使用したい場合に使用できます。現時点では、ユーザーに関するその他の情報は必要ありません。ここで主な質問は、これをどのように確認するかです。アプリケーションを起動する必要があります。これまでのところ、メインの docker-compose.yml ファイルはデータベースと接続されていないため、データベースと一緒にアプリケーションをデバッグする方法も学ぶ必要があります。そこで、Intellij IDEA でアプリケーションを起動してみましょう。これをテストするには、JavarushTelegramBotApplication で main メソッドを実行する必要があります。デプロイメントとテストの作業を分離するために、プロパティを持つ別のファイル application-test.properties を使用しますこのテンプレートを使用して、このファイルがテストプロファイルに使用されることを Spring に知らせます。プロファイルを指定しない場合、デフォルトのプロファイルが使用されます (SpringBoot の実行時にログでこれを確認してください。これについては最初の行に書かれています)。これは次のようになります。

# MySQL configurations:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db
spring.datasource.username=dev_jrtb_db_user
spring.datasource.password=dev_jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=tes
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
そして、メインのapplication.properties は少し異なります。

# MySQL configurations:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db
spring.datasource.username=jrtb_db_user
spring.datasource.password=jrtb_db_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# TelegramBot configurations:
bot.username=test.javarush_community_bot
bot.token=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
大きな違いはspring.datasource.url フィールドにあります。テスト プロファイルでは URL がlocalhostにあります。つまり、アプリケーションは Docker の外部で実行されることが期待されています。これは事実です。デバッグ時にプロジェクトを Intellij IDEA で実行し、ローカル マシンからデータベースにアクセスできることが期待されるからです。ただし、 application.properties URL にはすでに別の URL、jrtb-dbが含まれています。これは docker-compose でのデータベースの名前になり、これにより docker アプリケーションがデータベースにアクセスできるようになります。なぜ?したがって、これらは同じ docker-compose 内で起動し、この方法でお互いを認識します。これは、プロジェクトに 1 つのクローズド インフラストラクチャを用意するために必要です。しかし、起動時にプロファイルを起動するにはどうすればよいでしょうか? これを行うには、Intellij IDEA で main メソッドの起動を構成できます。このためには、「構成の編集」があります。 JavarushTelegramBotApplication のメイン クラスに移動し、メインメソッドの宣言の横にある緑色の矢印をクリックして、「実行構成の変更」を選択します。必要「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 10な変数を入力し、プロファイルを構成します。Intellij IDEA では、この設定ウィンドウのインターフェイスが少し変更されているため、同じ状況が表示されるように IDEA を最新バージョンに更新することをお勧めします。 [環境変数]「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 11フィールドで、次を使用してボット名とトークン変数を追加する必要があります。次のテンプレート:変数名1=値1; 変数名2=値2。つまり、key=value はセミコロンで区切られます。この場合、次のようになります: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (ボットの名前とトークンは異なります) 次に、[オプションの変更]ボタンの[VM オプションの追加]フィールドを選択します。: -Dspring.profiles.active =test - SpringBoot にテスト プロファイルを使用するように指示します。つまり、プロパティは application-test.properties から取得されます。その結果、次のようになります:ここで、テスト データベースを起動します: docker-compose -f docker-compose-test.yml up そして、まさにこの方法で、-d プレフィックスを付けずに、ログをすぐに確認できるようにします。端末(必要な場合)。最後のステップは、main メソッドを実行するだけです。私が説明したのと同じ方法ですべてを実行すると、次のようになります。ログの 2 行目は、テスト プロファイルが取得した内容の説明です。MySQLWorkbench を実行し、2 つのコマンドを実行して、移行がロールアウトされ、すべてが機能していることを確認します (これはアプリケーション起動ログから確認できますが、確認する価値は間違いなくあります)。「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 12「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 13「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 14
  1. dev_jrtb_db を使用します。
  2. テーブルを表示します。
結果:「Java プロジェクトの A から Z まで」: データベースに関連するすべてを追加します。 パート 1 ~ 15予想どおり、2 つのテーブルが得られました。1 つ目は移行を考慮した技術的なもので、2 つ目は Telegram ユーザー用のテーブルです。すべて: Flyway とデータベースが追加されました。これで、新しい移行が時計のように進むようになります。最も難しいのは、最初のセットアップとプロセスの起動です。 引き続き、このグローバル タスクの作業を完了しています。docker-compose.yml へのデータベースの追加、リポジトリ レイヤーの追加、ボットの統計、テストとドキュメントの作成と更新です。

シリーズのすべてのマテリアルのリストは、この記事の冒頭にあります。

コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION