Cuando hablamos de desarrollar servicios backend robustos, una de las claves que marca la diferencia entre un código que “aguanta” y otro que se convierte en un caos es la estructura. Si lo que buscas es código limpio, entendible y fácil de mantener, te recomiendo adoptar la arquitectura de tres capas. Personalmente la uso en todos mis backends y quiero contarte por qué, cuándo y cómo implementarla — con un ejemplo real de mi proyecto en GitHub: github.com/Dreiko98/germanmallo-chatbot
¿Qué es la arquitectura de tres capas?
La arquitectura de tres capas (o three-tier architecture) es un patrón de diseño de software que separa la aplicación en tres capas lógicas bien definidas:
- Capa de presentación (o interfaz)
Es la que interactúa con el usuario o cliente: puede ser una API HTTP, un frontend, un cliente móvil, etc. Su función principal es recoger peticiones, mostrar respuestas, y delegar la lógica al resto de capas. - Capa de lógica de negocio (o dominio)
Aquí residen las reglas del negocio, los procesos, la orquestación, los servicios. Esta capa es la “inteligencia” de la aplicación: define qué hacer, cuándo, cómo, y coordina la persistencia o la presentación. - Capa de acceso a datos (o persistencia)
Se encarga de la interacción con la base de datos, de leer/escribir entidades, de mapear objetos, de consultas, etc. Su función es que el resto de capas no tengan que preocuparse por cómo se almacenan los datos.
¿Por qué usarla?
- Permite separar responsabilidades, lo que facilita pruebas unitarias, mantenibilidad y evolución del sistema.
- Libera la lógica de negocio de los detalles de presentación o de base de datos, lo que favorece que puedas cambiar “pantalla” o “BD” sin afectar todo.
- Mejora la legibilidad del código: al tener capas bien definidas, los nuevos desarrolladores entienden rápido dónde está cada cosa.
- Favorece la reutilización y la escalabilidad: puedes tener varios frontends (web, móvil, API) apuntando a la misma lógica, o cambiar la BD sin reescribir la lógica.
¿Cuándo tiene sentido emplearla?
Aunque es un patrón muy útil, hay casos donde quizá resulte excesivo:
- ✅ Ideal cuando estás construyendo un backend de cierta complejidad: muchas entidades, lógica de negocio relevante, varios endpoints, integración con terceros.
- ✅ Cuando quieres que tu proyecto sea mantenible a medio/largo plazo, o vaya a crecer con nuevas funcionalidades.
- ❌ Puede ser demasiado “ceremonioso” para un microservicio muy simple que sólo hace un CRUD y nada más.
- ❌ Si tienes un prototipo ultraligero o una App de una sola pantalla y pocas reglas, quizá prefieras una estructura más ligera.
Cómo lo implemento yo (y puedes tú)
Este es un proyecto perfecto a modo de ejemplo: github.com/Dreiko98/germanmallo-chatbot, aquí uso la arquitectura de tres capas para mantener un backend limpio. Así es como lo planteo:
Estructura de carpetas típica
/src
/presentation ← rutas, controladores, DTOs
/business ← servicios, reglas de negocio, casos de uso
/data ← repositorios, modelos de persistencia, mappers
Flujo de una petición
- El cliente hace una petición al endpoint de la capa presentation.
- El controlador valida y transforma los datos (DTOs) y llama al servicio correspondiente en la capa business.
- El servicio ejecuta la lógica, posiblemente orquesta varios repositorios de la capa data.
- La capa data accede a la base de datos (o a otro sistema externo), mapea resultados y los devuelve al servicio.
- El servicio procesa los datos y devuelve el resultado al controlador, que formatea la respuesta para el cliente.
Buenas prácticas que aplico
- No mezclar lógica de negocio en los controladores: estos sólo orquestan.
- Usar interfaces o abstracciones para los repositorios, lo que me permite “mockear” en tests o cambiar de base de datos sin tocar la lógica.
- Tener DTOs/clases de dominio que no dependan de frameworks externos.
- Mantener la capa de persistencia lo más independiente posible del resto.
- Documentar claramente cada capa para que otro desarrollador pueda sumarse sin dificultad.
Ventajas que he observado
- El tiempo de onboarding de nuevos desarrolladores baja considerablemente.
- Cuando necesito modificar un detalle (por ejemplo cambiar cómo se hace el guardado de datos) sólo modifico la capa
data, sin tocar los servicios. - Las pruebas de negocio (services) se vuelven mucho más sencillas porque todas las dependencias están inyectadas y no dispersas.
- El código gana en coherencia y legibilidad; al cabo de unos meses, es mucho más fácil volver y entender qué hacía cada parte.
¿Y los retos o “lo que cuesta”?
- Al inicio puede parecer que “cuesta” más levantar la estructura: más carpetas, abstracciones, etc. Pero justo es una inversión que se amortiza.
- Si no tienes disciplina o no haces revisiones, la capa podría volverse un “dumping ground” y perder su sentido.
- Hay que buscar un equilibrio: la arquitectura no debe ser tan rígida que impida rapidez, sobre todo en fases iniciales.
Conclusión
La arquitectura de tres capas es una excelente elección si quieres construir backends organizados, mantenibles y preparados para el cambio. No es la única opción, pero sí una de las más robustas para proyectos serios. Te invito a que revises el proyecto de ejemplo en mi GitHub ( github.com/Dreiko98/germanmallo-chatbot ) y veas cómo lo he aplicado concretamente.
¿Estás montando un backend ahora mismo? Si quieres, puedo ayudarte a generar una plantilla inicial con la arquitectura de tres capas adaptada a tu stack (Python, Node.js, Java… lo que prefieras). ¡Sólo dime!