Tu progreso en el tema

El progreso se guarda en este navegador. Inicia sesión para sincronizarlo entre dispositivos.

✓Cómo usar esta guía

  • Empieza por A0.1 · Entorno y avanza en orden: cada actividad da por hecho que la anterior está terminada (el esqueleto necesita el entorno; el servicio necesita el dominio; el controlador necesita el servicio).
  • Cada página de actividad es autosuficiente: teoría, pasos, comandos y criterios. No necesitas volver aquí para completarla.
  • Marca las casillas conforme avanzas; el menú lateral y la barra de arriba se actualizan solas.
  • Los bloques de código tienen botón Copiar.
Meta del temaAl terminar T0 tendrás: entorno de desarrollo verificado, aplicación Spring Boot arrancando con sus tres servicios de datos en Docker, modelo de dominio de MULTAGAL sin dependencias de persistencia, un primer servicio con inyección de dependencias y pruebas unitarias, un endpoint REST validado, y un repositorio Git publicado con historial, Pull Request fusionado y etiqueta ud0-completado.
Dato contradictorio en la fuenteLa presentación del módulo (apartado a) dice que UD0 dura 6 horas; la propia página de actividades (apartado i) dice 7 horas totales para las seis actividades. No se resuelve aquí: usa la que te dé tu profesor como referencia de planificación.

1El proyecto MULTAGAL

Contexto transversal a todo el módulo: lo necesitarás en A0.3 (modelado) y en las siguientes unidades. Aquí tienes la versión completa; cada actividad solo repite lo que necesita para completarse sola.

MULTAGAL es un sistema de gestión de sanciones de tráfico que cubre el ciclo completo de una denuncia: captación, tramitación, notificación, alegaciones, resolución, pago y detracción de puntos.

Glosario administrativo

TérminoSignificado
DenunciaConstatación de un hecho infractor
ExpedienteProcedimiento administrativo con número, estado y plazos
NotificaciónComunicación formal al interesado
ResoluciónActo que cierra el expediente (sanción, sobreseimiento o estimación)
FirmezaCuando la resolución no admite recurso ordinario
Detracción de puntosDescuento del saldo del permiso con resolución firme
PrescripciónExtinción por transcurso de plazo sin actuación

Entidades del dominio (12)

EntidadDescripción
ConductorNIF/NIE, nombre, domicilio, saldo de puntos
PermisoConduccionClases (A, B, C…), fechas de validez, estado
VehiculoMatrícula, marca, modelo, tipo, ITV
TitularidadRelación N:M temporal entre Conductor y Vehiculo
InfraccionCatálogo: código, artículo, importe, puntos, gravedad
DenunciaFecha/hora, lugar, agente/dispositivo, vehículo, conductor
ExpedienteTramitación: número, estado, importe, plazos
NotificacionIntentos de notificación con acuse
AlegacionEscrito con documentos adjuntos
ResolucionActo que cierra el expediente
PagoAbonos con posible bonificación
RadarDispositivo automático: ubicación, tipo, límite
Enumerados y objetos valorEnumerados: Gravedad, EstadoExpediente, EstadoPermiso, ResultadoNotificacion. Objetos valor: Coordenadas, DireccionPostal, Matricula.
Relaciones claveTitularidad es N:M con atributos (fechas de alta/baja) y temporal. Denuncia.conductor puede ser null: los radares captan matrículas, no personas.

Reglas de negocio

ReglaContenido
R1 — Bonificación por pronto pago50% de descuento si se paga dentro de 20 días naturales tras la notificación, con renuncia a alegaciones
R2 — Detracción exige firmezaLa deducción de puntos solo ocurre cuando la resolución es firme
R3 — Saldo cero ⇒ permiso suspendidoLa actualización del saldo y el cambio de estado del permiso deben ser atómicos (caso transaccional central del curso, se trabaja en unidades posteriores)
R4 — Prescripción3 meses (infracciones leves) o 6 meses (graves/muy graves) desde la comisión sin notificación
R5 — No resolver con alegaciones pendientesUn expediente no puede resolverse con alegaciones pendientes de contestar
R6 — Obligación de identificar al conductorLa omisión de identificación genera una infracción autónoma muy grave

Fases del proyecto (todo el curso)

