Skip to content

8. Lista de ejercicios propuestos

lgzarturo edited this page Oct 21, 2025 · 2 revisions

Contexto general para los ejercicios

El curso gira en torno a una aplicación que gestiona viajes y experiencias turísticas, donde el usuario es un viajero que va descubriendo funcionalidades para mejorar su experiencia y la gestión de sus viajes. Cada ejercicio será un "reto" o "misión" que el viajero debe completar para avanzar en su aventura.

Estos ejercicios van más allá del temario base y están diseñados para que pienses como un desarrollador senior, resuelvas problemas del mundo real y refuerces buenas prácticas. Cada uno incluirá en el futuro un objetivo claro, recomendaciones técnicas, profundizar para ir más lejos, se explicará la conexión con el negocio.

  1. Validación Avanzada: Reglas de Negocio complejas.
  2. Caché Inteligente: Integrar Redis de forma estratégica.
  3. Arquitectura Basada en Eventos: Notificaciones en Tiempo Real.
  4. Búsqueda Dinámica con Filtros Avanzados.
  5. Control de Rate Limiting para Proteger la API.
  6. Pruebas de Carga con Escenarios Reales.
  7. Internacionalización (i18n) para Clientes Globales.
  8. Recomendaciones Globales para Mejorar el Código y el Aprendizaje.
  9. Convierte tu API en una Plataforma SaaS, usa multi-tenant.
  10. Importación y exportación avanzada de datos desde CSV o Excel a tu aplicación.

¡Este es el nivel que separa a los juniors de los senior developers!

Cada ejercicio no solo se enfocará en mejorar tu código, sino que te prepara para tomar decisiones de arquitectura con impacto en el negocio.


1. Validación Avanzada: Reglas de Negocio complejas

Narrativa: El viajero debe asegurarse que sus reservas cumplan reglas estrictas para evitar problemas en el viaje.

Ejercicio 1: Validar que la fecha de regreso sea posterior a la fecha de salida y que el viaje no exceda 30 días.

  • Implementar validaciones en el dominio para estas reglas.
  • Crear tests unitarios que validen estas reglas.
  • Simular un caso donde se intente reservar un viaje inválido y lanzar excepción.

Ejercicio 2: Validar que el número de pasajeros no exceda la capacidad máxima del transporte seleccionado.

  • Añadir lógica para validar capacidad máxima.
  • Tests para casos límite y excepciones.

Ejercicio 3: Validar que el destino no esté en una lista negra de países con restricciones.

  • Implementar una lista negra configurable.
  • Validar que no se pueda reservar a esos destinos.
  • Tests para validar comportamiento.

2. Caché Inteligente: Integrar Redis de forma estratégica

Narrativa: El viajero quiere que la app responda rápido, especialmente al consultar destinos populares y detalles de viajes.

Ejercicio 1: Cachear la lista de destinos populares con Redis.

  • Implementar un adaptador de caché Redis.
  • Cachear la consulta de destinos populares por 10 minutos.
  • Tests de integración con Redis (usando Testcontainers).

Ejercicio 2: Cachear detalles de un viaje específico para evitar consultas repetidas a la base de datos.

  • Cachear por viajeId con TTL configurable.
  • Invalidar caché al actualizar el viaje.
  • Tests para validar caché y actualización.

Ejercicio 3: Implementar caché condicional: solo cachear viajes con más de 5 reservas.

  • Añadir lógica para decidir cuándo cachear.
  • Tests para validar comportamiento condicional.

3. Arquitectura Basada en Eventos: Notificaciones en Tiempo Real

Narrativa: El viajero recibe notificaciones en tiempo real sobre cambios en su viaje o alertas importantes.

Ejercicio 1: Publicar evento cuando se crea o actualiza una reserva.

  • Definir evento de dominio.
  • Implementar publisher usando Spring Events o Kafka (según alcance).
  • Tests unitarios para publicación.

Ejercicio 2: Implementar un listener que envíe notificaciones por WebSocket a los usuarios.

  • Configurar WebSocket en Spring Boot.
  • Listener que envíe notificaciones en tiempo real.
  • Tests de integración con WebSocket.

Ejercicio 3: Manejar eventos de error y reintentos en la arquitectura basada en eventos.

  • Implementar mecanismo de reintentos.
  • Tests para simular fallos y recuperación.

4. Búsqueda Dinámica con Filtros Avanzados

Narrativa: El viajero quiere buscar viajes filtrando por fechas, destinos, precio y tipo de experiencia.

Ejercicio 1: Implementar endpoint con filtros básicos (fecha, destino).

  • Usar Specification o Criteria API para consultas dinámicas.
  • Tests de integración para filtros.

