Construyendo un Sistema de E-Commerce con DDD



This content originally appeared on DEV Community and was authored by Ximena Soto

Como dev entusiasta por Java y Domain-Driven Design (DDD), quiero compartir mi proyecto DddEcommerceOrders, un sistema de gestión de pedidos para e-commerce que refleja mi entusiasmo por Java, Spring Boot y arquitectura de microservicios. Este proyecto muestra mi compromiso con escribir código limpio y mi entusiasmo por el aprendizaje continuo en áreas como DevOps y AWS. En este artículo, te guiaré a través del proyecto, su diseño basado en DDD, y cómo refleja mi objetivo de atraer reclutadores internacionales con habilidades técnicas y un enfoque en crecimiento continuo.

¿Por qué DddEcommerceOrders?

Como dev, creo que construir proyectos reales es la mejor manera de demostrar competencia técnica y habilidades de resolución de problemas. DddEcommerceOrders (disponible en https://github.com/xsoto-developer/DddEcommerceOrders) es un sistema basado en microservicios que gestiona pedidos e inventario para una plataforma de e-commerce. Utiliza principios de DDD para crear una arquitectura limpia y escalable, ideal para destacar mi experiencia en Java y Spring Boot, así como mis primeros pasos en prácticas DevOps como CI/CD con GitHub Actions.

El proyecto tiene dos propósitos:

  1. Excelencia Técnica: Demuestra conceptos avanzados de DDD como Bounded Contexts, Agregados y Eventos de Dominio, implementados en una arquitectura de microservicios.
  2. Crecimiento Profesional: Refleja mi camino de aprendizaje y aplicación de prácticas modernas de ingeniería de software, incluyendo mi interés en DevOps y mi preparación para certificaciones AWS.

Visión General del Proyecto

DddEcommerceOrders se divide en dos microservicios:

  • orders-service: Gestiona el Bounded Context de Gestión de Pedidos, manejando la creación, procesamiento de pagos y cancelación de pedidos.
  • inventory-service: Gestiona el Bounded Context de Gestión de Inventario, manejando la reserva y liberación de stock.

Cada microservicio sigue una arquitectura limpia con tres capas:

  • Dominio: Modelos DDD (ej. Pedido y Producto) con lógica de negocio.
  • Aplicación: Servicios que orquestan casos de uso (ej. OrderService, InventoryService).
  • Infraestructura: APIs REST, listeners de eventos y persistencia con Spring Data JPA y H2.

Características Clave

  • Procesamiento de Pedidos: Crear pedidos, confirmar pagos y cancelarlos vía APIs REST.
  • Gestión de Inventario: Reservar stock al confirmar un pedido, usando eventos de dominio.
  • Documentación de APIs: Swagger UI para pruebas interactivas (/swagger-ui.html).
  • Pruebas: Tests unitarios con JUnit 5 para validar reglas de negocio.
  • CI/CD: Pipeline de GitHub Actions para compilación y pruebas automatizadas.

DDD en Acción

El proyecto se basa en dos Bounded Contexts:

  1. Gestión de Pedidos:
    • Agregado: Pedido (raíz) con LineaDePedido (value object) y Direccion (value object).
    • Lenguaje Ubicuo: Términos como “confirmar pedido” y “cancelar pedido” son consistentes en código y documentación.
    • Evento de Dominio: OrderConfirmedEvent activa la reserva de stock en el servicio de inventario.
  2. Gestión de Inventario:
    • Agregado: Producto (raíz) con Stock (value object).
    • Lenguaje Ubicuo: Términos como “reservar stock” y “liberar stock”.
    • Manejo de Eventos: Escucha OrderConfirmedEvent para actualizar el stock.

Aquí tienes un diagrama UML del Bounded Context de Gestión de Pedidos, creado con Mermaid:

classDiagram
    class Pedido {
        -UUID id
        -List~LineaDePedido~ lineas
        -Direccion direccionEnvio
        -EstadoPedido estado
        -Double montoPago
        +confirmarPago(monto: double)
        +cancelar()
        +getId(): UUID
    }
    class LineaDePedido {
        -UUID productoId
        -int cantidad
        -double precioUnitario
    }
    class Direccion {
        -String calle
        -String ciudad
        -String codigoPostal
    }
    class EstadoPedido {
        <<enumeration>>
        PENDIENTE
        CONFIRMADO
        ENVIADO
        CANCELADO
    }
    Pedido o--> "many" LineaDePedido
    Pedido --> "1" Direccion
    Pedido --> "1" EstadoPedido

Aspectos Técnicos Destacados

Java y Spring Boot

El proyecto usa Java 17 y Spring Boot 3.2.0 para implementar una arquitectura de microservicios robusta. Decisiones técnicas clave incluyen:

  • Arquitectura Limpia: Separar la lógica de dominio de la infraestructura asegura mantenibilidad.
  • Spring Data JPA: Para persistencia con una base de datos H2 en memoria, ideal para desarrollo rápido.
  • Integración con Swagger: Documentación interactiva de APIs mejora la usabilidad.
  • Eventos de Dominio: Simulados con ApplicationEventPublisher de Spring para un acoplamiento bajo.

Prácticas DevOps

Como parte de mi incursión en DevOps, implementé un pipeline de GitHub Actions (.github/workflows/ci.yml) para automatizar compilaciones, pruebas y verificación de cobertura de código. Esto asegura calidad y fiabilidad, alineándose con prácticas modernas de desarrollo.

Preparación para AWS

Aunque el proyecto corre localmente con H2, su arquitectura de microservicios está lista para la nube. Estoy preparándome para certificaciones AWS, y planeo desplegar DddEcommerceOrders en AWS (ej. con ECS o EKS) para demostrar mis habilidades en la nube.

Lecciones Aprendidas

Construir DddEcommerceOrders me enseñó valiosas lecciones:

  • Desafíos de DDD: Definir Bounded Contexts claros y mantener un Lenguaje Ubicuo consistente requirió un modelado cuidadoso.
  • Comunicación entre Microservicios: Usar eventos de dominio para consistencia eventual fue una forma práctica de desacoplar servicios.
  • Depuración de Swagger: Inicialmente, Swagger mostraba “No operations defined in spec!” debido a problemas de escaneo de componentes. Añadir configuración explícita de OpenAPI y logging resolvió esto.
  • Acceso a la Base de Datos: Habilitar la consola H2 (/h2-console) e inicializar datos con data.sql facilitó la depuración.

Estas experiencias reforzaron mi compromiso con el aprendizaje continuo, motivándome a explorar herramientas DevOps y plataformas como AWS.

¡Pruébalo!

El código fuente está disponible en https://github.com/xsoto-developer/DddEcommerceOrders. Para ejecutar el proyecto:

  1. Clona el repositorio:
   git clone https://github.com/xsoto-developer/DddEcommerceOrders.git
  1. Compila y ejecuta cada microservicio:
   cd orders-service
   mvn clean install
   mvn spring-boot:run
   cd ../inventory-service
   mvn clean install
   mvn spring-boot:run
  1. Accede a Swagger UI:
    • Pedidos: http://localhost:8080/swagger-ui.html
    • Inventario: http://localhost:8081/swagger-ui.html
  2. Verifica datos en H2:
    • Navega a http://localhost:8080/h2-console (JDBC URL: jdbc:h2:mem:inventorydb, User: sa, Password: vacío).
    • Ejecuta SELECT * FROM PRODUCTO; para ver productos.

¿Qué Sigue?

Estoy entusiasmado por seguir creciendo como desarrollador. Mis próximos pasos incluyen:

  • Desplegar DddEcommerceOrders en AWS para mostrar experiencia en la nube.
  • Profundizar en DevOps con herramientas como Docker y Kubernetes.
  • Contribuir a proyectos open-source para colaborar con la comunidad global de desarrolladores.

Llamado a la Acción

¡Me encantaría recibir tu feedback sobre DddEcommerceOrders! Explora el proyecto en GitHub, pruébalo y comparte tus ideas. Si eres un reclutador o desarrollador interesado en Java, DDD o DevOps, ¡conectemos para discutir oportunidades de construir software impactante juntos!


This content originally appeared on DEV Community and was authored by Ximena Soto