FaseContenidoEntrega
0Arranque y entorno (esta unidad)—
1Ingesta/exportación de ficherosEntrega 1
2Persistencia JDBCEntrega 1
3Migración JPA/HibernateEntrega 2
4Datos objeto-relacionales y geoespacialesEntrega 2
5Expedientes documentalesEntrega 3
6Componentización e integraciónEntrega 3
Protección de datosNo incorpores datos reales de personas. Usa datos de prueba seudonimizados y nunca dejes credenciales de base de datos en el código fuente.

2Referencia rápida de anotaciones

Chuleta condensada (fuente: apartado j). Úsala mientras haces A0.2, A0.3, A0.4 y A0.5; el examen oral puede pedirte explicar qué código genera cualquiera de ellas.

Lombok

AnotaciónGenera
@Getter / @SetterGetter/setter público por campo (setter no en campos final)
@ToStringtoString() con nombre de clase y campos
@EqualsAndHashCodeequals() y hashCode() basados en campos
@NoArgsConstructor / @AllArgsConstructorConstructor vacío / con todos los campos
@RequiredArgsConstructorConstructor con los campos final y @NonNull
@Data@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor
@BuilderPatrón builder
@Slf4jCampo estático log de SLF4J
Cuidado con @DataSobre entidades JPA con relaciones puede causar cargas perezosas inesperadas o bucles infinitos. Mejor anotaciones sueltas y equals()/hashCode() basados solo en el identificador (esto se aplicará a partir de UD4, con JPA).

Spring — estereotipos e inyección

AnotaciónUso
@ComponentBean genérico gestionado por Spring
@ServiceCapa de negocio
@RepositoryPersistencia; traduce excepciones a DataAccessException
@RestController@Controller + @ResponseBody (serializa a JSON)
@Configuration / @BeanDeclara beans manualmente
@AutowiredPunto de inyección (innecesaria con un único constructor)
@Qualifier("nombre") / @PrimaryDesambiguan qué implementación inyectar
@Value("${prop}")Inyecta un valor de application.yml
@ConditionalOnPropertyRegistra el bean solo si la propiedad tiene ese valor

Validación (Jakarta Bean Validation)

AnotaciónComprueba
@NotNull / @NotBlank / @NotEmptyNo nulo / no vacío ni espacios / colección no vacía
@Size(min=, max=)Longitud en rango
@Min/@Max/@DecimalMin/@DecimalMaxRango numérico (con precisión decimal)
@Positive/@PositiveOrZeroSigno del número
@Pattern(regexp=)Coincide con una expresión regular
@ValidActiva la validación en cascada de parámetros/campos anidados

3Autoevaluación de la unidad

De la propia página de actividades (apartado i): preguntas pensadas para responder sin consultar, de cara a la defensa oral.

  1. Diferencia entre imagen, contenedor y máquina virtual.
  2. Por qué docker compose down -v es peligroso.
  3. Qué hace @SpringBootApplication (sus tres anotaciones).
  4. Si @Service está en es.otro.servicio y la app en es.edu.multagal, ¿qué ocurre al arrancar?
  5. Dos razones para preferir la inyección por constructor frente a la inyección por campo.
  6. Qué añade @Repository que no añade @Component.
  7. Por qué @Service no debe tener campos mutables.
  8. Orden de precedencia de la configuración en Spring Boot.
  9. Qué es un starter y qué relación tiene con la autoconfiguración.
  10. Reglas de dependencia entre capas: ¿puede controller llamar a repository directamente?
  11. Por qué domain no debe importar nada de Spring.
  12. Por qué los importes van en BigDecimal y no en double.
  13. Qué aporta el historial de commits a la evaluación.
  14. Diferencia entre una etiqueta y una rama en Git.
  15. Diferencia entre validar un DTO con @Valid y una regla de negocio como "el DNI ya está registrado".
  16. Qué ocurre si un método del controlador recibe @RequestBody sin @Valid.

4Ampliación (opcional, valorada a nivel sobresaliente)

  • Actuator: añade spring-boot-starter-actuator y explora /actuator/health, /actuator/beans, /actuator/configprops.
  • CI/CD: configura un workflow de GitHub Actions que ejecute ./mvnw test en cada push y bloquee el merge si las pruebas fallan.
  • Datos sintéticos: escribe un componente generador de conductores, vehículos y denuncias verosímiles y seudonimizados.
  • Diagrama entidad-relación: completa el diagrama ER de MULTAGAL en el README.

Contenido reestructurado a partir de accesodatos.netlify.app (Tema 0). Fuente única de la verdad para cualquier duda de detalle.