Ejercicio 2: Añadir filtros avanzados: rango de precio, tipo de experiencia, número de pasajeros.

  • Extender lógica de filtros.
  • Tests para combinaciones de filtros.

Ejercicio 3: Implementar paginación y ordenamiento dinámico.

  • Añadir paginación y ordenamiento configurable.
  • Tests para validar paginación y orden.

5. Control de Rate Limiting para Proteger la API

Narrativa: Para evitar abusos, la app limita la cantidad de solicitudes que un usuario puede hacer.

Ejercicio 1: Implementar rate limiting básico por IP usando Bucket4j o similar.

  • Configurar filtro o interceptor.
  • Tests para validar límite.

Ejercicio 2: Rate limiting por usuario autenticado con diferentes cuotas según rol.

  • Configurar cuotas diferenciadas.
  • Tests para roles y límites.

Ejercicio 3: Implementar respuesta personalizada cuando se excede el límite.

  • Respuesta JSON con mensaje y tiempo de espera.
  • Tests para validar respuesta.

6. Pruebas de Carga con Escenarios Reales

Narrativa: El viajero quiere asegurarse que la app soporta picos de usuarios en temporada alta.

Ejercicio 1: Crear script de prueba de carga con Gatling o JMeter para endpoint de búsqueda.

  • Simular múltiples usuarios concurrentes.
  • Analizar resultados.

Ejercicio 2: Prueba de carga para creación masiva de reservas.

  • Simular creación concurrente.
  • Medir tiempos y errores.

Ejercicio 3: Integrar pruebas de carga en pipeline CI.

  • Configurar ejecución automática.
  • Reportes y alertas.

7. Internacionalización (i18n) para Clientes Globales

Narrativa: El viajero puede usar la app en varios idiomas según su ubicación.

Ejercicio 1: Configurar mensajes en español e inglés para mensajes de error y UI.

  • Usar archivos messages.properties.
  • Tests para validar mensajes según locale.

Ejercicio 2: Detectar locale desde header HTTP y responder en idioma adecuado.

  • Configurar interceptor o filtro.
  • Tests de integración.

Ejercicio 3: Añadir soporte para formato de fechas y monedas según locale.

  • Usar clases de Java para formateo.
  • Tests para formatos.

8. Recomendaciones Globales para Mejorar el Código y el Aprendizaje

Narrativa: El viajero aprende buenas prácticas para mantener su código limpio y escalable.

Ejercicio 1: Refactorizar un módulo para aplicar arquitectura hexagonal y screaming architecture.

  • Identificar responsabilidades.
  • Reorganizar paquetes y clases.
  • Tests para validar refactor.

Ejercicio 2: Añadir validaciones con Jakarta Validation y manejo global de excepciones.

  • Usar @Valid y @ExceptionHandler.
  • Tests para validaciones y errores.

Ejercicio 3: Configurar análisis estático con Detekt y ktlint.

  • Añadir configuración Gradle.
  • Ejecutar análisis y corregir errores.

9. Convierte tu API en una Plataforma SaaS, usa multi-tenant

Narrativa: El viajero ahora ofrece su app a agencias de viajes, cada una con sus datos aislados.

Ejercicio 1: Implementar esquema multi-tenant por esquema en base de datos.

  • Configurar datasource dinámico.
  • Tests para aislamiento de datos.

Ejercicio 2: Añadir filtro de seguridad para que usuarios solo accedan a su tenant.

  • Configurar Spring Security con tenant context.
  • Tests para acceso restringido.

Ejercicio 3: Implementar migraciones y configuración para múltiples tenants.

  • Usar Flyway o Liquibase.
  • Tests para migraciones.

10. Importación y exportación avanzada de datos desde CSV o Excel a tu aplicación

Narrativa: El viajero puede importar listas de destinos o exportar reportes para análisis.

Ejercicio 1: Implementar importación de destinos desde CSV con validaciones.

  • Usar Apache Commons CSV o similar.
  • Tests para importación y errores.

Ejercicio 2: Exportar reportes de reservas a Excel con formato.

  • Usar Apache POI.
  • Tests para exportación.

Ejercicio 3: Añadir importación/exportación con mapeo dinámico y manejo de errores.

  • Soportar diferentes formatos.
  • Tests para casos complejos.

Nota

Cada tema tiene 3 ejercicios que combinan dominio, aplicación, infraestructura y pruebas, siempre con enfoque en buenas prácticas, arquitectura hexagonal y TDD. La narrativa del viaje se usa para gamificar y contextualizar cada reto, haciendo el aprendizaje más ameno y práctico.

Clone this wiki locally