{"id":4363,"date":"2025-10-31T09:08:14","date_gmt":"2025-10-31T08:08:14","guid":{"rendered":"https:\/\/germanmallo.com\/?p=1397"},"modified":"2026-10-05T08:15:46","modified_gmt":"2026-10-05T06:15:46","slug":"arquitectura-de-tres-capas","status":"publish","type":"post","link":"https:\/\/germanmallo.com\/en\/arquitectura-de-tres-capas\/","title":{"rendered":"Arquitectura de Tres Capas: c\u00f3mo lograr un backend limpio, organizado y escalable"},"content":{"rendered":"<p>&nbsp;<\/p>\n<p>Cuando hablamos de desarrollar servicios backend robustos, una de las claves que marca la diferencia entre un c\u00f3digo que \u201caguanta\u201d y otro que se convierte en un caos es la estructura. Si lo que buscas es <strong>c\u00f3digo limpio<\/strong>, <strong>entendible<\/strong> y <strong>f\u00e1cil de mantener<\/strong>, te recomiendo adoptar la <strong>arquitectura de tres capas<\/strong>. Personalmente la uso en todos mis backends y quiero contarte por qu\u00e9, cu\u00e1ndo y c\u00f3mo implementarla \u2014 con un ejemplo real de mi proyecto en GitHub: <a href=\"https:\/\/github.com\/Dreiko98\/germanmallo-chatbot\">github.com\/Dreiko98\/germanmallo-chatbot<\/a><\/p>\n<p><!--more--><\/p>\n<hr \/>\n<h2 id=\"-qu-es-la-arquitectura-de-tres-capas-\">\u00bfQu\u00e9 es la arquitectura de tres capas?<\/h2>\n<p>La arquitectura de tres capas (o <strong>three-tier architecture<\/strong>) es un patr\u00f3n de dise\u00f1o de software que separa la aplicaci\u00f3n en tres capas l\u00f3gicas bien definidas:<\/p>\n<ol>\n<li><strong>Capa de presentaci\u00f3n<\/strong> (o interfaz)<br \/>\nEs la que interact\u00faa con el usuario o cliente: puede ser una API HTTP, un frontend, un cliente m\u00f3vil, etc. Su funci\u00f3n principal es recoger peticiones, mostrar respuestas, y delegar la l\u00f3gica al resto de capas.<\/li>\n<li><strong>Capa de l\u00f3gica de negocio<\/strong> (o dominio)<br \/>\nAqu\u00ed residen las reglas del negocio, los procesos, la orquestaci\u00f3n, los servicios. Esta capa es la \u201cinteligencia\u201d de la aplicaci\u00f3n: define qu\u00e9 hacer, cu\u00e1ndo, c\u00f3mo, y coordina la persistencia o la presentaci\u00f3n.<\/li>\n<li><strong>Capa de acceso a datos<\/strong> (o persistencia)<br \/>\nSe encarga de la interacci\u00f3n con la base de datos, de leer\/escribir entidades, de mapear objetos, de consultas, etc. Su funci\u00f3n es que el resto de capas no tengan que preocuparse por c\u00f3mo se almacenan los datos.<\/li>\n<\/ol>\n<h3 id=\"-por-qu-usarla-\">\u00bfPor qu\u00e9 usarla?<\/h3>\n<ul>\n<li>Permite <strong>separar responsabilidades<\/strong>, lo que facilita pruebas unitarias, mantenibilidad y evoluci\u00f3n del sistema.<\/li>\n<li>Libera la l\u00f3gica de negocio de los detalles de presentaci\u00f3n o de base de datos, lo que favorece que puedas cambiar \u201cpantalla\u201d o \u201cBD\u201d sin afectar todo.<\/li>\n<li>Mejora la <strong>legibilidad del c\u00f3digo<\/strong>: al tener capas bien definidas, los nuevos desarrolladores entienden r\u00e1pido d\u00f3nde est\u00e1 cada cosa.<\/li>\n<li>Favorece la <strong>reutilizaci\u00f3n<\/strong> y la <strong>escalabilidad<\/strong>: puedes tener varios frontends (web, m\u00f3vil, API) apuntando a la misma l\u00f3gica, o cambiar la BD sin reescribir la l\u00f3gica.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"-cu-ndo-tiene-sentido-emplearla-\">\u00bfCu\u00e1ndo tiene sentido emplearla?<\/h2>\n<p>Aunque es un patr\u00f3n muy \u00fatil, hay casos donde quiz\u00e1 resulte excesivo:<\/p>\n<ul>\n<li>\u2705 Ideal cuando est\u00e1s construyendo un backend de cierta complejidad: muchas entidades, l\u00f3gica de negocio relevante, varios endpoints, integraci\u00f3n con terceros.<\/li>\n<li>\u2705 Cuando quieres que tu proyecto sea mantenible a medio\/largo plazo, o vaya a crecer con nuevas funcionalidades.<\/li>\n<li>\u274c Puede ser demasiado \u201cceremonioso\u201d para un microservicio muy simple que s\u00f3lo hace un CRUD y nada m\u00e1s.<\/li>\n<li>\u274c Si tienes un prototipo ultraligero o una App de una sola pantalla y pocas reglas, quiz\u00e1 prefieras una estructura m\u00e1s ligera.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"c-mo-lo-implemento-yo-y-puedes-t-\">C\u00f3mo lo implemento yo (y puedes t\u00fa)<\/h2>\n<p>Este es un proyecto perfecto a modo de ejemplo: <a href=\"https:\/\/github.com\/Dreiko98\/germanmallo-chatbot\">github.com\/Dreiko98\/germanmallo-chatbot<\/a>, aqu\u00ed uso la arquitectura de tres capas para mantener un backend limpio. As\u00ed es como lo planteo:<\/p>\n<h3 id=\"estructura-de-carpetas-t-pica\">Estructura de carpetas t\u00edpica<\/h3>\n<pre><code>\/src\n  \/presentation   \u2190 rutas, controladores, DTOs\n  \/business       \u2190 servicios, reglas <span class=\"hljs-keyword\">from<\/span> negocio, casos <span class=\"hljs-keyword\">from<\/span> uso\n  \/data           \u2190 repositorios, modelos <span class=\"hljs-keyword\">from<\/span> persistencia, mappers\n<\/code><\/pre>\n<h3 id=\"flujo-de-una-petici-n\">Flujo de una petici\u00f3n<\/h3>\n<ol>\n<li>El cliente hace una petici\u00f3n al endpoint de la capa <strong>presentation<\/strong>.<\/li>\n<li>El controlador valida y transforma los datos (DTOs) y llama al servicio correspondiente en la capa <strong>business<\/strong>.<\/li>\n<li>El servicio ejecuta la l\u00f3gica, posiblemente orquesta varios repositorios de la capa <strong>data<\/strong>.<\/li>\n<li>La capa <strong>data<\/strong> accede a la base de datos (o a otro sistema externo), mapea resultados y los devuelve al servicio.<\/li>\n<li>El servicio procesa los datos y devuelve el resultado al controlador, que formatea la respuesta para el cliente.<\/li>\n<\/ol>\n<h3 id=\"buenas-pr-cticas-que-aplico\">Buenas pr\u00e1cticas que aplico<\/h3>\n<ul>\n<li>No mezclar l\u00f3gica de negocio en los controladores: estos s\u00f3lo orquestan.<\/li>\n<li>Usar interfaces o abstracciones para los repositorios, lo que me permite \u201cmockear\u201d en tests o cambiar de base de datos sin tocar la l\u00f3gica.<\/li>\n<li>Tener DTOs\/clases de dominio que no dependan de frameworks externos.<\/li>\n<li>Mantener la capa de persistencia lo m\u00e1s independiente posible del resto.<\/li>\n<li>Documentar claramente cada capa para que otro desarrollador pueda sumarse sin dificultad.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"ventajas-que-he-observado\">Ventajas que he observado<\/h2>\n<ul>\n<li>El tiempo de onboarding de nuevos desarrolladores baja considerablemente.<\/li>\n<li>Cuando necesito modificar un detalle (por ejemplo cambiar c\u00f3mo se hace el guardado de datos) s\u00f3lo modifico la capa <code>data<\/code>, sin tocar los servicios.<\/li>\n<li>Las pruebas de negocio (services) se vuelven mucho m\u00e1s sencillas porque todas las dependencias est\u00e1n inyectadas y no dispersas.<\/li>\n<li>El c\u00f3digo gana en coherencia y legibilidad; al cabo de unos meses, es mucho m\u00e1s f\u00e1cil volver y entender qu\u00e9 hac\u00eda cada parte.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"-y-los-retos-o-lo-que-cuesta-\">\u00bfY los retos o \u201clo que cuesta\u201d?<\/h2>\n<ul>\n<li>Al inicio puede parecer que \u201ccuesta\u201d m\u00e1s levantar la estructura: m\u00e1s carpetas, abstracciones, etc. Pero justo es una inversi\u00f3n que se amortiza.<\/li>\n<li>Si no tienes disciplina o no haces revisiones, la capa podr\u00eda volverse un \u201cdumping ground\u201d y perder su sentido.<\/li>\n<li>Hay que buscar un <strong>equilibrio<\/strong>: la arquitectura no debe ser tan r\u00edgida que impida rapidez, sobre todo en fases iniciales.<\/li>\n<\/ul>\n<hr \/>\n<h2 id=\"conclusi-n\">Conclusi\u00f3n<\/h2>\n<p>La arquitectura de tres capas es una excelente elecci\u00f3n si quieres construir backends <strong>organizados<\/strong>, <strong>mantenibles<\/strong> y preparados para el cambio. No es la \u00fanica opci\u00f3n, pero s\u00ed una de las m\u00e1s robustas para proyectos serios. Te invito a que revises el <a href=\"https:\/\/germanmallo.com\/en\/portfolio\/chatbot-personal-rag\/\">proyecto de ejemplo<\/a> en mi GitHub ( <a href=\"https:\/\/github.com\/Dreiko98\/germanmallo-chatbot\">github.com\/Dreiko98\/germanmallo-chatbot<\/a> ) y veas c\u00f3mo lo he aplicado concretamente.<\/p>\n<p>\u00bfEst\u00e1s 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\u2026 lo que prefieras). \u00a1S\u00f3lo dime!<\/p>","protected":false},"excerpt":{"rendered":"<p>&nbsp; Cuando hablamos de desarrollar servicios backend robustos, una de las claves que marca la diferencia entre un c\u00f3digo que \u201caguanta\u201d y otro que se convierte en un caos es la estructura. Si lo que buscas es c\u00f3digo limpio, entendible y f\u00e1cil de mantener, te recomiendo adoptar la arquitectura de tres capas. Personalmente la uso [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":1398,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[73],"tags":[257,128,129],"class_list":["post-4363","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo-de-software","tag-apis","tag-arquitectura-de-software","tag-backend"],"acf":[],"_links":{"self":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/4363","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/comments?post=4363"}],"version-history":[{"count":1,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/4363\/revisions"}],"predecessor-version":[{"id":4976,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/posts\/4363\/revisions\/4976"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/media\/1398"}],"wp:attachment":[{"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/media?parent=4363"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/categories?post=4363"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/germanmallo.com\/en\/wp-json\/wp\/v2\/tags?post=4363"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}