Visión general de T0
Arranque del módulo: instalar y verificar el entorno, generar el esqueleto de Spring Boot de MULTAGAL, modelar el dominio, aplicar inyección de dependencias, exponer una API REST y dejar el repositorio Git publicado con flujo de trabajo profesional. Las seis actividades (A0.1–A0.6) conforman la ENTREGA 1, que se materializa fusionando la rama hito/ud0-arranque en main.
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.
ud0-completado.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érmino | Significado |
|---|---|
| Denuncia | Constatación de un hecho infractor |
| Expediente | Procedimiento administrativo con número, estado y plazos |
| Notificación | Comunicación formal al interesado |
| Resolución | Acto que cierra el expediente (sanción, sobreseimiento o estimación) |
| Firmeza | Cuando la resolución no admite recurso ordinario |
| Detracción de puntos | Descuento del saldo del permiso con resolución firme |
| Prescripción | Extinción por transcurso de plazo sin actuación |
Entidades del dominio (12)
| Entidad | Descripción |
|---|---|
| Conductor | NIF/NIE, nombre, domicilio, saldo de puntos |
| PermisoConduccion | Clases (A, B, C…), fechas de validez, estado |
| Vehiculo | Matrícula, marca, modelo, tipo, ITV |
| Titularidad | Relación N:M temporal entre Conductor y Vehiculo |
| Infraccion | Catálogo: código, artículo, importe, puntos, gravedad |
| Denuncia | Fecha/hora, lugar, agente/dispositivo, vehículo, conductor |
| Expediente | Tramitación: número, estado, importe, plazos |
| Notificacion | Intentos de notificación con acuse |
| Alegacion | Escrito con documentos adjuntos |
| Resolucion | Acto que cierra el expediente |
| Pago | Abonos con posible bonificación |
| Radar | Dispositivo automático: ubicación, tipo, límite |
Gravedad, EstadoExpediente, EstadoPermiso, ResultadoNotificacion. Objetos valor: Coordenadas, DireccionPostal, Matricula.Titularidad 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
| Regla | Contenido |
|---|---|
| R1 — Bonificación por pronto pago | 50% de descuento si se paga dentro de 20 días naturales tras la notificación, con renuncia a alegaciones |
| R2 — Detracción exige firmeza | La deducción de puntos solo ocurre cuando la resolución es firme |
| R3 — Saldo cero ⇒ permiso suspendido | La 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ón | 3 meses (infracciones leves) o 6 meses (graves/muy graves) desde la comisión sin notificación |
| R5 — No resolver con alegaciones pendientes | Un expediente no puede resolverse con alegaciones pendientes de contestar |
| R6 — Obligación de identificar al conductor | La omisión de identificación genera una infracción autónoma muy grave |
Fases del proyecto (todo el curso)
| Fase | Contenido | Entrega |
|---|---|---|
| 0 | Arranque y entorno (esta unidad) | — |
| 1 | Ingesta/exportación de ficheros | Entrega 1 |
| 2 | Persistencia JDBC | Entrega 1 |
| 3 | Migración JPA/Hibernate | Entrega 2 |
| 4 | Datos objeto-relacionales y geoespaciales | Entrega 2 |
| 5 | Expedientes documentales | Entrega 3 |
| 6 | Componentización e integración | Entrega 3 |
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ón | Genera |
|---|---|
@Getter / @Setter | Getter/setter público por campo (setter no en campos final) |
@ToString | toString() con nombre de clase y campos |
@EqualsAndHashCode | equals() y hashCode() basados en campos |
@NoArgsConstructor / @AllArgsConstructor | Constructor vacío / con todos los campos |
@RequiredArgsConstructor | Constructor con los campos final y @NonNull |
@Data | @Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor |
@Builder | Patrón builder |
@Slf4j | Campo estático log de SLF4J |
equals()/hashCode() basados solo en el identificador (esto se aplicará a partir de UD4, con JPA).Spring — estereotipos e inyección
| Anotación | Uso |
|---|---|
@Component | Bean genérico gestionado por Spring |
@Service | Capa de negocio |
@Repository | Persistencia; traduce excepciones a DataAccessException |
@RestController | @Controller + @ResponseBody (serializa a JSON) |
@Configuration / @Bean | Declara beans manualmente |
@Autowired | Punto de inyección (innecesaria con un único constructor) |
@Qualifier("nombre") / @Primary | Desambiguan qué implementación inyectar |
@Value("${prop}") | Inyecta un valor de application.yml |
@ConditionalOnProperty | Registra el bean solo si la propiedad tiene ese valor |
Validación (Jakarta Bean Validation)
| Anotación | Comprueba |
|---|---|
@NotNull / @NotBlank / @NotEmpty | No nulo / no vacío ni espacios / colección no vacía |
@Size(min=, max=) | Longitud en rango |
@Min/@Max/@DecimalMin/@DecimalMax | Rango numérico (con precisión decimal) |
@Positive/@PositiveOrZero | Signo del número |
@Pattern(regexp=) | Coincide con una expresión regular |
@Valid | Activa 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.
- Diferencia entre imagen, contenedor y máquina virtual.
- Por qué
docker compose down -ves peligroso. - Qué hace
@SpringBootApplication(sus tres anotaciones). - Si
@Serviceestá enes.otro.servicioy la app enes.edu.multagal, ¿qué ocurre al arrancar? - Dos razones para preferir la inyección por constructor frente a la inyección por campo.
- Qué añade
@Repositoryque no añade@Component. - Por qué
@Serviceno debe tener campos mutables. - Orden de precedencia de la configuración en Spring Boot.
- Qué es un starter y qué relación tiene con la autoconfiguración.
- Reglas de dependencia entre capas: ¿puede
controllerllamar arepositorydirectamente? - Por qué
domainno debe importar nada de Spring. - Por qué los importes van en
BigDecimaly no endouble. - Qué aporta el historial de commits a la evaluación.
- Diferencia entre una etiqueta y una rama en Git.
- Diferencia entre validar un DTO con
@Validy una regla de negocio como "el DNI ya está registrado". - Qué ocurre si un método del controlador recibe
@RequestBodysin@Valid.
4Ampliación (opcional, valorada a nivel sobresaliente)
- Actuator: añade
spring-boot-starter-actuatory explora/actuator/health,/actuator/beans,/actuator/configprops. - CI/CD: configura un workflow de GitHub Actions que ejecute
./mvnw testen 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.