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 ).
- 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 capaL贸gica
. - NO debe enviar ni recibir del cliente objetos de tipo
Entity
. - Es un buen lugar para realizar las conversiones de datos entre
Entity
yDto
. - 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 palabrassave
,guardar
,persistir
,actualizar
para la misma acci贸n.
- 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
- 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.
- NO puede llamar a objetos de la la capa
- Un
Acceso a Datos
- NO puede llamar a ninguna otra capa. Ni
Controlador
, niServicios
, niAcceso 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
.
- NO puede llamar a ninguna otra capa. Ni