{
 "tarjetas": [
  {
   "sub": "Spring Data JPA",
   "nivel": "intermedio",
   "clave": true,
   "q": "JdbcTemplate: para qué sirve y por qué sigue vivo",
   "a": "Acceso JDBC SIN el boilerplate de abrir/cerrar Connection, Statement y ResultSet — tú pones el SQL y los parámetros:\njdbc.query(\"SELECT * FROM users WHERE id = ?\", rowMapper, id);\nIdeal para: queries puntuales, reportes, batch SQL directo, apps sin JPA.\nManeja recursos y excepciones (traduce SQLException a DataAccessException).\nMenos mágico que JPA: tú controlas cada SQL."
  },
  {
   "sub": "Spring Data JPA",
   "nivel": "intermedio",
   "clave": false,
   "q": "Spring Data JDBC vs Spring Data JPA: cuándo cada uno",
   "a": "Spring Data JDBC: ORM MÍNIMO — mapea agregados a tablas sin lazy loading, sin dirty checking, sin sesiones; tú escribes SQL simple. Menos sorpresas, más predecible.\nSpring Data JPA (Hibernate): relaciones lazy, caché, dirty checking, JPQL — más features, más complejidad.\nRegla: dominio simple con agregados planos → Data JDBC; dominio relacional rico → JPA."
  },
  {
   "sub": "Configuración",
   "nivel": "intermedio",
   "clave": false,
   "q": "SpEL (Spring Expression Language): qué permite",
   "a": "Lenguaje de expresiones para valores dinámicos en tiempo de ejecución:\n@Value(\"#{systemProperties['user.name']}\") — con #{...} (SpEL) vs ${...} (properties).\nOperadores, llamadas a métodos, colecciones: #{lista.?[edad > 18]} (selección), #{objeto.nombre?.toUpperCase()}.\nUsos: @PreAuthorize(\"#id == principal.id\"), @Cacheable(key=\"#id\"), @EventListener(condition=\"...\").\nPoderoso pero NO metas lógica de negocio en SpEL."
  },
  {
   "sub": "Boot y starters",
   "nivel": "basico",
   "clave": false,
   "q": "Spring Boot DevTools: qué aporta en desarrollo",
   "a": "Reinicio RÁPIDO al guardar (restart con classloader separado: tus clases recargan, las libs no → segundos vs minutos).\nLiveReload integrado para frontends.\nDeshabilita cachés por defecto en dev.\nSe desactiva SOLO al empaquetar (jar de producción no lo lleva).\nspring-boot-devtools en scope runtime (optional)."
  },
  {
   "sub": "Web MVC y REST",
   "nivel": "basico",
   "clave": true,
   "q": "Anatomía de una petición HTTP (lo básico que nunca está de más)",
   "a": "Request: MÉTODO (GET/POST/PUT...) + PATH (/api/users/1) + HEADERS (Content-Type, Authorization, Accept) + BODY opcional.\nResponse: STATUS (200/404/500) + HEADERS + BODY.\nSin estado: cada request se entiende sola; la 'sesión' viaja en tokens o cookies.\nEn Spring: método=GetMapping, path=RequestMapping, headers=@RequestHeader, body=@RequestBody, status=ResponseEntity."
  }
 ]
}