Skip to content

Arquitectura Hexagonal ​

lg5-spring se basa en Arquitectura Hexagonal (también conocida como Ports-and-Adapters).

¿Qué es la Arquitectura Hexagonal? ​

Es un patrón de arquitectura que separa la lógica de negocio de los detalles externos (bases de datos, APIs, frameworks). La aplicación está en el centro, y todo lo externo se conecta a través de puertos (interfaces) y adaptadores.

┌─────────────────────────────────────────────────────┐
│                    External World                     │
│                                                         │
│  ┌──────────┐     ┌──────────┐     ┌──────────────┐  │
│  │  Postgres │     │  Kafka   │     │  3rd API     │  │
│  │  / JDBC   │     │  / HTTP  │     │  / HTTP      │  │
│  └────┬─────┘     └────┬─────┘     └──────┬───────┘  │
└───────┼─────────────────┼────────────────────┼────────┘
        │                 │                    │
        ▼                 ▼                    ▼
┌─────────────────────────────────────────────────────────┐
│         │            │            │                      │
│         │  ┌─────────┴────────────┴───────────┐         │
│         │  │            Hexagon                │         │
│         │  │                                    │         │
│         │  │   ┌────────────────────┐           │         │
│         │  │   │   Domain Layer     │           │         │
│         │  │   │  (Business Logic)  │           │         │
│         │  │   └────────────────────┘           │         │
│         │  │                                    │         │
│         │  └────────────────────────────────────┘         │
│         │                 │                              │
│         └─────────────────┼──────────────────────────────┘
                            │
                            ▼
┌────────────────────────────────────────────────────────────┐
│                       Adaptadores                            │
│                                                              │
│  ┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│  │   Ports      │ │   Ports      │ │     Ports            │ │
│  │   (Input)    │ │   (Output)   │ │    (Input/Output)    │ │
│  │              │ │              │ │                      │ │
│  │  REST        │ │  DB          │ │  Kafka               │ │
│  │  endpoints   │ │  repository  │ │  events                │ │
│  │              │ │              │ │                      │ │
│  └─────────────┘ └──────────────┘ └──────────────────────┘ │
└────────────────────────────────────────────────────────────┘

Principios ​

  1. The Domain stays clean — La capa de dominio no conoce frameworks, ni APIs, ni bases de datos.
  2. Dependencies point inward — Las capas externas solo dependen de las internas, nunca al revés.
  3. Testability — Los puertos permiten mockear fácilmente las dependencias externas.

Capas en lg5-spring ​

Domain Core (Pure)
      │
      ▼
Application Service (Use Cases)
      │
      ▼
Data Access (Infrastructure)
      │
      ▼
API (REST endpoints)
      │
      ▼
Messaging (Kafka events)

Capas del Proyecto ​

CapaPaqueteResponsabilidad
Domain Coreyour-domain-coreEntitys, ValueObjects, DomainExceptions
Applicationyour-application-serviceUse cases, ApplicationService, Sagas
Data Accessyour-data-accessJPA Entities, Repository impls
APIyour-apiREST controllers, DTOs
Messagingyour-messageKafka listeners & publishers
Externalyour-external3rd party client adapters

Ejemplo de Flujo ​

┌──────────┐
│  Client  │  (HTTP POST /blank)
└────┬─────┘
     │
     ▼
┌──────────┐
│  API     │  BlankController (REST endpoint)
│  Layer   │
└────┬─────┘
     │
     ▼
┌──────────┐
│  App     │  BlankApplicationService → CommandHandler
│  Layer   │      ↓ validates & transforms
└────┬─────┘      ↓
     │        Domain Layer
     ▼        BlankEntity → BlankCreatedEvent
┌──────────┐
│  Data    │  BlankRepository → JPA save
│  Layer   │
└────┬─────┘
     │
     ▼
┌──────────┐
│  Kafka   │  Event to Kafka topic via Outbox
│  Layer   │
└──────────┘

Released under the MIT License.