· Jose Antonio López  · 8 min lectura

Dependències Clau amb Spring Boot

Què necessites per al desenvolupament bàsic amb Spring Boot? Quines dependències pots utilitzar per a una prova tècnica?

Què necessites per al desenvolupament bàsic amb Spring Boot? Quines dependències pots utilitzar per a una prova tècnica?

Introducció

Explicació de les dependències essencials per desenvolupar amb Spring Boot 3.3.5 excloent les dependències de testing. També he inclòs algunes llibreries de la meva preferència que m’ajuden druant la meva feina diària.

Totes les dependències estan en format Maven, ja que considero que és més senzill d’entendre per a principiants i tinc més experiència amb Maven que amb Gradle.

Spring Web

Dependència

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Propòsit

Per a qualsevol aplicació web o API REST aquesta és la base. En arrencar l’aplicació el servidor web Tomcat s’aixeca. Permet escoltar i respondre peticions HTTP. Tradueix el que arriba de la petició HTTP i ho passa al programa Java que sap com gestionar-ho.

Explicació

En el passat configurar des de zero un servidor Tomcat podia portar molt de temps i mal de caps. Amb spring web tot ve ja per defecte perquè facis clic al “play” a l’IDE. Et permetrà utilitzar:

  • @RestController per gestionar peticions HTTP.
  • @RequestMapping per mapar una petició HTTP a un mètode.
  • @GetMapping per mapar una petició HTTP GET a un mètode.
  • @RequestBody per llegir el cos d’una petició HTTP.

Com funciona el flux d’informació?

@RestController és qui s’encarrega de gestionar la petició HTTP que ha arribat a través de Tomcat. Almenys, sap d’un @RequestMapping específic. Tot el que arribi en el seu @RequestMapping serà delegat a un mètode que sabrà què fer amb la petició.

Si arriba una petició GET a /customers/600d3f72-d96e-4e4f-ac35-1b814b357ddf el mètode getCustomer(UUID id) sabrà què fer amb la petició.

A sota tens un exemple de com es veuria un codi net:

import static com.test.crm.config.ApiConfig.API_BASE_PATH;

@RestController
@RequestMapping(API_BASE_PATH + "/customers")
public class CustomerController {
    private final CustomerService customerService;

    public CustomerController(CustomerService customerService) {
        this.customerService = customerService;
    }

    @GetMapping("/{id}")
    public CustomerDTO getCustomer(@PathVariable UUID id) {
        return customerService.getCustomer(id);
    }
}

Spring Security

Dependència

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Propòsit

Proporciona autenticació i autorització per a les aplicacions. És la dependència que et permetrà gestionar l’accés a l’aplicació.

Explicació

Per la naturalesa complicada de la seguretat, és la dependència que, en la meva opinió, més costa d’entendre. Comença amb basic authentication. Si tens una classe User, implementa la interfície UserDetails.

Per activar la seguretat, crea una classe i enganxa el següent codi amb debug. El debug et permetrà saber què passa. En el codi de producció, cal esborrar el debug.

@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig {
}

Finalment, segueix la guia oficial de Spring Boot per configurar la seguretat de la teva aplicació amb Basic Authentication.

Spring Data JPA

Dependència

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Propòsit

Facilita la integració amb bases de dades relacionals utilitzant JPA. Simplifica les operacions de base de dades amb repositoris i consultes. JPA permet que els desenvolupadors treballin amb objectes en lloc de treballar amb files, columnes i taules per separat.

Explicació

JPA és una especificació o contracte. Hibernate és un proveïdor que compleix amb el que JPA diu que cal complir. En utilitzar aquesta dependència ve configurat per defecte amb Hibernate.

Per activar-lo has de crear una classe amb almenys el següent codi:

@Configuration
@EnableJpaRepositories
public class JpaConfig {
}

JPA et permet utilitzar anotacions per mapar les teves classes a taules de base de dades. Per exemple, si tens una classe Customer, pots mapar-la a una taula de la següent manera:

@Entity
@Table(name = "customers")
public class Customer {
    @Id
    @UuidGenerator(style = UuidGenerator.Style.AUTO)
    private UUID id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String surname;

    @Column()
    private String image;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(
        name = "created_by",
        nullable = false,
        updatable = false
    )
    @CreatedBy
    private User createdBy;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(
        name = "last_updated_by",
        nullable = false
    )

    @LastModifiedBy
    private User lastUpdatedBy;
}

PostgreSQL

Dependència

<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <scope>runtime</scope>
</dependency>

Propòsit

Proporciona el controlador JDBC per connectar-se a bases de dades PostgreSQL. JDBC és un component dissenyat perquè qualsevol aplicació Java pugui parlar amb bases de dades. Hi ha controladors JDBC per a la majoria de les bases de dades i hi ha 4 tipus de controladors JDBC. El més utilitzat és el tipus 4 o també anomenat JDBC pur.

Explicació

Per configurar la connexió a la base de dades, pots afegir les següents línies en el teu arxiu application.yaml:

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/testdb
    username: myuser
    password: mypassword

  jpa:
    hibernate:
      ddl-auto: create-drop
    show-sql: true
    defer-datasource-initialization: true
  sql:
    init:
      mode: always

Si vols visualitzar les dades de la base de dades et recomano que t’instal·lis el programa dbeaver en la seva versió d’escriptori. És un programa gratuït i open source que et permet visualitzar les dades de la base de dades.

Pots descarregar DBeaver des de la seva pàgina oficial.

H2

Dependència

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <scope>runtime</scope>
</dependency>

Propòsit

Proporciona una base de dades en memòria per a proves i desenvolupament ràpid. H2 és una base de dades lleugera i ràpida que s’executa en memòria, el que significa que no requereix configuració addicional ni instal·lació. És ideal per realitzar proves de concepte o desenvolupaments ràpids com poden ser proves tècniques senzilles.

A més, H2 ofereix una consola web que facilita la visualització i manipulació de dades durant el desenvolupament. T’evita haver d’instal·lar una base de dades en la teva màquina local.

Explicació

Per configurar la connexió a la base de dades, pots afegir les següents línies en el teu arxiu application.yaml:

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    username: sa
    password: password
  h2:
    console:
      enabled: true
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true

El que guanyes amb H2 és evitar-te conceptes de Docker o instal·lar una base de dades. Quan estàs aprenent o fent proves de concepte ràpides és genial.

Si tens més coneixements, opta per utilitzar PostgreSQL en lloc de H2 per a entorns de desenvolupament més realistes.

Validation

Dependència

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

Propòsit

Proporciona suport per a la validació de dades en aplicacions Spring Boot. Assegurar-se que les dades d’entrada són vàlides és imprescindible perquè permet filtrar de manera controlada les dades que el backend espera. Ningú vol un String quan espera un Integer o un Boolean.

Explicació

Si vas a la guia de validació de Spring Boot, veuràs que l’equip de Spring no et dóna molta informació. Et deixen anar el seu rotllo de JSR-303 implementation.

L’equip de Spring vol dir-te que per utilitzar validacions necessites algú que implementi JSR-303. Hibernate implementa aquesta especificació, així que estem de sort perquè recorda que ve per defecte en Spring Boot.

Per veure quines validacions existeixen, consulta la documentació de Hibernate Validator.

Per utilitzar les validacions, simplement afegeix les anotacions de Hibernate Validator a les teves classes. Per exemple, si tens una classe per crear un client pots afegir les següents anotacions:

public record CreateUserDTO(
    @NotBlank
    @Size(min = 3)
    @Pattern(regexp = "^[^0-9]*$") //Only letters accepted
    String username,
    @Email
    String email
) {
}

Contenidors amb Docker

Dependència

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

Propòsit

Facilita la creació i desplegament d’aplicacions en contenidors Docker. A l’arrel s’instal·la un fitxer anomenat compose.yaml

El fitxer compose.yaml conté la configuració bàsica per aixecar un contenidor Docker amb una base de dades. La màgia ve de l’autoconfiguració de Spring que detecta el compose.yaml, aixeca el contenidor, aixeca l’aplicació i la connecta a la base de dades.

Explicació

També pots trobar que s’utilitza un fitxer Dockerfile a l’arrel del tipus següent:

Fitxer Dockerfile:

FROM openjdk:17-jdk-slim
VOLUME /tmp
COPY target/*.jar example.jar
ENTRYPOINT ["java","-jar","/example.jar"]

Personalment avui dia prefereixo utilitzar el compose.yaml amb variables d’entorn i definir les variables en un fitxer .env.

DevTools

Dependència

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-devtools</artifactId>
  <scope>runtime</scope>
</dependency>

Propòsit

Millora l’experiència de desenvolupament proporcionant característiques com recàrrega automàtica i configuracions de desenvolupament.

Explicació

DevTools guarda en memòria cau i monitoritza els arxius. Si un arxiu es modifica i està en el classpath del projecte, l’aplicació es reinicia automàticament.

En el meu dia a dia les utilitzo diàriament encara que no me n’adoni. La raó és que per al desenvolupament en Java utilitzo IntelliJ IDEA. Em va molt bé per reiniciar l’aplicació quan desenvolupo o faig debug. Moltes vegades ni recordo que les DevTools estan activades.

Per a una guia detallada sobre la configuració de DevTools en Spring Boot, visita aquest enllaç.

Springdoc OpenAPI

Dependència

<dependency>
  <groupId>org.springdoc</groupId>
  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
</dependency>

Propòsit

Facilita la generació de documentació OpenAPI. OpenAPI és una especificació en la indústria per descriure APIs RESTful i que permeti entendre’ns entre desenvolupadors. Si tens una API RESTful, és imprescindible que tinguis una documentació clara i precisa.

Explicació

És molt útil per generar i mantenir documentació d’una API i proporciona una interfície gràfica basada en Swagger UI que permet als desenvolupadors i a QA explorar i provar els endpoints de l’API sense necessitat de Postman o Insomnia.

Si estàs en un nivell de coneixement tècnic i funcional molt elevat el primer pas és dissenyar l’API. Un bon pas és utilitzar OpenAPI per dissenyar l’API i després implementar-la. L’enfocament és no tocar el codi fins que l’API tingui una base inicial amb cara i ulls.

Apache Commons Lang

Dependència

<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
</dependency>

Propòsit

Aquesta llibreria no és pròpia de Spring Boot. Proporciona utilitats addicionals per a la manipulació de cadenes.

Explicació

La utilitat que més utilitzo és StringUtils.isBlank(). És una forma segura de comprovar si una cadena és nul·la o buida.

El més útil que té la llibreria és la possibilitat de sobrescriure els mètodes hashCode i equals. En una feina que vaig tenir, la utilitzàvem de la següent manera i sempre ho utilitzo així quan no utilitzo Lombok:

    @Override
    public boolean equals(Object object) {
        return EqualsBuilder.reflectionEquals(this, object);
    }
    @Override
    public int hashCode() {
        return HashCodeBuilder.reflectionHashCode(this);
    }

Per últim, la llibreria té moltes utilitats que utilitzen Reflection pel mig. No abusis d’ella i si cal consulta la documentació oficial o amb el teu equip de treball.

Propers passos

Amb aquestes dependències ja pots començar a construir la teva aplicació. Si vols veure com implementar-les en un cas real, et recomano seguir la guia per a crear una API REST CRUD amb Spring Boot. També pots aprendre tècniques avançades de proves com carregar fitxers JSON per a tests unitaris. t-rest-controller-crud).

  • Java
  • Spring Boot
Compartir: