JavaRush /Java Blog /Random-ID /Kami menambahkan segala sesuatu yang berhubungan dengan d...

Kami menambahkan segala sesuatu yang berhubungan dengan database. (Bagian 1) - "Proyek Java dari A sampai Z"

Dipublikasikan di grup Random-ID
Selangkah demi selangkah kita bergerak menuju tujuan kita. "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 1Hari ini kita perlu menyelesaikan banyak tugas:
  1. Tambahkan Jalur Terbang. Di sini kita akan mengkonfigurasi penerapan database untuk proyek tersebut.
  2. Tambahkan skema database.
  3. Tambahkan lapisan repositori.
  4. Tambahkan perintah untuk statistik bot.
  5. Lagipula, tes tulis.
Jadi duduklah, duduklah, akan ada bacaan yang panjang. Kita telah mempelajari cara men-deploy aplikasi kita menggunakan docker dan docker-compose. Memang tidak mudah, dan selamat bagi yang berhasil melakukannya. Jika Anda memiliki pertanyaan tentang implementasinya, Anda dapat melihat kode di pull request ini .

Menambah Jalur Terbang

Untuk menambahkan Flyway, Anda harus memiliki database, yang akan kami tambahkan sebagai layanan lain di docker-compose. Terakhir kali saya mengatakan bahwa docker-compose memiliki bagian layanan, yang tepatnya bertanggung jawab untuk menambah dan mengelola infrastruktur tertentu - yaitu sekumpulan aplikasi/database/messenger, dll.
Saya sudah membicarakan tentang apa itu Flyway dan bagaimana cara menambahkannya ke aplikasi SpringBoot . Saya menyarankan Anda untuk menyegarkan ingatan Anda sebelum membaca artikel ini. Anda juga dapat membaca file proyek README.md dengan demonstrasi artikel tentang Flyway + SpringBoot.
Hal pertama yang kita lakukan adalah memperbarui cabang utama kita di proyek (git pull) dan membuat yang baru dengan nama tugas kita - STEP_5_JRTB-1 (git checkout -b STEP_5_JRTB-1). Izinkan saya mengingatkan Anda: kami mengganti nama cabang sehingga memungkinkan untuk mengurutkan urutan tugas dalam proyek hanya berdasarkan nama. Ini akan memungkinkan Anda berpindah dari satu langkah ke langkah lainnya dengan cepat. Sekarang Anda dapat bekerja dengan tenang. Kita perlu menambahkan tiga dependensi:
<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>
Ketergantungan pertama bertanggung jawab untuk menambahkan FlyWay ke proyek, yang kedua menambahkan kemampuan untuk terhubung ke database MySQL. Yang ketiga adalah SpringBoot starter, yang meluncurkan semua keajaiban penggunaan database di Spring. Dan mari kita tambahkan juga lombok agar tidak menulis getter dan setter:
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
Sekarang kita membutuhkan database untuk pengembangan. Kami akan membuatnya untuk saat ini ( sampai saya mendapatkan ide yang lebih baik ) sebagai file penulisan buruh pelabuhan terpisah dan file terpisah untuk properti aplikasi. Ada yang namanya pengembangan (dan khususnya ekosistem Musim Semi) sebagai profil. Tergantung pada profilnya, pengaturan berbeda diluncurkan untuk pengoperasian. Saya pikir di masa depan kita akan menggabungkan docker-compose menjadi satu file dan memastikan bahwa hanya satu database yang diluncurkan untuk pengembangan pada pengaturan yang kita perlukan. Untuk saat ini kami akan melakukan ini:
  1. Mari kita buat file di root proyek docker-compose-test.yml, di mana hanya database dengan pengaturannya sendiri yang akan diluncurkan.
  2. Mari kita buat file application-test.properties dengan pengaturan yang sesuai dengan pengaturan di file docker-compose-test.yml.
