JavaRush /Blog Java /Random-ES /SpringBoot + Flyway: "Proyecto Java de la A a la Z"

SpringBoot + Flyway: "Proyecto Java de la A a la Z"

Publicado en el grupo Random-ES
Un artículo de una serie sobre la creación de un proyecto Java (los enlaces a otros materiales se encuentran al final). Su objetivo es analizar tecnologías clave y el resultado es escribir un bot de Telegram. En esta parte, intentamos iniciar SpringBoot y Flyway. La cantidad mínima de teoría, como quieras))) Omitimos la comparación final de Flyway/Liquibase por un período de tiempo indefinido y vamos al grano. Y aun así ya se ha prolongado. Para no describir Flyway dos veces, decidí agregarlo inmediatamente a nuestro futuro proyecto JRTB."Proyecto Java de la A a la Z": SpringBoot + Flyway - 1

¿Qué necesitamos hacer como parte de esto?

  1. Inicie una aplicación SpringBoot basada en Maven.
  2. Agregue Flyway allí: afortunadamente, se integran fácilmente.
  3. Agregue un esquema para las tablas que tenemos en la base de datos de ejemplo.
De esta manera aprenderemos a trabajar con Flyway. ¿Por qué un proyecto separado y no directamente en nuestra JRTB? Porque más adelante quien quiera entender cómo hacer esto tendrá un proyecto con un ejemplo y un artículo que describe cómo trabajar con él. ¡Bueno, vamos!

¿Qué es la ruta migratoria?

Para utilizar algo, primero hay que averiguar qué es y por qué. Flyway es una herramienta de control de versiones de bases de datos. Las palabras son bien conocidas, pero de alguna manera no se ha agregado la comprensión, ¿verdad? Intentemos describir el problema que resuelve la ruta migratoria. Digamos que tenemos un proyecto. Como todo en nuestro mundo, no es perfecto, por lo que no fue posible planificar y elaborar la versión final del proyecto. Cada vez aparecen ciertos matices no contabilizados. El proyecto utiliza una base de datos en su trabajo. Por supuesto, si el proyecto cambia, la estructura de la base de datos también puede cambiar. Digamos que agregamos un nuevo campo para una de las entidades de nuestro proyecto. ¿Cómo hacerlo?
  1. Agregue este campo a nuestra entidad, actualice todo para que funcione la lógica de negocios.
  2. Actualizar la base de datos. La única forma posible es hacerlo manualmente. Para hacer esto, debe ingresar y registrar el script SQL necesario.
El segundo punto plantea muchas preguntas:
  1. Pero si tenemos más de un lugar donde desplegar nuestro proyecto, ¿es necesario hacerlo en cada uno de ellos?
  2. y si queremos volver atrás, ¿cómo sabemos exactamente en qué estado se encuentra ahora la estructura de la base de datos?
  3. ¿Cómo estaremos seguros de que el cambio de base de datos fue exitoso?
  4. ¿Cómo puedo tener la oportunidad de realizar un seguimiento de todos los cambios en la base de datos que tuvieron lugar en el proyecto?
Si lo haces manualmente, las respuestas no serán las mejores... Para evitar todas estas dificultades, puedes utilizar una herramienta de migración de bases de datos. Uno de ellos es Flyway. ¿Cuál es su trabajo? Como parte del proyecto, almacenamos archivos SQL separados (las llamadas migraciones), que almacenan todo lo que hacemos con la base de datos al mismo tiempo. Todas las migraciones ocurren estrictamente en un orden determinado, lo que le permite rastrear los cambios en la estructura y los datos de la base de datos (a menudo, al usar la migración, los datos de prueba se agregan al proyecto para que cuando se implemente en algún servidor, ya tenga algunos valores con los que se puede probar el proyecto). Una vez pasadas las pruebas, se lanzan las migraciones cuando se construye el proyecto. Se conectan a la base de datos y realizan migraciones. Si ya se han realizado migraciones en esta base de datos, entonces flyway simplemente las omitirá (almacena datos sobre las migraciones y su estado en una tabla separada en la base de datos, lo que ayuda a administrarlas), y si alguna migración no tuvo éxito, entonces el proyecto La compilación y su montaje (implementación) en el servidor se detendrán. Intenté describirlo con el mayor detalle posible. Si aún no todo está del todo claro, no importa: con la práctica se llegará a la comprensión.

Inicie SpringBoot + Flyway

¿Qué es la bota de primavera?

¿Qué estamos lanzando?... Para comprender qué y por qué estamos haciendo, debe decidir qué es SpringBoot. Primero, hablemos rápidamente (bueno, muy rápidamente) sobre Spring . Por el momento, es el estándar industrial de facto en el desarrollo de aplicaciones de servidor en Java. ¿Estándar de qué? ¿Cómo puedo explicarte esto? Spring es el esqueleto de la aplicación, sobre el que luego arrojamos la "carne": nuestra lógica empresarial. Con la ayuda de Spring (en adelante usaré este papel de calco para no perder el tiempo cambiando de idioma :D)) Spring nos da un punto de partida desde el cual empezamos a hacer todo. Es multifacético, multimodular:
  1. ¿Quieres trabajar con una base de datos? ¿Quieres relacional? ¿Quieres no relacional? Aquí estamos con Spring Data.
  2. ¿Quieres trabajar con solicitudes http? Aquí tienes, Spring web (Spring MVC).
  3. ¿Necesitas un contenedor para todos tus objetos en un solo lugar? Aquí está Spring Core.
  4. ¿Necesita configurar la seguridad en un proyecto para que haya diferentes roles y cadena de mando? Seguridad de primavera.
  5. Justo cuando pensaba que sería bueno tener algo así, resulta que Spring ya tiene lo que necesita y se integra rápida y fácilmente.
Por lo tanto, podemos decir que esto no es solo un marco (una biblioteca tan grande), sino todo un ecosistema que se está desarrollando a un ritmo vertiginoso. Para comprender qué es Spring Core, es decir, la base a la que se conectan los módulos, le aconsejo que vea una demostración en vivo sobre cómo crear su propio marco. Está alojado por Evgeny Borisov, un tipo genial en el campo de Java y Spring. Haz todo lo que él hizo y la obra de la primavera te resultará más clara. SpringBoot, a su vez, es la cima de todo lo que tienen. La magia del agua pura. Configuraciones mínimas para realizar el primer lanzamiento de la aplicación. Por supuesto, esto no le permitirá comprender cómo usarlo y qué hacer. Pero antes de precipitarse hacia las profundidades del desarrollo, es necesario mirar todo a vista de pájaro.

Lanzando SpringBoot

Como ya entendimos qué es Maven, creemos un nuevo proyecto para nuestras necesidades. Para ello, sólo necesitas acceder a un sitio web especialmente creado para este asunto. Se llama Spring Initializr . "Proyecto Java de la A a la Z": SpringBoot + Flyway - 2Aquí debes completar y seleccionar lo que necesitas:
  1. La herramienta de construcción del proyecto es gradle o maven. Como puede ver, Ant ya ni siquiera se menciona. Esta es una buena pista sobre qué herramientas de compilación merecen la pena.
  2. El lenguaje en el que puedes escribir es java, kotlin, groovy. Aquí todo es simple: todos son similares a JVM y ejecutan fácilmente código Java. Por cierto, vale la pena mirar Kotlin. Francamente, Groovy se ha vuelto poco interesante (hubo un momento en que cambiaron a grooves, pero pasó rápidamente).
  3. Versión Spring... Aquí debe comprender que las versiones de la parte principal de Spring y sus módulos son consistentes.
  4. Datos del proyecto. Ya he descrito estas cosas.
  5. Elegimos qué archivo se recopilará: Jar o War.
  6. Bueno, la versión Java de nuestra favorita. Y recientemente ha habido muchas de estas versiones... Esperaron años, y ahora hay dos por año.
En nuestro caso, publicaremos este proyecto en la organización JavaRush Community , por lo que la información sobre el proyecto será adecuada:
  1. Maven: no en vano te hablamos de esto antes.
  2. Java es nuestro favorito :D
  3. Tomemos la versión 2.2.11. ¿Por qué no el más nuevo? Porque cuanto más nuevo sea, mayores serán las posibilidades de que haya algunos errores allí. Para nosotros no importa qué versión, pero la más antigua será más fiable. Por lo tanto, elegimos 2.2.11.
  4. Grupo: com.github.javarushcommunity
  5. Artefacto: springboot-flyway-demo
  6. Nombre: Demostración de SpringBoot + Flyway
  7. Descripción: El proyecto demuestra la integración entre SpringBoot y Flyway . (Sí, la capacidad de escribir documentación es una parte importante del desarrollo :))
  8. Nombre del paquete: com.github.javarushcommunity.springbootflywaydemo . Aquí nos crearán inmediatamente un paquete básico con una clase que iniciará nuestra aplicación.
  9. Embalaje: Tarro
  10. Java: 8. No nos adelantemos a la locomotora y tomemos el viejo ocho. ¿Por qué no 11? ¿Para qué? Para nuestro ejemplo, no veo el sentido.
