· Jose Antonio López  · 5 min lectura

Configurar un proyecto Spring Boot para desarrollo

Cómo configurar un proyecto de Spring Boot con docker-compose, PostgreSQL y las Developer tools de Spring Boot.

Cómo configurar un proyecto de Spring Boot con docker-compose, PostgreSQL y las Developer tools de Spring Boot.

Objetivo

Explicar cómo se configura un proyecto de Spring Boot 3.3.5 que usa docker-compose, PostgreSQL y las Developer tools de Spring Boot.

¿Porque escribo este artículo?

Muchas veces la información está dispersa y no está en un solo lugar. Además, la información puede estar desactualizada o que sea tan rebuscada que hace que no apliques mejoras.

Mi experiencia me dice que en el caso de Spring toda la información está ahí pero no está en un solo lugar. Además muchas veces tampoco se entiende qué dicen.

Este artículo es una guía para tener toda la información en un solo lugar y que puedas configurar tu proyecto de Spring Boot en un entorno de desarrollo.

Prerequisitos

Para seguir este artículo necesitas tener instalado:

RequisitoEnlace de descarga
JavaDescargar Java
MavenDescargar Maven
Docker DesktopDescargar Docker Desktop
IntelliJ IDEA CommunityDescargar IntelliJ IDEA Community

DotEnv

Propósito

Usar un archivo .env sirve para desacoplar la configuración de la aplicación. Se usa para tener datos que dependen del entorno donde se ejecuta la aplicación. Todo esto es sensible a cambios y no debe estar en el código fuente.

Puedes tener tantos archivos como entornos tengas:

  • .env para desarrollo
  • .env.test para pruebas
  • .env.staging para preproducción
  • .env.prod para producción

Si desplegas en un entorno de producción, debes tener en cuenta que las variables de entorno deben estar en el servidor ya sea in-house o en la nube.

Los nombres de los ficheros son arbitrarios y es decisión del equipo de desarrollo decidir cómo se llaman. Tampoco os paséis mucho tiempo debatiendo. Lo importante es que se entienda.

Configuración

Crea un archivo .env en la raíz del proyecto. El archivo contiene las variables de entorno que se usarán en el proyecto.

APPLICATION_NAME=crm

POSTGRES_DB=crm
POSTGRES_USER=postgres
POSTGRES_PASSWORD=password
POSTGRES_HOST=db
POSTGRES_PORT=5432

SPRING_DATASOURCE_URL=jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
SPRING_DATASOURCE_USERNAME=${POSTGRES_USER}
SPRING_DATASOURCE_PASSWORD=${POSTGRES_PASSWORD}
SPRING_PORT=8080

Información adicional

Cuando te encuentras una sintaxis tipo ${POSTGRES_USER} es porque se está referenciando a una variable. En este caso, se hace referencia a la variable POSTGRES_USER. El nombre técnico para esta sintaxis se llama interpolación.

Docker Compose

Propósito

Docker Compose es una herramienta que permite definir y ejecutar aplicaciones Docker con más de 1 contenedor. En vez de usar docker run para cada contenedor y pasar un montón de parámetros, se define un archivo docker-compose.yml y se ejecuta docker-compose up.

Configuración

Añade la siguiente dependencia:

pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-docker-compose</artifactId>
	<scope>runtime</scope>
	<optional>true</optional>
</dependency>

Crea un archivo compose.yaml en la raíz del proyecto. El archivo contendrá las variables de entorno que se usarán en el proyecto. Las variables de entorno se referencian con la sintaxis ${VARIABLE}.

Es la misma estrategia y sintaxis que en el archivo .env.

compose.yaml
services:
  app:
    build: .
    ports:
      - ${SPRING_PORT}:${SPRING_PORT}
    container_name: crm-app
    networks:
      - crm-network
    depends_on:
      db:
        condition: service_healthy
    environment:
      SPRING_DATASOURCE_URL: ${SPRING_DATASOURCE_URL}
      SPRING_DATASOURCE_USERNAME: ${SPRING_DATASOURCE_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD}

  db:
    image: postgres:alpine
    ports:
      - ${POSTGRES_PORT}:${POSTGRES_PORT}
    container_name: postgres
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    networks:
      - crm-network
    healthcheck:
      test: ['CMD-SHELL', 'pg_isready -U postgres']
      interval: 5s
      timeout: 20s
      retries: 3

networks:
  crm-network:
    driver: bridge

Información adicional

Opciones del docker-compose.yml

  • services: Define los servicios que se ejecutarán. En este caso, se ejecutarán dos servicios: app y db.
  • networks: Define la red que se usará. En este caso, se usa la red crm-network.
  • depends_on: Define la dependencia entre los servicios. El servicio app esperará a que db este sano.
  • healthcheck: Se lanza un comando para ver si la base de datos está lista.
  • network: El tipo bridge viene por defecto y es el más común.

Si quieres saber más sobre tipos de drivers, puedes visitar la documentación oficial sobre drivers. Si quieres saber más sobre Docker Compose, puedes visitar la documentación oficial de Docker.

¿Cómo funciona?

Spring Boot tiene soporte para Docker Compose. Cuando detecta que hay un archivo docker-compose.yml en la raíz del proyecto, arranca los contenedores de Docker mediante el comando docker-compose up.

Si encuentra un contenedor que ya está en ejecución, Spring Boot no lo reinicia y pasa de largo.

Lo que yo suelo hacer es arrancar manualmente el conteneder de PostgreSQL desde IntelliJ y luego arranco la aplicación de Spring Boot también desde IntelliJ.

Para más información sobre el soporte de Docker Compose en Spring Boot, puedes visitar la documentación oficial de Spring Boot.

Developer Tools

Propósito

Cuando estás programando en local y haces cambios, tienes que parar la aplicación, ejecutar el comando mvn clean install y volver a arrancar la aplicación. Esto es un proceso repetitivo y lento.

Las Developer Tools de Spring Boot permiten que la aplicación se reinicie automáticamente cuando se detectan cambios en el código fuente.

Configuración

Añade la siguiente dependencia:

pom.xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<version>3.4.1</version>
	<scope>runtime</scope>
	<optional>true</optional>
</dependency>

Información adicional

Las Developer Tools no se deben cargar en producción. Solo se cargan en entornos de desarrollo. Por eso, la dependencia tiene el scope en runtime y optional.

¿Cómo funciona?

El restart de la aplicación de Spring Boot usa dos classloaders. Las clases que no cambian como las librerías de terceros se cargan en un classloader de clases base. Las clases que desarrollas se cargan en un cargador de clases restart.

Cuando la aplicación se reinicia, el cargador de clases restart se elimina y se crea uno nuevo. Los reinicios de la aplicación serán mucho más rápidos que los “arranques en frío”.

Si quieres saber más, puedes visitar la documentación oficial.

Configurar IntelliJ

Propósito

Configurar IntelliJ para que se ejecute la aplicación con Docker Compose y las Developer Tools. Si te funciona de forma rápida puedes prescindir de esta configuración. En mi caso, no me funcionó a la primera y tardaba casi 10 segundos en hacer el restart.

Configuración

Si deseas que el IDE guarde tus cambios y comience la compilación automáticamente con cualquier modificación debes ir a:

  • Settings | Appearance & Behavior | System Settings | Save files if the IDE is idle for —> Establecer el valor a 1 segundo

  • Settings | Build, Execution, Deployment | Compiler | Build project automatically —> Activar la casilla

  • Settings | Advanced Settings | Allow auto-make to start even if developed application is currently running —> Activar la casilla

  • Ir a Help | Find Action | Registry. Establecer el valor compiler.automake.postpone.when.idle.less.than=1000

Las fuentes usadas para este apartado son:

Hilo de Intellij

Siguientes pasos

Una vez configurado el entorno de desarrollo, el siguiente paso es elegir las librerías adecuadas para tu proyecto. Puedes consultar la guía de dependencias clave en Spring Boot para saber por dónde empezar.

  • Docker
  • Spring Boot
Compartir: