Saltar a contenido

Estructura y Buenas pr谩cticas - Spring Boot

Estructura y funcionamiento

En Springboot no existe nada estandarizado y oficial que hable sobre estructura de proyectos y nomenclatura. Tan solo existen algunas sugerencias y buenas pr谩cticas a la hora de desarrollar que te recomiendo que utilices en la medida de lo posible.

Tip

Piensa que el c贸digo fuente que escribes hoy, es como un libro que se leer谩 durante a帽os. Alguien tendr谩 que coger tu c贸digo y leerlo en unos meses o a帽os para hacer alguna modificaci贸n y, como buenos desarrolladores que somos, tenemos la obligaci贸n de facilitarle en todo lo posible la comprensi贸n de ese c贸digo fuente. Quiz谩 esa persona futura podr铆as ser tu en unos meses y quedar铆a muy mal que no entendieras ni tu propio c贸digo 馃槅

Estructura en capas

Todos los proyectos web que construimos basados en Springboot se caracterizan por estar divididos en tres capas (a menos que utilicemos DDD para desarrollar que entonces existen infinitas capas 馃槅).

Estructura-capas

  • Controlador. Es la capa m谩s alta, la que tiene acceso directo con el cliente. En esta capa es donde se exponen las operaciones que queremos publicar y que el cliente puede consumir. Para realizar sus operaciones lo m谩s normal es que realice llamadas a las clases de la capa inmediatamente inferior.
  • L贸gica. Tambi茅n llamada capa de Servicios. Es la capa intermedia que da soporte a las operaciones que est谩n expuestas y ejecutan toda la l贸gica de negocio de la aplicaci贸n. Para realizar sus operaciones puede realizar llamadas tanto a otras clases dentro de esta capa, como a clases de la capa inferior.
  • Acceso a Datos. Como su nombre indica, es la capa que accede a datos. T铆picamente es la capa que ejecuta las consultas contra BBDD, pero esto no tiene por qu茅 ser obligadamente as铆. Tambi茅n entrar铆an en esa capa aquellas clases que consumen datos externos, por ejemplo de un servidor externo. Las clases de esta capa deben ser nodos finales, no pueden llamar a ninguna otra clase para ejecutar sus operaciones, ni siquiera de su misma capa.

Estructura de proyecto

En proyectos medianos o grandes, estructurar los directorios del proyecto en base a la estructura anteriormente descrita ser铆a muy complejo, ya que en cada uno de los niveles tendr铆amos muchas clases. As铆 que lo normal es diferenciar por 谩mbito funcional y dentro de cada package realizar la separaci贸n en Controlador, L贸gica y Acceso a datos.

Tened en cuenta en un mismo 谩mbito funcional puede tener varios controladores o varios servicios de l贸gica uno por cada entidad que estemos tratando. Siempre que se pueda, agruparemos entidades que intervengan dentro de una misma funcionalidad.

En nuestro caso del tutorial, tendremos tres 谩mbitos funcionales Categor铆a, Autor, y Juego que diferenciaremos cada uno con su propia estructura.

Buenas pr谩cticas

Nomenclatura de las clases

@TODO: En construcci贸n

Accesos entre capas

En base a la divisi贸n por capas que hemos comentado arriba, y el resto de entidades implicadas, hay una serie de reglas important铆simas que debes seguir muy de cerca:

  • Un Controlador
    • NO debe contener l贸gica en su clase. Solo est谩 permitido que ejecute l贸gica a trav茅s de una llamada al objeto de la capa L贸gica.
    • NO puede ejecutar directamente operaciones de la capa Acceso a Datos, siempre debe pasar por la capa L贸gica.
    • NO debe enviar ni recibir del cliente objetos de tipo Entity.
    • Es un buen lugar para realizar las conversiones de datos entre Entity y Dto.
    • En teor铆a cada operaci贸n deber铆a tener su propio Dto, aunque los podemos reutilizar entre operaciones similares.
    • Debemos seguir una coherencia entre todas las URL de las operaciones. Por ejemplo si elegimos save para guardar, usemos esa palabra en todas las operaciones que sean de ese tipo. Evitad utilizar diferentes palabras save, guardar, persistir, actualizar para la misma acci贸n.
  • Un Servicio
    • NO puede llamar a objetos de la la capa Controlador.
    • NO puede ejecutar directamente queries contra la BBDD, siempre debe pasar por la capa Acceso a Datos.
    • NO debe llamar a Acceso a Datos que NO sean de su 谩mbito / competencia.
    • Si es necesario puede llamar a otros Servicios para recuperar cierta informaci贸n que no sea de su 谩mbito / competencia.
    • Debe trabajar en la medida de lo posible con objetos de tipo Entity.
    • Es un buen lugar para implementar la l贸gica de negocio.
  • Un Acceso a Datos
    • NO puede llamar a ninguna otra capa. Ni Controlador, ni Servicios, ni Acceso a Datos.
    • NO debe contener l贸gica en su clase.
    • Esta capa solo debe resolver el dato que se le ha solicitado y devolverlo a la capa de Servicios.