Untuk bekerja dengan MySQL, saya mengambil gambar resmi dari DockerHub : "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 2Setelah menelusuri dengan cepat, saya menemukan variabel yang diperlukan: MYSQL_DATABASE - nama database MYSQL_USER - nama pengguna database MYSQL_PASSWORD - kata sandi pengguna database Dan cara penulisannya dengan benar:
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
Setelah itu, saya membuat docker-compose-test.yml di root proyek:
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
Untuk menjalankan file khusus ini agar berfungsi dengan docker-compose, Anda perlu menggunakan tanda -f di request . Artinya, nama file yang diluncurkan akan diberikan, bukan docker-compose.yml standar yang diambil. Oleh karena itu, permintaannya akan terlihat seperti ini: docker-compose -f docker-compose-test.yml up -d Ternyata pertama-tama kita ucapkan file mana yang akan diambil ( -f docker-compose-test.yml ), lalu kita katakanlah kita perlu meningkatkan layanan dan melakukan ini dalam mode daemon ( up -d ) - yaitu, agar proses berjalan di luar sesi terminal tempat perintah ini diluncurkan. Kami meluncurkan dan mencoba menyambung ke database untuk memastikan database sudah aktif dan dapat digunakan. Untuk melakukan ini, buka MySQL Workbench yang familiar ( kita sudah membicarakannya di sini ) dan buat koneksi baru: "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 3Kita perlu mengisi kolom berikut:
  • Nama koneksi - nama koneksi - opsional, DEV_JRTB_DB;
  • Nama host - ini adalah alamat tempat database disebarkan. Dalam kasus kami, semuanya akan tetap seperti semula: 127.0.0.1 , atau localhost;
  • nama pengguna - ini akan menjadi root, seperti yang telah kami tulis di docker-compose;
  • kata sandi - juga root.
Setelah ini, Anda perlu memeriksa apakah ada koneksi. Untuk melakukannya, klik Uji Koneksi : "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 4Hasilnya, kita mendapatkan: Gagal Terhubung ke MySQL... Mengapa? Kami pergi ke terminal dan melihat apa yang terjadi pada container buruh pelabuhan. Mari kita tulis di terminal: "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 5Kita melihat terminal dibuat 59 menit yang lalu, dan restart adalah 55 detik... mengapa? Tidak jelas, Anda perlu melihat lognya. Buka root proyek di terminal dan jalankan perintah berikut: docker-compose -f docker-compose-test.yml logs
Kita mendapatkan:

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

Sekarang jelas bahwa database tidak pernah dimulai dengan pengaturan kami. Kesalahannya sama, jadi mari kita pisahkan dari sheet:
28-02-2021 11:03:37+00:00 [ERROR] [Titik Masuk]: Basis data tidak diinisialisasi dan opsi kata sandi tidak ditentukan dev-jrtb-db | Anda perlu menentukan salah satu dari MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD dan MYSQL_RANDOM_ROOT_PASSWORD
Artinya, dia perlu menentukan kata sandi untuk pengguna root – pengguna utama. Oke, sekarang kami akan memperbarui file kami:
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
Kami menghapus variabel tersebut untuk pengguna dan kata sandi dan hanya menambahkan kata sandi untuk pengguna root. Ini berarti pengguna root sekarang akan memiliki kata sandi root. Setidaknya itulah yang kami asumsikan. Sekarang mari kita jalankan dan lihat apa yang terjadi: docker-compose -f docker-compose-test.yml up -d Dan segera lihat apa yang dikatakan log kepada kita: docker-compose -f docker-compose-test.yml logs
Mari lihat:

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.

Sepertinya tidak ada kesalahan lagi, jadi Anda bisa melihat apakah akan ada akses. Tapi sayangnya, tidak ada akses lagi... Tidak ada: kami akan mencari tahu lebih lanjut! "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 6Untuk menghentikan docker-compose dan menghapus semua container, Anda perlu menulis: docker-compose -f docker-compose-test.yml down Di sini kami menentukan file yang akan dihapus. Apa yang harus dilakukan? Mari kita cari di Google: mungkin seseorang telah melakukannya dengan lebih baik. Kueri paling sederhana: “contoh mysql di docker-compose” membantu kita menemukan tautan ke sumber daya medium. Mereka memberikan contoh ini:
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:
Kami menyesuaikannya dengan kebutuhan kami dan mendapatkan:
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'
Kami meluncurkan opsi ini dengan perintah yang sudah kami ketahui: docker-compose -f docker-compose-test.yml up -d Kami mencoba lagi mengakses database melalui MySQLWorkBench: "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 7Akhirnya, akses telah muncul. Tapi sekarang saya bertanya-tanya apa yang mempengaruhi hal ini. Saya berdosa di bagian ini:
expose:
   # Opens port 3306 on the container
   - '3306'
Sangat mudah untuk memeriksanya: tanpa ini, tidak ada yang akan berhasil :D. Mari kita periksa: hapus bagian ini, mulai ulang docker-compose: docker-compose -f docker-compose-test.yml down docker-compose -f docker-compose-test.yml up Kami mencoba masuk ke database melalui meja kerja: semuanya Bagus. Maka satu-satunya pilihan adalah versi database. Jelas tertulis 5.7, artinya kalau diubah ke yang terbaru seharusnya tidak berfungsi. Saya memulai ulang - dan ternyata tidak berhasil... "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 8Tampaknya, mereka memiliki beberapa masalah dengan image buruh pelabuhan di versi terbaru. Oke tidak masalah. Hal ini sering terjadi pada perangkat lunak bebas. Kami akan menggunakan versi 5.7. Mari kita lihat apakah ada database yang kita butuhkan - dev_jrtb_db. Untuk melakukan ini, jalankan perintah Query di MySQL Workbench SHOW DATABASES : "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 9Ya, ada di output. Bagus, kita bisa melanjutkan. Selanjutnya, mari tambahkan migrasi pertama kita. Berdasarkan tugas dari artikel “Perencanaan proyek: ukur dua kali, potong sekali”, kita akan membuat tabel pertama kita tg_user. Semua migrasi akan ditempatkan di folder projectDir/src/main/resources/db/migration , dan namanya adalah: V00001__add_tg_user_table.sql . Mengapa ada nama seperti itu di folder itu - saya menjelaskannya di artikel tentang Spring + flyway. Ini adalah tampilan migrasi pertama kita: 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
);
Artinya, di sini kita cukup membuat tabel pengguna yang hanya memiliki ID obrolan (elemen unik yang dapat digunakan sebagai ID dalam tabel) dan statusnya - aktif atau tidak aktif. Jadi, jika bot tersebut dihentikan maka informasi berlangganan akan tetap ada dan dapat digunakan jika ingin menggunakan bot tersebut kembali. Tidak ada informasi lain tentang pengguna yang diperlukan untuk saat ini. Sekarang pertanyaan utamanya: bagaimana cara memeriksanya? Kita perlu meluncurkan aplikasi kita. Sejauh ini, file utama docker-compose.yml tidak memiliki koneksi dengan database, dan kita juga perlu mempelajari cara men-debug aplikasi bersama dengan database. Oleh karena itu, mari luncurkan aplikasi dengan Intellij IDEA. Untuk mengujinya kita perlu menjalankan metode utama kita di JavarushTelegramBotApplication. Untuk memisahkan pekerjaan penerapan dan pengujian, kami akan menggunakan file lain dengan properti - application-test.properties . Dengan templat ini kami memberi tahu Spring bahwa file ini akan digunakan untuk profil pengujian . Ketika kami tidak menentukan profil, profil default digunakan (periksa ini di log Anda saat menjalankan SpringBoot: ini akan ditulis di baris pertama). Ini akan terlihat seperti ini:
# 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
Dan application.properties utama akan terlihat sedikit berbeda:
# 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
Perbedaan signifikan ada di bidang spring.datasource.url: di profil pengujian kami memiliki URL di localhost . Artinya, aplikasi diharapkan berjalan di luar Docker, yang memang benar, karena saat debugging kita akan menjalankan proyek kita di Intellij IDEA dan berharap kita akan memiliki akses ke database dari mesin lokal. Namun URL application.properties sudah berisi URL lain - jrtb-db . Ini akan menjadi nama database kita di docker-compose, dan dengan cara ini aplikasi buruh pelabuhan kita akan dapat menjangkau database tersebut. Mengapa? Oleh karena itu, mereka akan diluncurkan dalam komposisi buruh pelabuhan yang sama dan akan mengetahui satu sama lain dengan cara ini. Hal ini diperlukan agar kami memiliki satu infrastruktur tertutup untuk proyek tersebut. Tapi bagaimana cara meluncurkan profil saat startup? Untuk melakukan ini, Anda dapat mengonfigurasi peluncuran metode utama di Intellij IDEA. Untuk ini, ada Edit Konfigurasi : buka kelas utama JavarushTelegramBotApplication, klik panah hijau di sebelah deklarasi metode utama dan pilih Modify Run Configuration : "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 10Masukkan variabel yang diperlukan dan konfigurasikan profil. Di Intellij IDEA, antarmuka jendela konfigurasi ini sedikit berubah, jadi saya menyarankan semua orang untuk memperbarui IDEA ke versi terbaru sehingga kita melihat gambar yang sama: "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 11Di bidang Variabel lingkungan , kita perlu menambahkan nama bot dan variabel token menggunakan templat berikut: nama_variabel1=nilai1; nama_variabel2=nilai2 . Artinya, key=value dipisahkan dengan titik koma. Dalam kasus kami akan seperti ini: bot.token=1375780501:AAHLzsf4WhcjSdPguDwtggRS1IMu5l8;bot.username=javarush_community_bot (Anda akan memiliki nama dan token yang berbeda untuk bot) Selanjutnya, pilih bidang Tambahkan opsi VM di tombol Opsi modifikasi : Tulis : -Dspring.profiles.active =test - ini akan memberitahu SpringBoot untuk menggunakan profil pengujian, yang berarti properti akan diambil dari application-test.properties. Hasilnya akan terlihat seperti ini: Sekarang kita meluncurkan database pengujian kami: docker-compose -f docker-compose-test.yml up Dan persis seperti ini, tanpa awalan -d, sehingga log dapat langsung dilihat di terminal, jika diperlukan. Dan langkah terakhir cukup jalankan metode utama. Jika Anda melakukan semuanya dengan cara yang sama seperti yang saya jelaskan, Anda akan mendapatkan: Baris kedua dari log akan menjadi deskripsi tentang apa yang diperoleh profil pengujian. Kami membuka MySQLWorkbench dan menjalankan dua perintah untuk memeriksa apakah migrasi telah diluncurkan dan semuanya berfungsi (walaupun ini terlihat dari log peluncuran aplikasi, ini layak untuk diperiksa):"Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 12"Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 13"Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 14
  1. gunakan dev_jrtb_db;
  2. tampilkan tabel;
Hasil: "Proyek Java dari A sampai Z": Menambahkan segala sesuatu yang berhubungan dengan database.  Bagian 1 - 15Seperti yang kami harapkan, kami mendapat dua tabel. Yang pertama adalah teknis untuk memperhitungkan migrasi, yang kedua adalah tabel kami untuk pengguna Telegram. Semua: Jalur Terbang beserta database telah ditambahkan. Sekarang migrasi baru akan berjalan lancar. Hal tersulit adalah pengaturan pertama dan peluncuran prosesnya. Sebagai kelanjutannya , kami menyelesaikan pekerjaan pada tugas global ini: menambahkan database ke docker-compose.yml, menambahkan lapisan Repositori, statistik untuk bot, menulis dan memperbarui pengujian dan dokumentasi.

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