JavaRush /Java Blog /Random-ID /SpringBoot + Flyway - "Proyek Java dari A hingga Z"

SpringBoot + Flyway - "Proyek Java dari A hingga Z"

Dipublikasikan di grup Random-ID
Artikel dari seri tentang membuat proyek Java (tautan ke materi lain ada di akhir). Tujuannya adalah menganalisis teknologi utama, dan hasilnya adalah menulis bot telegram. Pada bagian ini, kami mencoba meluncurkan SpringBoot dan Flyway. Jumlah minimum teori, sesuka Anda))) Kami menghilangkan perbandingan akhir Flyway/Liquibase untuk jangka waktu tidak terbatas dan langsung ke intinya. Meski begitu, hal itu sudah berlangsung lama. Agar tidak mendeskripsikan Flyway dua kali, saya memutuskan untuk segera menambahkannya ke proyek JRTB kami yang akan datang."Proyek Java dari A hingga Z": SpringBoot + Flyway - 1

Apa yang perlu kita lakukan sebagai bagian dari hal ini?

  1. Luncurkan aplikasi SpringBoot berdasarkan Maven.
  2. Tambahkan Jalur Terbang di sana: untungnya, semuanya mudah diintegrasikan.
  3. Tambahkan skema untuk tabel yang kita miliki di database contoh.
Dengan cara ini kita akan belajar bagaimana bekerja dengan Flyway. Mengapa proyek terpisah, dan tidak langsung menjadi JRTB kami? Karena nanti siapa pun yang ingin memahami cara melakukan ini akan memiliki proyek dengan contoh dan artikel yang menjelaskan cara mengerjakannya. Baiklah, ayo pergi!

Apa itu jalur terbang

Untuk menggunakan sesuatu, pertama-tama Anda perlu mencari tahu apa itu dan mengapa. Flyway adalah alat kontrol versi database. Kata-katanya sudah terkenal, tapi entah kenapa belum ditambah pengertiannya ya? Mari kita coba menjelaskan permasalahan yang dipecahkan oleh jalur terbang. Katakanlah kita mempunyai sebuah proyek. Seperti segala sesuatu di dunia kita, ini tidak sempurna, sehingga tidak mungkin merencanakan dan menyusun versi final proyek tersebut. Setiap kali nuansa tertentu yang tidak terhitung muncul. Proyek ini menggunakan database dalam pekerjaannya. Tentu saja, jika proyek berubah, struktur database juga dapat berubah. Katakanlah kita menambahkan bidang baru untuk salah satu entitas dalam proyek kita. Bagaimana cara melakukannya?
  1. Tambahkan bidang ini ke entitas kami, perbarui semuanya agar logika bisnis berfungsi.
  2. Perbarui basis data. Satu-satunya cara yang mungkin adalah melakukannya secara manual. Untuk melakukan ini, Anda harus masuk dan mendaftarkan skrip sql yang diperlukan.
Poin kedua menimbulkan banyak pertanyaan:
  1. Namun jika kita memiliki lebih dari satu tempat untuk menerapkan proyek, apakah hal ini perlu dilakukan di masing-masing tempat tersebut?
  2. dan jika kita ingin kembali ke masa lalu, bagaimana kita tahu persis keadaan struktur database saat ini?
  3. Bagaimana kita yakin bahwa perubahan database berhasil?
  4. Bagaimana saya bisa mendapatkan kesempatan untuk melacak semua perubahan database yang terjadi pada proyek?
