🎮 Ejercicios Spring Boot Kotlin
Serie de retos prácticos gamificados para dominar Spring Boot con arquitectura hexagonal y TDD.
📋 Contexto
Aprender frameworks requiere práctica deliberada. Estos ejercicios gamifican el aprendizaje mediante una narrativa de viajes y retos.
🎯 Objetivo
Desarrollar habilidades prácticas en:
- Validación de reglas de negocio complejas
- Caché con Redis
- Arquitectura basada en eventos
- Búsqueda dinámica
- Rate limiting
- Pruebas de carga
📦 Alcance
Incluye: 8 módulos de ejercicios progresivos Prerrequisitos: Proyecto Spring Boot base configurado
🏛️ Ejercicios
1. Validación Avanzada
Narrativa: El viajero debe asegurar que sus reservas cumplan reglas estrictas.
| Ejercicio | Descripción | Dificultad |
|---|---|---|
| 1.1 | Validar fecha regreso > fecha salida, máximo 30 días | ⭐ |
| 1.2 | Validar número de pasajeros ≤ capacidad del transporte | ⭐⭐ |
| 1.3 | Validar destino no esté en lista negra | ⭐⭐ |
Pistas:
- Usar validación custom con
@Constraint - Tests unitarios para cada regla
- Excepciones de dominio específicas
2. Caché Inteligente (Redis)
Narrativa: La app debe responder rápido para consultas frecuentes.
| Ejercicio | Descripción | Dificultad |
|---|---|---|
| 2.1 | Cachear lista de destinos populares (TTL 10 min) | ⭐ |
| 2.2 | Cachear detalles de viaje por ID con invalidación | ⭐⭐ |
| 2.3 | Caché condicional: solo viajes con >5 reservas | ⭐⭐⭐ |
Stack: Redis + Spring Cache + Testcontainers
3. Arquitectura Basada en Eventos
Narrativa: Notificaciones en tiempo real sobre cambios en viajes.
| Ejercicio | Descripción | Dificultad |
|---|---|---|
| 3.1 | Publicar evento al crear/actualizar reserva | ⭐ |
| 3.2 | Listener WebSocket para notificaciones push | ⭐⭐ |
| 3.3 | Mecanismo de reintentos con backoff exponencial | ⭐⭐⭐ |
Patrones: Domain Events, Outbox Pattern
4. Búsqueda Dinámica
Narrativa: El viajero busca viajes por múltiples criterios.
| Ejercicio | Descripción | Dificultad |
|---|---|---|
| 4.1 | Filtros básicos: fecha, destino (Specification API) | ⭐ |
| 4.2 | Filtros avanzados: rango precio, tipo experiencia | ⭐⭐ |
| 4.3 | Paginación y ordenamiento dinámico | ⭐⭐ |
API: Spring Data JPA Specifications
5. Rate Limiting
Narrativa: Proteger la API de abusos.
| Ejercicio | Descripción | Dificultad |
|---|---|---|
| 5.1 | Rate limiting por IP (Bucket4j) | ⭐ |
| 5.2 | Cuotas diferenciadas por rol de usuario | ⭐⭐ |
| 5.3 | Respuesta personalizada con tiempo de espera | ⭐⭐ |
6. Pruebas de Carga
Narrativa: Verificar que la app soporta temporada alta.
| Ejercicio | Descripción | Dificultad |
|---|---|---|
| 6.1 | Script Gatling/JMeter para endpoint de búsqueda | ⭐⭐ |
| 6.2 | Prueba de creación masiva de reservas | ⭐⭐ |
| 6.3 | Integrar pruebas de carga en CI | ⭐⭐⭐ |
7. Internacionalización (i18n)
Narrativa: La app disponible en múltiples idiomas.
| Ejercicio | Descripción | Dificultad |
|---|---|---|
| 7.1 | Mensajes en español e inglés | ⭐ |
| 7.2 | Detectar locale desde header HTTP | ⭐ |
| 7.3 | Formato de fechas y monedas por locale | ⭐⭐ |
8. Multi-tenant SaaS
Narrativa: Ofrecer la app a múltiples agencias con datos aislados.
| Ejercicio | Descripción | Dificultad |
|---|---|---|
| 8.1 | Esquema multi-tenant por schema en DB | ⭐⭐⭐ |
| 8.2 | Datasource dinámico por tenant | ⭐⭐⭐ |
| 8.3 | Tests de aislamiento de datos | ⭐⭐⭐ |
🎯 Entregables por Ejercicio
src/
├── domain/ # Modelos y reglas de negocio
├── application/ # Casos de uso (services)
├── infrastructure/ # Repositorios, caché, eventos
├── api/ # Controllers
└── test/
├── unit/ # Tests de dominio
├── integration/ # Tests con Testcontainers
└── load/ # Scripts Gatling
✅ Criterios de Aceptación
- Tests unitarios >80% cobertura
- Tests de integración con Testcontainers
- Documentación del diseño (ADR)
- Código formateado (ktlint)
- Pipeline CI pasa