Skip to content

3. Roadmap del curso

Arturo Lopez edited this page Apr 8, 2026 · 5 revisions

Ruta de Aprendizaje: Los Seis Gimnasios

El curso sigue la historia de Kai construyendo el Hotel Pokémon. Cada gimnasio corresponde a un dominio técnico que todo ingeniero backend de nivel medio-senior debe dominar.


💎 Gimnasio 1 — Pewter: Los Cimientos de la Persistencia

Líder: Brock | Insignia: Boulder Badge

Antes de construir cualquier otra cosa, el Hotel Pokémon necesita guardar datos correctamente. Este gimnasio obliga a pensar el modelo de dominio antes de escribir controllers — el orden correcto de razonamiento.

  • Mapeo de entidades JPA con Kotlin: @Entity, @Column, @GeneratedValue
  • Relaciones reales: @OneToMany, @ManyToOne, @ManyToMany con tabla intermedia
  • FetchType.LAZY como regla, EAGER como excepción justificada
  • Migraciones con Flyway: versionado de esquemas, seed data (V001__init.sql)
  • Spring Data JPA: queries derivadas, JPQL, queries nativas
  • Optimistic locking con @Version para concurrencia en reservas simultáneas

Desafío clave: detectar solapamiento de fechas en reservas con una query SQL que verifica si dos intervalos se intersectan.


⚡ Gimnasio 2 — Vermilion: El Escudo Eléctrico

Líder: Lt. Surge | Insignia: Thunder Badge

Team Rocket ha intentado entrar al sistema. Es hora de blindar el Hotel Pokémon.

  • Spring Security con Kotlin DSL
  • Autenticación stateless con JWT: estructura del token, qué va en el payload, qué nunca debe ir ahí
  • Access tokens (24h) + Refresh tokens (7 días con rotación)
  • Autorización basada en roles (TRAINER, GYM_LEADER, PROFESOR_OAK) con @PreAuthorize
  • Seguridad a nivel de método: @reservationSecurity.isOwner(#id, principal.id)
  • Protección contra ataques: SQL injection, CSRF en APIs stateless, CORS

🌊 Gimnasio 3 — Cerulean: La Disciplina de la Precisión

Líder: Misty | Insignia: Cascade Badge

Un sistema que acepta datos inválidos miente sobre su propio estado.

  • Bean Validation: @NotBlank, @Email, @Min, @Future, constraints personalizados con @Constraint
  • @Valid en controllers y cascada en objetos anidados
  • Manejo estructurado de errores: @RestControllerAdvice, @ExceptionHandler, formato RFC 7807
  • Excepciones de dominio con semántica clara: RoomNotAvailableException, DuplicateEmailException
  • Códigos HTTP correctos: diferencia entre 400, 404, 409 y 422
  • @Transactional: cuándo es necesario y por qué readOnly = true importa

🌱 Gimnasio 4 — Celadon: El Arte del Testing

Líder: Erika | Insignia: Rainbow Badge

El código sin tests no es código terminado, es deuda técnica disfrazada de progreso.

  • Unit tests: dominio puro con MockK, sin Spring context, en <1ms por test
  • Tests de controlador: @WebMvcTest + MockMvc, solo carga la capa web
  • Tests de repositorio: @DataJpaTest con H2, verifica queries personalizadas
  • Tests de integración: BaseIntegrationTest + Testcontainers con PostgreSQL real
  • Tests E2E: @SpringBootTest con TestRestTemplate
  • Cobertura con JaCoCo: mínimo 85% como señal de alerta, no como número sagrado
  • TDD: primero el test, luego la implementación
  • Pirámide de tests: la mayoría deben ser unit tests

Insight clave: Testcontainers resuelve el problema clásico de "pasan en H2 pero fallan en Postgres".


🌋 Gimnasio 5 — Cinnabar: Ver para Operar

Líder: Blaine | Insignia: Volcano Badge

Un sistema que no puede ser observado no puede ser operado.

  • Logging estructurado: logs como JSON con campos buscables (userId, reservationId, traceId)
  • Niveles de log: DEBUG en desarrollo, INFO para eventos de negocio, WARN para situaciones recuperables, ERROR cuando algo realmente falla
  • Métricas con Micrometer + Prometheus: contadores, gauges, histogramas
  • Spring Actuator: endpoints de health, info, metrics
  • Distributed Tracing con OpenTelemetry
  • Sentry para error tracking: captura de excepciones no manejadas con stack trace completo

🌍 Gimnasio 6 — Viridian: La Automatización Total

Líder: Giovanni | Insignia: Earth Badge

El código que no está en producción no entrega valor.

  • Docker: contenedorizar la aplicación, Docker Compose para desarrollo local
  • GitHub Actions: pipeline CI/CD completo (build, test, análisis estático, deploy)
  • Análisis estático con Detekt: code smells, reglas de calidad
  • KTLint: formateo consistente del código Kotlin
  • Conventional Commits: feat: genera minor, fix: genera patch (con semantic-release)
  • Estrategia de branching: feature/, fix/, chore/, protección de main

🏆 Liga Pokémon: Proyecto Integrador

Después de las seis insignias, Kai construye desde cero el módulo de reviews: entrenadores que completaron su estancia pueden dejar una reseña de 1-5 estrellas. Solo usuarios autenticados con estancia confirmada pueden crear reseñas.

Este módulo cubre todo el stack:

  • Entidad JPA con relación a User y Reservation
  • Validación de negocio (solo post-checkout)
  • Endpoints REST con autorización por rol
  • Unit tests + integration tests + E2E
  • Logs y métricas
  • Pipeline CI que lo valida automáticamente

Temas adicionales (sprint avanzado)

  • Kotlin coroutines para procesamiento asíncrono
  • Spring Application Events o Kafka para eventos de dominio
  • WebSockets para notificaciones en tiempo real
  • OAuth2 para login con Google/GitHub
  • Internacionalización: mensajes de error en el idioma del cliente
  • JMeter para pruebas de carga (1,000 reservas simultáneas)
  • Despliegue en AWS Elastic Beanstalk

Clone this wiki locally