"Proyecto Java de la A a la Z": SpringBoot + Flyway - 3Ahora agreguemos los módulos. Necesitamos encontrar la integración con Flyway. También puede agregar algo relacionado con MySQL y Spring Data. Agreguemos otro lombok (esto es algo muy necesario, créame por ahora :D)) Para hacer esto, haga clic en AGREGAR DEPENDENCIAS ... y seleccione todo lo que necesita: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 4Así es como agregamos Flyway. "Proyecto Java de la A a la Z": SpringBoot + Flyway - 5Lombok... Y así sucesivamente. Como resultado, obtenemos: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 6Eh... completamos todo)) Ahora haga clic en GENERAR... y eso es todo: el archivo con el proyecto generado está listo :) También hay algo tan interesante como COMPARTIR... , que le proporciona un enlace a la página que acaba de completar. Es decir, aquí está el que generé . E incluso si algo sale mal, siempre puedes comprobarlo mediante el enlace. A continuación, debemos vincular el proyecto creado al repositorio de Git, por lo que clonamos el proyecto springboot-flyway-demo creado y lo descargamos a través de IDEA. Para hacer esto, debe abrir la idea y seleccionar Archivo -> Nuevo -> Proyecto de fuentes existentes... : "Proyecto Java de la A a la Z": SpringBoot + Flyway - 7ahora agregue la URL y haga clic en Clonar . El siguiente paso es transferir las partes internas del proyecto generado dentro del que clonamos. ¿Confundido? Te lo mostraré ahora. Lo descomprimí y recibí el siguiente conjunto de archivos: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 8Estos deben transferirse al proyecto clonado. Como en el artículo anterior, agreguemos pom.xml como proyecto maven: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 9ahora nos interesa ver lo que se generó para nosotros. Si abre todas las carpetas en src y más, verá la jerarquía habitual en los proyectos Maven, que discutimos en el artículo anterior . Para aquellos que no lo han leído, ¡léanlo! "Proyecto Java de la A a la Z": SpringBoot + Flyway - 10Se puede ver que tenemos una clase de Aplicación y nuestra aplicación SpringBoot se iniciará usándola. Gracias al complemento Maven para SpringBoot, ahora tenemos la tarea que necesitamos para Maven, a saber, spring-boot:run. ¿Dónde podemos encontrar esta información? A la derecha, abriendo la placa de Maven y nuestro proyecto: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 11Habrá un error y no podremos leerlo, veremos algo como esto: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 12Para obtener más información, para mayor velocidad podemos ejecutar el método principal. de la clase Aplicación: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 13Y luego veremos la verdadera razón: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 14Aquí ya hay más información y puedes hacer algo con ella. ¿Qué ocurre? Tenemos dependencias asociadas con la base de datos y, por lo tanto, debemos proporcionar configuraciones para conectarnos a ella. Para hacer esto, buscamos en Google y encontramos que necesitamos agregar las siguientes configuraciones a 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
Ejecutamos el método principal nuevamente y obtenemos: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 15Ahora necesitamos agregar al menos una migración. Para crear correctamente una migración, necesita tomar la siguiente plantilla: V<VERSIÓN>__<NOMBRE>.sql Usando esta plantilla, crearemos un archivo de migración llamado V00001__Create_country_table.sql en la carpeta apropiada: /src/main/resources/ db.migración/ . Creemos una tabla de países en ella. Tomemos el script del segundo artículo sobre la base de datos . "Proyecto Java de la A a la Z": SpringBoot + Flyway - 16Antes de comenzar, entremos y creemos una base de datos para trabajar: flyway_demo_db. Hagamos esto a través de MysqlWorkbench: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 17Ahora podemos ejecutar el método principal nuevamente: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 18Todo funcionó, pero como aún no tenemos nada en el proyecto, terminó de funcionar. Sin embargo, de los registros se desprende claramente ( lea qué son los registros ) que:
  1. Conectado exitosamente a la base de datos.
  2. La migración ha sido validada y todo está bien.
  3. Flyway ha creado una mesa para gestionar las migraciones.
  4. Y lo que comenzó la migración 00001: la creación del país fue un éxito.
Para comprobar esto, puede ir y ver qué se está haciendo en la base de datos. Así que vayamos a nuestro servidor MySQL y veamos qué está pasando con las tablas en la base de datos flyway_demo_db: $ USE flyway_demo_db; $MOSTRAR MESAS; "Proyecto Java de la A a la Z": SpringBoot + Flyway - 19Como esperaba, se produjo una migración, durante la cual se creó la tabla de países y apareció la tabla flyway_schema_history, que almacena información sobre las migraciones. Vayamos más allá y veamos qué registros hay (y si hay alguno). $SELECCIONAR * FROM flyway_schema_history; "Proyecto Java de la A a la Z": SpringBoot + Flyway - 20Aquí está la grabación, la única. Contiene muchos datos interesantes. Versión, descripción de la migración, qué tipo de SQL (y tal vez también XML), el nombre del script en sí, suma de comprobación ( esto es algo así como un código hash, que se utiliza para comprobar si la migración ha cambiado o no. Esto se hace en caso de que realizamos una migración en la base de datos y luego se corrigió: esto no se puede hacer, todos los cambios se realizan solo a través de una nueva migración y para evitar que esto suceda, el monto del cheque monitorea esto), nombre de usuario sql, procesamiento de migración fecha, hora de ejecución y resultado (exitoso o no). Una migración escrita una vez no debe modificarse en el futuro. Incluso si tiene algún defecto. Todos los cambios se producen únicamente a través de una nueva migración. Es muy importante. Para mostrar lo que sucederá, cambiemos un poco nuestro script e intentemos ejecutarlo nuevamente. Agreguemos una entrada a la tabla de países en nuestra migración: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 21ejecutemos el método principal y esto es lo que obtenemos: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 22Como esperaba, flyway reconoció que el script había sido cambiado y no realizó la migración. En algunos casos, puede que sea necesario ejecutar una migración actualizada y, para que Flyway omita esto, debe eliminar la entrada en la tabla flyway_schema_history y luego ejecutar la migración actualizada. Este no es un comportamiento normal y no debería serlo, pero también necesita conocer este método para resolver el problema. Nos ocupamos de la primera migración. Ahora me gustaría agregar otra migración, con datos sobre países, como estaba en el artículo sobre la base de datos: archivo V00002__Add_test_data_to_country.sql"Proyecto Java de la A a la Z": SpringBoot + Flyway - 23 Y ejecutemos el método principal nuevamente: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 24De los registros queda claro que antes de que comenzara la migración, la base de datos estaba en la versión 00001, por lo que todas las migraciones posteriores a esta versión. A continuación, se lanzó la versión 00002 y fue exitosa. Comprobemos, ¿o ya me creen que ya habrá tres registros en el país en la base de datos?)) Lo comprobaría, así que prueba: "Proyecto Java de la A a la Z": SpringBoot + Flyway - 25algo como esto. Si ejecuta el proyecto nuevamente, flyway simplemente omitirá la implementación de migraciones, ya que la base de datos cumple completamente con la versión requerida.

Conclusión

Esta vez aprendimos cómo comprender y utilizar una herramienta de migración de bases de datos junto con SpringBoot. Esta información es necesaria para comprender qué es una herramienta de control de versiones de una base de datos, usando Flyway como ejemplo. Amigos, el código fuente del proyecto que les mostré está publicado en nuestra organización en Github . Si te gusta el ejemplo, dale una estrella y entenderé que mi trabajo es útil y que realmente vale la pena continuar. Tradicionalmente, sugiero suscribirme a mi cuenta de Github . A través de él realizo todo mi trabajo sobre código abierto y todos esos proyectos de demostración que invariablemente acompañan a mis artículos. Gracias a todos por leer. La próxima vez escribiremos nuestra solicitud. Habrá alguna teoría necesaria sobre Docker en el futuro, pero la diluiremos en gran medida con la práctica.

Enlaces útiles

Hoy en día no hay muchos enlaces útiles. Prestad atención al vídeo de Evgeniy, ¡realmente merece la pena!
  1. Sitio web para crear proyectos en primavera.
  2. Evgeniy Borisov - Constructor de primavera
  3. Documentación en primavera para Flyway

Al principio de este artículo encontrará una lista de todos los materiales de la serie.

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