Saltar a contenido

Monorepo de Maven

Este proyecto es un monorepo basado en Maven que contiene múltiples módulos para una aplicación de Spring Boot. La estructura del proyecto está organizada en módulos para microservicios y librerías compartidas, facilitando el mantenimiento y el desarrollo escalable.

Estructura de los Módulos

La estructura del proyecto se organiza de la siguiente manera:

  • monorepo: Módulo raíz del proyecto que define la configuración global y los módulos principales.
  • microservices: Módulo que contiene los microservicios:
  • usermanagement: Gestión de usuarios.
  • feedbackrequest: Solicitud de feedback.
  • feedbackresponse: Respuesta de feedback.
  • libs: Módulo que contiene librerías compartidas:
  • security: Implementaciones relacionadas con la seguridad.

Configuración del Proyecto (POM)

monorepo/pom.xml

Este es el archivo pom.xml principal que define el proyecto como un módulo padre (parent) de otros módulos.

microservices/pom.xml

Define el módulo microservices y sus dependencias, incluyendo Spring Boot, JPA y otras librerías necesarias.

libs/pom.xml

Define el módulo libs que contiene módulos de librerías compartidas como security.

Ejemplos de Uso

Creando un Endpoint en Spring Boot

Para crear un endpoint, puedes agregar un controlador al módulo de microservicio deseado. Ejemplo:

package com.ciandt.nextgen25.usermanagement.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @GetMapping("/users")
    public String getUsers() {
        return "Lista de usuarios";
    }
}

Accediendo a la Base de Datos

El proyecto está configurado para usar JPA. Para acceder a la base de datos, crea una entidad y un repositorio. Ejemplo:

package com.ciandt.nextgen25.usermanagement.model;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class User {

    @Id
    private Long id;
    private String name;

    // Getters y Setters
}
package com.ciandt.nextgen25.usermanagement.repository;

import com.ciandt.nextgen25.usermanagement.model.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
}

Creando Pruebas con TDD

Para crear pruebas, utiliza el framework JUnit. Ejemplo de una prueba simple:

package com.ciandt.nextgen25.usermanagement;

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;

@SpringBootTest
@AutoConfigureMockMvc
public class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    @WithMockUser(username = "admin", roles = {"ADMIN"})
    public void testCreateUser() throws Exception {
        mockMvc.perform(
            post("/users")
                .contentType(MediaType.APPLICATION_JSON)
                .content("{\"id\": 1, \"name\": \"John Doe\"}")
        )
        .andExpect(status().isCreated())
        .andExpect(jsonPath("$.name").value("John Doe"));
    }

    @Test
    public void testGetUserById() throws Exception {
        mockMvc.perform(get("/users/1"))
            .andExpect(status().isOk())
            .andExpect(jsonPath("$.name").value("John Doe"));
    }
}

Glosario

  • Maven: Herramienta de automatización de compilación y gestión de dependencias para proyectos Java.
  • POM (Project Object Model): Archivo XML que contiene información sobre el proyecto y configuraciones para Maven.
  • Spring Boot: Framework de Java para la creación de aplicaciones independientes y listas para producción.
  • Microservicios: Arquitectura que estructura una aplicación como un conjunto de servicios pequeños e independientes.
  • JPA (Java Persistence API): API para la gestión de datos relacionales en Java.
  • JUnit: Framework para la creación y ejecución de pruebas automatizadas en Java.
  • TDD (Test-Driven Development): Metodología de desarrollo de software en la que las pruebas se escriben antes que el código funcional.