Modelar un Negocio en Spring Boot y Hibernate — Parte III

La capa de servicios

Alan Badillo Salas
Full Stack Java
4 min readAug 28, 2018

--

En las entregas anterioes hemos visto la Capa de Datos y la Capa de Acceso a Datos, las cuales nos permiten definir las entidades de nuestro sistema y el consumo desde una base de datos con Hibernate. Ahora toca el tema de la Capa de Servicios la cual se refiere a la capa donde se definen todas las tareas que es capaz de realizar nuestro sistema. Esta es una de las capas más importantes ya que aquí se realizarán todas las operaciones de validación de datos y seguridad.

Podemos pensar que todo negocio puede dividirse en un conjunto de tareas que es capaz de realizar, cada tarea ofrece por sí mismo un servicio. Una tarea puede definirse como un conjunto de transacciones y operaciones lógicas para llevar al sistema de un punto A a un punto B. El interactor principal de cada tarea deberá ser una entidad principal a la que se le aplique la tarea, auque podría darse el caso de tener dos o tres entidades como entrada de la tarea.

Un servicio está representado por una clase marcada con la anotación Service la cual contendrá métodos funcionales, cada método representará una tarea.

Los servicios más sencillos son aquellos que se encargan simplemente de consumir un repositorio, a estos servicios les llamaremos Servicios de Integridad (del Repositorio), ya que su único objetivo es consumir correctamente los repositorios, estos servicios serán los más aburridos y fastidiosos de programar porque al principio nos dará la sensación de estar replicando código y preguntarnos el por qué no cosumimos directamente el repositorio (no lo hagan, es importante el servicio cómo capa intermedia entre las capas superiores y la capa de acceso a datos).

A los servicios dedicados a realizar operaciones específicas para el flujo del negocio les llamaremos Servicios de Operabilidad (del Negocio), ya que estos servicios guiarán el flujo del negocio y su operabilidad, un ejemplo de estos servicios son los que se dedican a realizar las operaciones necesarias para completar una transacción compleja como en el caso de realizar una venta, almacenar un pedido y generar un reporte, almacenar un archivo y generar enlaces estáticos, etc.

Finalmente a los servicios dedicados a realizar operaciones de segurida serán llamados Servicios de Seguridad y los encargados de generar reportes y estadísiticas serán los Servicios de Gestión.

Definir un Servicio

Para crear un servicio basta con definir una clase marcada con la anotación Service y ubicada en el paquete com.miempresa.service para mejor organización. En el ejemplo siguiente, veremos un servicio dedicado a consumir el servicio para nuestra entidad Cupcake, por lo tanto llamaremos a este servicio CupcakeService.

Observa que hemos creado la clase CupcakeService marcada con la anotación Service, dicha clase posee un AutoEnlace al repositorio CupcakeRepository. La anotación Autowired le indica a Spring que esta clase debería tener acceso a la instancia que se haya creado para CupcakeRepository, en este momento Spring buscará la instancia del repositorio y la conectará automáticamente a nuestra clase de servicio, permitiendonos ejecutar los métodos implementados como findAll, findByNombre y costoMaroyA. También observa que cada método realiza un simple consumo al repositorio, por lo que podemos intuir que este es un Servicio de Integridad, que realiza algunas validaciones antes de consumir al repositorio, para que sea seguro consumirlo. Finalmente podemos observar que los últimos dos métodos generar error de tipo Exception si la condición sobre los parámetros recibidos lo indica, por ejemplo, si se intentan buscar los Cupcakes cuyo costo es mayor a un número negativo (quizás no se permita para no manejar números negativos por error), entonces se producirá un error avisando que el costo debe ser mayor a cero. Quizás esta validación es absurda, pero ya en un negocio real puede salvar la integridad del sistema y hay que tener cuidado con cada consumo que se haga al repositorio para no exponer datos sensibles.

Más adelante profundizaremos sobre los otros tipos de servicios para implementar servicios de seguridad y generación de reportes.

Conclusiones

La Capa de Servicios es la encargada de proveer seguridad a nuestro sistema para consumir las capas inferiores correctamente, lo ideal será que la capa de servicios consuma la capa de acceso a datos y realice las validaciones necesarias antes de consumir la capa DAO para proteger la integridad del sistema.

La capa de servicios consiste en crear clases marcadas con la anotación Service para definir métodos que consuman la capa de acceso a datos o realicen operaciones sobre nuestro sistemas.

Una buena práctica es dividir nuestro negocio en tareas para poder crear servicios que resulevan las tareas de nuestro negocio, por ejemplo, si tenemos un negocio de venta de productos en línea vamos a tener tareas como, registrar un cliente, verificar que un cliente tenga tal correo y contraseña, registrar un producto, buscar productos, realizar un proceso de venta, marcar que el usuario compró tales productos en tal fecha, etc.

La capa de servicios es fundamental para el negocio y representa la parte más fuerte de él ya que si queremos migrar el negocio, bastará con revisar cada una de las tareas que realiza y cómo las realiza.

Envía tus comentarios sobre las dudas que tengas sobre esta capa para ampliar está entrega y no olvides visitar la siguiente capa llamada la Capa del API. ¡Hasta la próxima!

--

--

Alan Badillo Salas
Full Stack Java

L. Matemáticas Aplicadas UAM-Cuajimalpa. M. en Inteligencia Artificial IPN-CIDETEC. Desarrollador Full Stack MEAN/MERN. Data Scientist.