Capa modelo de un proyecto Spring Boot

Capa modelo de un proyecto Spring Boot

Este artículo continua la serie iniciada en el primer artículo.

En este artículo vamos a presentar la implementación de la capa modelo o de negocio de la aplicación. Dado que seguimos el patrón MVC en la aplicación, comenzaremos por la capa más baja de acceso a datos y manipulación, para la cual nos ayudaremos de distintas tecnologías, librerías y proyectos.

Entidades

Las entidades son clases y objetos que representan un elemento del modelo y que, a menudo, tienen una correspondencia directa con una tabla de la base de datos. En nuestro caso, están bajo el paquete entities (como por ejemplo User) y Tienen las siguientes características:

  1. Están anotadas como @Entity
  2. Están anotadas como @Table, anotación a la que se le indica el nombre de la tabla que «mappea«.
  3. Define los atributos de la clase/table. Para cada uno de ellos se le indica si es identificador, qué tipo de dato es, el nombre de columna, relación con otras tablas, etc.

Repositorios

Los repositorios son las clases encargadas de gestionar el acceso a los datos. En nuestro caso, también están bajo el mismo paquete que las entidades, y su principal diferencia es que su nombre termina en Repository. Siguiendo el ejemplo anterior, el repositorio de Usuario es UserRepository. Algunas características de los repositorios son:

  1. son interfaces que extienden el repositorio base CrudRepository
  2. contienen la definición de los métodos que necesitemos de acceso a la base de datos
  3. disponen de métodos básicos de CRUD
  4. tienen un nombrado estándar que permite su implementación automática. Además, podemos definir nuestras propias consultas (con la ayuda, por ejemplo, de la anotación @Query). Más información en documentación de JPA

projectlombok

Utilizamos projectlombok para implementar de una manera más sencilla algunos métodos básicos y comunes en el desarrollo, como por ejemplo:

  1. getters y setters, para la obtención y asignación de valores de atributos
  2. constructores y builders, para la creación de objetos
  3. acceso a logs, para la depuración de código

De esta manera, vemos que, siguiendo el ejemplo de Usuario, esta clase no explicita ninguno de estos métodos que sí son utilizados en otras clases (servicios). De esta forma, en el servicio de usuarios vemos que accedemos a métodos para obtener valores de usuario por ejemplo en:

private static UserDetailsCO toUserDetailsCO(User user) {
  return new UserDetailsCO(user.getId(), user.getUsername(), 
    user.getEmail(), user.getName(), user.getRole(), user.getState());
}

o a constructores builders en:

User user = User
  .builder()
  .username(userDetailsForm.getUsername())
  .password(this.passwordEncoder.encode(userDetailsForm.getPassword()))
  .email(userDetailsForm.getEmail())
  .name(userDetailsForm.getName())
  .role(userDetailsForm.getRole())
  .state(userDetailsForm.getState())
  .registerDate(DateUtil.getNow())
  .build();

a pesar de que esos métodos parecen no existir en la clase Usuario. Esto es porque esos métodos son generados de manera automática (al poner las anotaciones correspondientes) por el projectlombok.

Además, vemos por ejemplo el controlador de autenticación web una anotación @Slf4j (también gracias a projectlombok) que lo que permite es utilizar de manera cómoda métodos de logging como el que está en ese mismo controlador:

log.debug("web login");

Servicios

Los servicios son clases que se encargan de la capa de negocio de la aplicación. Para ello, normalmente, acceden a los datos almacenados en la base de datos de la aplicación a través de los repositorios, hacen una serie de operaciones, y envían los datos al controlador. Los servicios (por ejemplo, el ya mencionado servicio de usuarios) se caracterizan por:

  • estar anotados por @Service
  • implementar una interfaz fachada, como UserService, que es llamada por una capa superior (controlador)
  • tienen referencias a los repositorios anotadas con @Autowired
  • son métodos que suelen acceder a base de datos y por lo tanto tienen su transaccionalidad definida con la anotación @Transactional, diferenciando si realizan escrituras, únicamente lecturas, casos de rollback, etc.
  • construír/utilizar objetos personalizados que serán devueltos al controlador (bajo el paquete custom object’s

Imagen principal: Photo by Adeolu Eletu on Unsplash

Publicado en junio 3, 2020

,

,

,

,

Un comentario en Capa modelo de un proyecto Spring Boot

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

« »