Jika Anda melakukannya secara manual, jawabannya bukan yang terbaik... Untuk menghindari semua kesulitan ini, Anda dapat menggunakan alat migrasi database. Salah satunya adalah Jalur Terbang. Apa pekerjaannya? Sebagai bagian dari proyek, kami menyimpan file sql terpisah (disebut migrasi), yang menyimpan semua yang kami lakukan dengan database pada satu waktu. Semua migrasi terjadi secara ketat dalam urutan tertentu, yang memungkinkan Anda melacak perubahan dalam struktur dan data database (seringkali, menggunakan migrasi, data pengujian ditambahkan ke proyek sehingga ketika disebarkan ke beberapa server, sudah ada beberapa nilai yang dapat Anda gunakan untuk menguji proyek). Setelah pengujian berhasil, migrasi diluncurkan saat proyek dibuat. Mereka terhubung ke database dan melakukan migrasi. Jika migrasi telah dilakukan pada database ini, maka flyway akan melewatkannya (menyimpan data tentang migrasi dan statusnya dalam tabel terpisah di database, yang membantu mengelolanya), dan jika beberapa migrasi tidak berhasil, maka proyek tersebut build dan pemasangannya (penempatan) ke server akan dihentikan. Saya mencoba menggambarkannya sedetail mungkin. Jika semuanya masih belum sepenuhnya jelas, tidak masalah: dengan latihan, pemahaman akan muncul.

Luncurkan SpringBoot + Jalur Terbang

Apa itu Sepatu Musim Semi

Apa yang kami luncurkan?... Untuk memahami apa dan mengapa kami melakukan, Anda perlu memutuskan apa itu SpringBoot. Pertama, mari kita bahas dengan cepat (yah, sangat cepat) tentang Spring . Saat ini, ini adalah standar industri de facto dalam pengembangan aplikasi server di Java. Standar apa? Bagaimana saya bisa menjelaskan hal ini kepada Anda? Pegas adalah kerangka aplikasi, yang kemudian kita lemparkan “daging” – logika bisnis kita. Dengan bantuan Spring (selanjutnya saya akan menggunakan kertas kalkir ini agar tidak membuang waktu berpindah bahasa :D)) Spring memberi kita awal dari mana kita mulai melakukan segalanya. Ini memiliki banyak segi, multi-modular:
  1. Apakah Anda ingin bekerja dengan database? Apakah Anda ingin relasional? Apakah Anda ingin non-relasional? Ini dia dengan Spring Data.
  2. Apakah Anda ingin bekerja dengan permintaan http? Ini dia, web Spring (Spring MVC).
  3. Apakah Anda memerlukan wadah untuk semua benda Anda di satu tempat? Inilah Inti Musim Semi.
  4. Apakah Anda perlu mengatur keamanan pada suatu proyek sehingga terdapat peran dan rantai komando yang berbeda? Keamanan Musim Semi.
  5. Saat Anda mengira akan menyenangkan memiliki hal seperti itu, ternyata Spring sudah memiliki apa yang Anda butuhkan, dan terintegrasi dengan cepat dan mudah.
Oleh karena itu, kita dapat mengatakan bahwa ini bukan hanya sebuah kerangka kerja (perpustakaan yang sangat besar), tetapi keseluruhan ekosistem yang berkembang dengan sangat cepat. Untuk memahami apa itu Spring Core, yaitu basis yang menghubungkan modul, saya menyarankan Anda untuk menonton demo langsung tentang cara membuat kerangka kerja Anda sendiri. Acara ini dipandu oleh Evgeny Borisov, seorang pria yang sangat keren di bidang Java dan Spring. Lakukan semua yang dia lakukan, dan pekerjaan musim semi akan menjadi lebih jelas bagi Anda. SpringBoot, pada gilirannya, adalah puncak dari semua yang mereka miliki. Keajaiban air murni. Pengaturan minimum untuk meluncurkan aplikasi pertama kali. Tentu saja hal ini tidak akan memberikan Anda pemahaman tentang cara menggunakannya dan apa yang harus dilakukan. Namun sebelum terburu-buru mendalami perkembangan, Anda perlu melihat segala sesuatu dari sudut pandang luas.

Meluncurkan SpringBoot

Karena kita sudah memahami apa itu Maven, mari kita buat proyek baru untuk kebutuhan kita. Untuk melakukan ini, Anda hanya perlu mengunjungi situs web yang khusus dibuat untuk masalah ini. Ini disebut Spring Initializr . "Proyek Java dari A hingga Z": SpringBoot + Flyway - 2Di sini Anda perlu mengisi dan memilih apa yang Anda butuhkan:
  1. Alat pembangunan proyek adalah gradle atau maven. Seperti yang Anda lihat, Ant bahkan tidak disebutkan lagi. Ini adalah petunjuk bagus tentang alat pembangunan mana yang layak untuk Anda gunakan.
  2. Bahasa yang dapat Anda gunakan untuk menulis adalah java, kotlin, groovy. Semuanya sederhana di sini: semuanya mirip JVM dan kode Java dapat dijalankan dengan mudah. Omong-omong, ada baiknya melihat Kotlin. Groovy sejujurnya menjadi tidak menarik (ada saat ketika mereka beralih ke alur, tetapi itu segera berlalu).
  3. Versi musim semi... Di sini Anda perlu memahami bahwa versi bagian utama Spring dan modulnya konsisten.
  4. Data proyek. Saya sudah menjelaskan hal-hal ini.
  5. Kami memilih arsip mana yang akan dikumpulkan - Jar atau War.
  6. Nah, versi Java favorit kami. Dan baru-baru ini ada banyak sekali versi ini... Mereka menunggu bertahun-tahun, dan sekarang ada dua dalam setahun.
Dalam kasus kami, kami akan mempublikasikan proyek ini di organisasi Komunitas JavaRush , sehingga informasi tentang proyek tersebut akan sesuai:
  1. Maven - bukan tanpa alasan kami membicarakan hal ini dengan Anda sebelumnya.
  2. Java adalah kesayangan kami :D
  3. Mari kita ambil versi 2.2.11. Kenapa bukan yang terbaru? Karena semakin baru, kemungkinan terdapat beberapa bug di sana akan semakin besar. Bagi kami, tidak masalah versi yang mana, namun versi yang lebih lama akan lebih dapat diandalkan. Oleh karena itu, kami memilih 2.2.11.
  4. Grup: com.github.javarushcommunity
  5. Artefak: springboot-flyway-demo
  6. Nama: SpringBoot + Demo Jalur Terbang
  7. Deskripsi: Proyek menunjukkan integrasi antara SpringBoot dan Flyway . (Ya, kemampuan menulis dokumentasi adalah bagian penting dari pengembangan :))
  8. Nama paket: com.github.javarushcommunity.springbootflywaydemo . Di sini mereka akan segera membuatkan paket dasar untuk kita dengan kelas yang akan meluncurkan aplikasi kita.
  9. Kemasan: Toples
  10. Java: 8. Jangan mendahului lokomotif dan mengambil lokomotif tua yang bagus. Kenapa bukan 11? Untuk apa? Untuk contoh kita, saya tidak mengerti maksudnya.
"Proyek Java dari A hingga Z": SpringBoot + Flyway - 3Sekarang mari tambahkan modul. Kita perlu menemukan integrasi dengan Flyway. Anda juga dapat menambahkan sesuatu yang berhubungan dengan MySQL dan Spring Data. Mari kita tambahkan lombok lain (ini adalah hal yang sangat penting, percayalah pada saya untuk saat ini :D)) Untuk melakukan ini, klik TAMBAHKAN KETERGANTUNGAN ... dan pilih semua yang Anda perlukan: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 4Beginilah cara kami menambahkan Jalur Terbang. "Proyek Java dari A hingga Z": SpringBoot + Flyway - 5Lombok... Dan seterusnya. Hasilnya, kita mendapatkan: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 6Huh... kita sudah mengisi semuanya)) Sekarang klik GENERATE... dan selesai - arsip dengan proyek yang dihasilkan sudah siap :) Ada juga yang keren seperti SHARE... , yang memberi Anda tautan ke halaman yang baru saja Anda isi. Yaitu, inilah yang saya hasilkan . Dan bahkan jika terjadi kesalahan, Anda selalu dapat memeriksanya menggunakan tautan. Selanjutnya, kita perlu menautkan proyek yang dibuat ke repositori Git, jadi kita mengkloning proyek springboot-flyway-demo yang dibuat dan mengunduhnya melalui IDEA. Untuk melakukan ini, Anda perlu membuka ide dan memilih File -> New -> Project from Existing Sources... : "Proyek Java dari A hingga Z": SpringBoot + Flyway - 7Sekarang tambahkan URL dan klik Clone . Langkah selanjutnya adalah mentransfer internal proyek yang dihasilkan ke dalam proyek yang kita kloning. Bingung? Saya akan menunjukkannya kepada Anda sekarang. Saya membuka ritsletingnya dan menerima kumpulan file berikut: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 8Ini perlu ditransfer ke proyek kloning. Seperti pada artikel sebelumnya, mari tambahkan pom.xml sebagai proyek pakar: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 9Sekarang kami tertarik untuk melihat apa yang dihasilkan untuk kami. Jika Anda membuka semua folder di src dan selanjutnya, Anda akan melihat hierarki biasa di proyek Maven, yang telah kita bahas di artikel sebelumnya . Bagi yang belum membacanya, bacalah! "Proyek Java dari A hingga Z": SpringBoot + Flyway - 10Dapat dilihat bahwa kita memiliki kelas Aplikasi, dan aplikasi SpringBoot kita akan diluncurkan menggunakan kelas tersebut. Berkat plugin Maven untuk SpringBoot, kami sekarang memiliki tugas yang kami perlukan untuk Maven, yaitu spring-boot:run. Dimana kita dapat menemukan informasi ini? Di sebelah kanan, membuka pelat Maven dan proyek kami: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 11Akan ada kesalahan, dan kami tidak dapat membacanya, kami akan melihat sesuatu seperti ini: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 12Untuk mendapatkan informasi lebih lanjut, untuk kecepatan kita dapat menjalankan metode utama kelas Aplikasi: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 13Dan kemudian kita akan melihat alasan sebenarnya: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 14Di sini sudah ada informasi lebih lanjut dan Anda dapat melakukan sesuatu dengannya. Apa yang salah? Kami memiliki ketergantungan yang terkait dengan database, dan oleh karena itu kami perlu menyediakan pengaturan untuk menghubungkannya. Untuk melakukan ini, kami mencari di Google dan menemukan bahwa kami perlu menambahkan konfigurasi berikut ke 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
Kami menjalankan metode utama lagi dan mendapatkan: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 15Sekarang kita perlu menambahkan setidaknya satu migrasi. Untuk membuat migrasi dengan benar, Anda perlu mengambil templat berikut: V<VERSION>__<NAME>.sql Dengan menggunakan templat ini, kita akan membuat file migrasi bernama V00001__Create_country_table.sql di folder yang sesuai: /src/main/resources/ db.migrasi/ . Mari buat tabel negara di dalamnya. Mari kita ambil script dari artikel kedua tentang database . "Proyek Java dari A hingga Z": SpringBoot + Flyway - 16Sebelum memulai, mari masuk dan buat database untuk pekerjaan: flyway_demo_db. Mari kita lakukan ini melalui MysqlWorkbench: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 17Sekarang kita dapat menjalankan metode utama lagi: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 18Semuanya berhasil, tetapi karena kita belum memiliki apa pun di proyek, maka proyek selesai. Namun, jelas dari log ( baca apa itu log ) bahwa:
  1. Berhasil terhubung ke database.
  2. Migrasi telah divalidasi dan semuanya baik-baik saja.
  3. Flyway telah membuat tabel untuk mengelola migrasi.
  4. Dan migrasi apa yang dimulai 00001 - penciptaan negara berhasil.
Untuk memeriksanya, Anda dapat pergi dan melihat apa yang dilakukan di database. Jadi mari kita pergi ke server MySQL kita dan melihat apa yang terjadi dengan tabel di database flyway_demo_db: $ USE flyway_demo_db; $TAMPILKAN TABEL; "Proyek Java dari A hingga Z": SpringBoot + Flyway - 19Seperti yang saya harapkan, migrasi terjadi, di mana tabel negara dibuat dan tabel flyway_schema_history muncul, yang menyimpan informasi tentang migrasi. Mari kita melangkah lebih jauh dan melihat catatan apa saja yang ada (dan apakah ada). $PILIH * DARI flyway_schema_history; "Proyek Java dari A hingga Z": SpringBoot + Flyway - 20Ini rekamannya, satu-satunya. Ini berisi banyak data menarik. Versi, deskripsi migrasi, jenis SQL apa (dan mungkin juga XML), nama skrip itu sendiri, checksum ( ini seperti kode hash, yang digunakan untuk memeriksa apakah migrasi telah berubah atau tidak. Ini selesai jika kami melakukan migrasi di database dan kemudian diperbaiki: ini tidak dapat dilakukan, semua perubahan hanya dilakukan melalui migrasi baru dan untuk mencegah hal ini terjadi, jumlah cek memantau ini) , nama sql pengguna, proses migrasi tanggal, waktu pelaksanaan dan hasil (berhasil atau tidak berhasil). Migrasi yang ditulis satu kali tidak boleh diubah di masa mendatang. Walaupun ada cacat di dalamnya. Semua perubahan hanya terjadi melalui migrasi baru. Ini sangat penting. Untuk menunjukkan apa yang akan terjadi, mari kita ubah sedikit skrip kita dan coba jalankan kembali. Mari kita tambahkan satu entri ke tabel negara dalam migrasi kita: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 21dan jalankan metode utama dan inilah yang kita dapatkan: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 22Seperti yang saya harapkan, jalur terbang mengenali bahwa skrip telah diubah dan tidak melakukan migrasi. Dalam beberapa kasus, migrasi yang diperbarui mungkin perlu dijalankan, dan agar jalur terbang dapat melewatinya, Anda perlu menghapus entri dalam tabel flyway_schema_history dan kemudian menjalankan migrasi yang diperbarui. Ini bukan perilaku normal dan tidak seharusnya terjadi, tetapi Anda juga perlu mengetahui metode penyelesaian masalah ini. Kami menangani migrasi pertama. Sekarang saya ingin menambahkan migrasi lain, dengan data tentang negara, seperti di artikel tentang database: file V00002__Add_test_data_to_country.sql"Proyek Java dari A hingga Z": SpringBoot + Flyway - 23 Dan mari kita jalankan lagi metode utama: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 24Dari log jelas bahwa sebelum migrasi dimulai, database sudah di versi 00001, jadi semua migrasi setelah versi ini. Selanjutnya versi 00002 diluncurkan dan berhasil. Mari kita periksa, atau Anda sudah percaya bahwa tiga catatan di suatu negara sudah ada di database?)) Saya akan memeriksanya, jadi buktinya: "Proyek Java dari A hingga Z": SpringBoot + Flyway - 25Kira-kira seperti ini. Jika Anda menjalankan proyek lagi, flyway akan melewatkan peluncuran migrasi, karena database sepenuhnya sesuai dengan versi yang diperlukan.

Kesimpulan

Kali ini kita mempelajari cara memahami dan menggunakan alat migrasi database bersama dengan SpringBoot. Informasi ini diperlukan untuk memahami apa itu alat kontrol versi database, dengan menggunakan Flyway sebagai contoh. Teman-teman, kode sumber proyek yang saya tunjukkan dipublikasikan di organisasi kami di Github . Jika Anda menyukai contohnya, beri bintang , dan saya akan memahami bahwa pekerjaan saya bermanfaat dan sangat layak untuk dilanjutkan. Secara tradisional, saya menyarankan untuk berlangganan akun Github saya . Melalui dia saya melakukan semua pekerjaan saya pada open source dan semua proyek demo yang selalu menyertai artikel saya. Terima kasih semuanya telah membaca. Lain kali kita akan menulis lamaran kita. Akan ada beberapa teori yang diperlukan tentang Docker di masa depan, tetapi kami akan melemahkannya dengan praktik.

tautan yang bermanfaat

Saat ini tidak banyak tautan yang berguna. Perhatikan video Evgeniy, worth it banget!
  1. Situs web untuk membuat proyek di Spring
  2. Evgeniy Borisov - Pembangun musim semi
  3. Dokumentasi di Musim Semi untuk Jalur Terbang

Daftar semua materi dalam seri ini ada di awal artikel ini.

Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION