· 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?

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: alwaysSi 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: trueEl 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