JavaRush /Java Blog /Random-JA /SpringBoot + Flyway - 「Java プロジェクトの A から Z まで」
Roman Beekeeper
レベル 35

SpringBoot + Flyway - 「Java プロジェクトの A から Z まで」

Random-JA グループに公開済み
Java プロジェクトの作成に関するシリーズの記事 (他の資料へのリンクは最後にあります)。その目標は主要なテクノロジーを分析することであり、その結果として電報ボットを作成することができます。このパートでは、SpringBoot と Flyway を起動してみます。 最低限の理論は、お好みで))) FlywayとLiquibaseの最後の比較を無期限に省略して、本題に入ります。それでも、それはすでに長引いています。Flyway について 2 度説明しないように、私は直ちにフライウェイを将来の JRTB プロジェクトに追加することにしました。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 1

この一環として何をする必要がありますか?

  1. Maven に基づいて SpringBoot アプリケーションを起動します。
  2. そこに Flyway を追加します。幸いなことに、それらは簡単に統合できます。
  3. サンプル データベースにあるテーブルのスキーマを追加します。
このようにして、Flyway の操作方法を学びます。なぜすぐに JRTB に参加させずに、別のプロジェクトを行うのでしょうか? なぜなら、後でこれを行う方法を理解したい人は誰でも、例とそれを使った作業について説明した記事を含むプロジェクトを手に入れることになるからです。さあ、行きましょう!

フライウェイとは

何かを使用するには、まずそれが何なのか、そしてなぜ使用するのかを理解する必要があります。 Flyway はデータベースのバージョン管理ツールです。言葉としてはよく知られているのに、なんとなく理解が加わっていないですよね?フライウェイが解決する問題を説明してみましょう。プロジェクトがあるとしましょう。私たちの世界のすべてのものと同様に、それは完璧ではないため、プロジェクトの最終バージョンを計画して作成することはできませんでした。特定の不明なニュアンスが現れるたびに。このプロジェクトは作業中にデータベースを使用します。もちろん、プロジェクトが変更されると、データベースの構造も変更される可能性があります。プロジェクト内のエンティティの 1 つに新しいフィールドを追加するとします。どうやってするの?
  1. このフィールドをエンティティに追加し、ビジネス ロジックが機能するようにすべてを更新します。
  2. データベースを更新します。唯一可能な方法は手動で行うことです。これを行うには、必要な SQL スクリプトを登録する必要があります。
2 番目の点では多くの疑問が生じます。
  1. しかし、プロジェクトをデプロイする場所が複数ある場合、それぞれの場所でこれを行う必要があるのでしょうか?
  2. また、元に戻したい場合、データベース構造が現在どのような状態にあるのかを正確に知るにはどうすればよいでしょうか?
  3. データベースの変更が成功したことを確認するにはどうすればよいでしょうか?
  4. プロジェクトで行われたすべてのデータベース変更を追跡する機会を得るにはどうすればよいですか?
手動で実行すると、最良の結果が得られるわけではありません。これらすべての問題を回避するには、データベース移行ツールを使用します。そのひとつがフライウェイです。彼の仕事は何ですか?プロジェクトの一環として、データベースに対して行うすべての作業を一度に保存する個別の SQL ファイル (いわゆる移行) を保存します。すべての移行は厳密に特定の順序で行われるため、データベースの構造とデータの変更を追跡できます (多くの場合、移行を使用して、テスト データがプロジェクトに追加されるため、サーバーにデプロイされるときに、すでにいくつかのデータが追加されています)プロジェクトをテストできる値)。テストに合格した後、プロジェクトのビルド時に移行が開始されます。これらはデータベースに接続し、移行を実行します。このデータベースで移行がすでに実行されている場合、flyway はそれらをスキップします (移行とそのステータスに関するデータはデータベース内の別のテーブルに保存され、管理に役立ちます)。また、一部の移行が失敗した場合、プロジェクトはビルドとサーバーへのマウント (デプロイメント) が停止します。できるだけ詳しく説明しようとしました。まだすべてが完全に理解できていなくても、問題はありません。練習すれば理解できるようになります。

SpringBoot + Flyway を起動する

スプリングブートとは

私たちは何を立ち上げているのでしょうか?...私たちが何をしているのか、そしてなぜそれを行っているのかを理解するには、SpringBoot が何であるかを判断する必要があります。まず、簡単に (まあ、非常に簡単に) Springについて話しましょう。現時点では、これは Java でサーバー アプリケーションを開発する際の事実上の業界標準です。何の基準?これをどう説明すればよいでしょうか? Spring はアプリケーションのスケルトンであり、そこに「肉」、つまりビジネス ロジックを投入します。Spring の助けを借りて (以下、言語を切り替える時間を無駄にしないために、このトレーシングペーパーを使用します:D)) Spring は、すべての作業を開始するためのスタートを与えてくれます。それは多面的で、複数のモジュール式です。
  1. データベースを操作したいですか? 関係性が欲しいですか?非関係性を望みますか? ここでは Spring Data について説明します。
  2. http リクエストを処理しますか? さあ、Spring Web (Spring MVC) です。
  3. すべてのオブジェクトを 1 か所にまとめたコンテナが必要ですか? こちらがスプリングコアです。
  4. さまざまな役割と指揮系統が存在するように、プロジェクトにセキュリティを設定する必要がありますか? スプリングセキュリティ。
  5. このようなものがあればいいのにと思ったとき、Spring には必要なものがすでに備わっており、迅速かつ簡単に統合できることがわかりました。
したがって、これは単なるフレームワーク (このような巨大なライブラリ) ではなく、猛烈なペースで開発されているエコシステム全体であると言えます。Spring Core とは何か、つまりモジュールが接続されるベースとは何かを理解するには、独自のフレームワークの作成に関するライブ デモを見ることをお勧めします。これは、Java と Spring の分野で非常にクールな人物である Evgeny Borisov によってホストされています。彼がしたことをすべてやれば、春の働きがより明確になるでしょう。SpringBoot は、彼らが持つすべての頂点です。きれいな水の魔法。アプリケーションを初めて起動するための最小限の設定。もちろん、これだけでは使い方や何をすべきか理解できません。しかし、開発の深みに突入する前に、すべてを鳥の目で見る必要があります。

SpringBootの起動

Maven が何であるかをすでに理解したので、ニーズに合わせて新しいプロジェクトを作成しましょう。これを行うには、この問題のために特別に作成された Web サイトにアクセスするだけです。これはSpring Initializrと呼ばれます。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 2ここで、必要なものを入力して選択する必要があります。
  1. プロジェクトのビルド ツールは gradle または maven です。ご覧のとおり、Ant については言及すらされなくなりました。これは、どのビルド ツールが時間を費やす価値があるかについての良いヒントになります。
  2. 記述できる言語は java、kotlin、groovy です。ここではすべてが単純です。これらはすべて JVM に似ており、Java コードを簡単に実行できます。ちなみに、Kotlin については検討してみる価値があります。グルービーは正直面白くなくなってきました(グルーヴに切り替えた時期もありましたが、すぐに過ぎてしまいました)。
  3. Spring バージョン...ここでは、Spring の主要部分とそのモジュールのバージョンが一貫していることを理解する必要があります。
  4. プロジェクトデータ。これらのことについてはすでに説明しました。
  5. Jar または War のどちらのアーカイブを収集するかを選択します。
  6. さて、私たちのお気に入りの Java バージョンです。そして最近、このようなバージョンがたくさん出てきました...何年も待ちましたが、今では年に2つ出ています。
私たちの場合、このプロジェクトをJavaRush コミュニティ組織で公開するので、プロジェクトに関する情報は適切になります。
  1. メイビン - 以前にこのことについてお話したのは無駄ではありません。
  2. Java は私たちの最愛の人です :D
  3. バージョン 2.2.11 を見てみましょう。なぜ最新のものではないのでしょうか?新しいものであればあるほど、バグが存在する可能性が高くなります。私たちにとって、どのバージョンでも問題ありませんが、古いバージョンの方が信頼性が高くなります。したがって、2.2.11 を選択します。
  4. グループ: com.github.javarushコミュニティ
  5. アーティファクト: springboot-flyway-demo
  6. 名前: SpringBoot + Flyway デモ
  7. 説明:プロジェクトは、 SpringBoot と Flyway の統合を示します。(はい、ドキュメントを書く能力は開発の重要な部分です:))
  8. パッケージ名: com.github.javarushcommunity.springbootflywaydemo。ここで、アプリケーションを起動するクラスを含む基本パッケージがすぐに作成されます。
  9. 包装:
  10. Java: 8. 機関車の先を行くのではなく、古き良き 8 号に乗りましょう。なぜ11ではないのでしょうか?何のために?私たちの例では、意味が分かりません。
「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 3次に、モジュールを追加しましょう。Flyway との統合を見つける必要があります。MySQL や Spring Data に関連するものを追加することもできます。別の lombok を追加しましょう (これは非常に必要なことです。今は信じてください :D)) これを行うには、[ ADD DEPENDENCIES ...] をクリックし、必要なものをすべて選択します。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 4これが Flyway を追加する方法です。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 5ロンボク島…などなど。その結果、次の結果が得られます:「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 6うーん...すべてを入力しました)) 次に、[GENERATE...] をクリックします。これで完了です - 生成されたプロジェクトを含むアーカイブの準備が整いました :) SHARE...などの便利な機能もあります。これにより、先ほど入力したページへのリンクが表示されます。つまり、これが私が生成したものです。何か問題が発生した場合でも、リンクを使用していつでも確認できます。次に、作成したプロジェクトを Git リポジトリにリンクする必要があるため、作成したspringboot-flyway-demoプロジェクトのクローンを作成し、IDEA 経由でダウンロードします。これを行うには、アイデアを開いて[ファイル] -> [新規] -> [既存のソースからプロジェクト]を選択する必要があります。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 7次に、URL を追加して、[クローン]をクリックします。次のステップは、生成されたプロジェクトの内部を、複製したプロジェクト内に転送することです。混乱した?今からお見せします。これを解凍すると、次のファイルのセットを受け取りました。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 8これらはクローンされたプロジェクトに転送する必要があります。前の記事と同様に、pom.xml を Maven プロジェクトとして追加しましょう。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 9次に、何が生成されたかを見ていきたいと思います。src 以降のすべてのフォルダーを開くと、前の記事で説明した Maven プロジェクトの通常の階層が表示されます。読んでない人は読んでみてください!「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 10Application クラスがあり、それを使用して SpringBoot アプリケーションが起動されることがわかります。SpringBoot 用の Maven プラグインのおかげで、Maven に必要なタスク、つまり spring-boot:run が完成しました。この情報はどこで入手できますか? 右側では、Maven プレートとプロジェクトを開くと、「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 11エラーが発生し、それを読み取ることができません。次のような内容が表示されます。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 12さらに情報を取得するには、速度を上げるために main メソッドを実行します。 Application クラスの:「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 13そして、本当の理由がわかります:「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 14ここにはすでにより多くの情報があり、それを使って何かを行うことができます。どうしたの?データベースには依存関係が関連付けられているため、データベースに接続するための設定を提供する必要があります。これを行うには、Google で調べたところ、次の設定を application.properties に追加する必要があることがわかりました。
spring.datasource.url=jdbc:mysql://localhost:3306/flyway_demo_db
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
main メソッドを再度実行すると、次の結果が得られます。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 15次に、少なくとも 1 つの移行を追加する必要があります。移行を正しく作成するには、次のテンプレートを使用する必要があります: V<VERSION>__<NAME>.sqlこのテンプレートを使用して、 V00001__Create_country_table.sqlという名前の移行ファイルを適切なフォルダーに 作成します: /src/main/resources/ db.migration/。その中に国テーブルを作成しましょう。データベースに関する 2 番目の記事からスクリプトを取り出してみましょう。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 16始める前に、作業用のデータベース flyway_demo_db を作成しましょう。MysqlWorkbench を使用してこれを実行してみましょう。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 17これで、メイン メソッドを再度実行できます。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 18すべてがうまくいきましたが、プロジェクトにはまだ何もないので、動作は終了しました。ただし、ログから次のことが明らかです (ログが何であるかを読んでください)。
  1. データベースに正常に接続されました。
  2. 移行は検証されており、すべて問題ありません。
  3. Flyway は、移行を管理するためのテーブルを作成しました。
  4. そして、移住00001が始めたこと - 国の創設は成功しました。
これを確認するには、データベース内で何が行われているかを確認してください。それでは、MySQL サーバーにアクセスして、flyway_demo_db データベース内のテーブルで何が起こっているのかを見てみましょう 。$SHOW テーブル; 「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 19予想通り、移行が行われ、その間に country テーブルが作成され、移行に関する情報を保存する flyway_schema_history テーブルが表示されました。さらに進んで、どのようなレコードがあるのか​​ (そして、そもそもレコードがあるのか​​どうか) を見てみましょう。 $SELECT * FROM flyway_schema_history; 「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 20これが唯一の録音です。興味深いデータがたくさん含まれています。バージョン、移行の説明、SQL の種類 (XML も)、スクリプト自体の名前、チェックサム (これは、移行が変更されたかどうかを確認するために使用されるハッシュコードのようなものです。これで完了です)データベースで移行を実行し、その後修正された場合に備えて、これは実行できません。すべての変更は新しい移行によってのみ行われます。これを防ぐために、チェック量はこれを監視します)、ユーザー SQL 名、移行処理日付、実行時刻、結果 (成功または失敗)。一度作成した移行は、将来変更しないでください。たとえそこに欠陥があったとしても。すべての変更は、新しい移行を通じてのみ行われます。それは非常に重要です。何が起こるかを示すために、スクリプトを少し変更して再度実行してみましょう。マイグレーションの国テーブルにエントリを 1 つ追加しましょう。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 21そして main メソッドを実行すると、次の結果が得られます。「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 22予想どおり、flyway はスクリプトが変更されたことを認識し、マイグレーションを実行しませんでした。場合によっては、実際に更新された移行を実行する必要がある場合があります。Flyway がこれをスキップするには、flyway_schema_history テーブルのエントリを削除してから、更新された移行を実行する必要があります。これは通常の動作ではないため、そうあるべきではありませんが、問題を解決するこの方法についても知っておく必要があります。私たちは最初の移行に取り組みました。ここで、データベースに関する記事にあるように、国に関するデータを含む別の移行を追加したいと思います: ファイルV00002__Add_test_data_to_country.sql「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 23そして、メイン メソッドを再度実行しましょう:「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 24ログから、移行が開始される前にデータベースが次の状態にあったことは明らかです。バージョン 00001 なので、このバージョン以降のすべての移行。次に、バージョン 00002 が起動され、成功しました。確認しましょう。それとも、国内の 3 つの記録がデータベースにすでに存在していると私が信じていますか?)) 確認しますので、証明:「Java プロジェクトの A から Z まで」: SpringBoot + Flyway - 25このようなものです。プロジェクトを再度実行すると、データベースが必要なバージョンに完全に準拠しているため、flyway は移行のロールアウトをスキップします。

結論

今回は、データベース移行ツールを理解し、SpringBoot と組み合わせて使用​​する方法を学びました。この情報は、Flyway を例としてデータベース バージョン管理ツールとは何かを理解するために必要です。皆さん、私が示したプロジェクトのソース コードは、私たちの組織の Github で公開されています。この例が気に入ったら、スターを付けてください。そうすれば、私の仕事が役に立ち、続ける価値があることがわかります。従来通り、Github アカウントに登録することをお勧めします。私はオープンソースに関するすべての作業と、常に私の記事に付随するデモ プロジェクトをすべて彼を通じて行っています。読んでくれた皆さん、ありがとう。次回はアプリケーションを書いていきます。将来的には Docker に関して必要な理論がいくつか出てくるでしょうが、実践によって大幅に薄めていきます。

役立つリンク

現在、有用なリンクはあまりありません。Evgeniy のビデオに注目してください。本当に価値があります。
  1. Spring でプロジェクトを作成するための Web サイト
  2. Evgeniy Borisov — Spring ビルダー
  3. Flyway の Spring ドキュメント

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

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