<aside>
Contenido
</aside>
<aside>
Un solo punto para manejar todas las excepciones. Retorna respuestas consistentes con estructura {timestamp, status, error, message, path}.
No validamos manualmente en el Service. Usar @NotBlank, @Positive, @Size en los DTOs. Spring Boot 4 con Jakarta Validation lo maneja nativamente.
No usamos conversiones manuales. MapStruc genera código en tiempo de compilación (zero-cost en runtime). Se elige MapStruct sobre ModelMapper porque genera código estático, no usa reflection, y es type-safe.
Cada movimiento debe ser atómico. Usar @Transactional en el Service para que la actualización del saldo y el registro del movimiento sean una sola transacción.
Los endpoints deben va como /api/v1/clientes
Spring Boot 4 tiene soporte nativo para API Versioning
BigDecimal para dinero (precisión, no Double).@Transactional(readOnly = true) en lecturas (evita dirty-checking).open-in-view: false (evita queries N+1 silenciosas).unique en campos de búsqueda.try/catch en ClienteRestClient (si ms-clientes está caído, la cuenta se crea sin nombre)GlobalExceptionHandler (errores controlados, nunca stack traces al cliente)ms-clientes tiene un error momentáneo, el sistema reintenta antes de rendirse. Combinado con la sincronización asíncrona de RabbitMQ, el sistema es resiliente tanto a fallos transitorios como a caídas prolongadas.
</aside>