Semana 14 - Conceptos y términos técnicos
I. Arquitectura y Patrones de Diseño
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| API (Application Programming Interface) | Un conjunto de reglas y especificaciones que permiten que dos piezas de software se comuniquen. Es el contrato que define qué puede pedir un cliente y qué responderá el servidor. | |
| REST (Representational State Transfer) | Un estilo arquitectónico que prescribe cómo debe diseñarse una API para que sea escalable, simple y uniforme. Produce un servicio web sin estado que expone recursos a través de URLs, utiliza métodos HTTP y devuelve datos normalmente en formato JSON. | |
| Patrón de diseño | Una solución reutilizable a un problema común en el diseño de software. Mejora la mantenibilidad, escalabilidad y claridad del sistema. | |
| MVC (Modelo-Vista-Controlador) | Patrón de diseño que separa responsabilidades en tres capas: Modelo (datos y lógica de negocio), Vista (representación al usuario, como JSON) y Controlador (orquesta peticiones y respuestas). | |
| Modelo (Capa) | La capa del patrón MVC que incluye las Entidades JPA, repositorios, servicios, reglas de negocio y validaciones de la aplicación. | |
| Vista (Capa en API REST) | La representación del recurso que se entrega, que en el contexto de una API REST es el JSON serializado (o DTOs). | |
| Controlador (Capa) | La capa que recibe peticiones HTTP, coordina la lógica de negocio llamando al servicio y devuelve la respuesta, implementado como @RestController en Spring Boot. |
|
| Sin estado (Stateless) | Restricción REST que obliga a que cada petición contenga toda la información necesaria, beneficiando la escalabilidad horizontal. | |
| Recurso (REST) | Cualquier cosa que pueda ser nombrada (un usuario, un pedido) y que se identifica mediante una URI única. | |
| Endpoint | La combinación de un verbo HTTP y una ruta que apunta a un recurso o colección (ej. GET /usuarios/5). |
|
| Cliente REST | Cualquier programa que consume la API siguiendo el contrato REST (ej. navegador, aplicación móvil, scripts CLI). | |
| DTO (Data Transfer Object) | Objeto de transferencia de datos. Son objetos que representan la Vista en una API REST y se usan para evitar exponer directamente las entidades JPA. | |
| Servicio en la Nube | Un entorno de ejecución remoto (IaaS, PaaS o SaaS) donde se despliega la API REST, ofreciendo escalabilidad automática, alta disponibilidad y balanceo de carga. | |
| JSON (JavaScript Object Notation) | Formato ligero, nativo en JavaScript, fácil de leer y escribir, y universalmente soportado, que se utiliza generalmente como formato de mensaje en APIs REST. |
II. Componentes y Anotaciones de Spring Boot y REST
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| Spring Boot | Un framework basado en Java que simplifica el desarrollo de aplicaciones empresariales, permitiendo crear proyectos standalone con mínima configuración. | |
| Spring Initializr | Herramienta web que se utiliza para generar y descargar un proyecto base de Spring Boot, seleccionando las dependencias (starters) necesarias. | |
| Starters (Spring Boot) | Plantillas preconfiguradas que Spring Boot proporciona para incluir dependencias comunes, autoconfiguración y un servidor embebido (ej. Spring Web, Spring Data JPA). | |
@RestController |
Anotación que combina @Controller y @ResponseBody, indicando que la clase maneja peticiones REST y retorna datos directamente (JSON). |
|
@RequestMapping |
Anotación que define la ruta base para todos los endpoints del controlador o de una clase. | |
@GetMapping |
Anotación de método HTTP para operaciones de lectura (Read). | |
@PostMapping |
Anotación de método HTTP para crear recursos (Create). | |
@PutMapping |
Anotación de método HTTP para reemplazar completamente un recurso (Update/Replace). Es idempotente. | |
@PatchMapping |
Anotación de método HTTP para realizar actualizaciones parciales de un recurso (Update/Partial). | |
@DeleteMapping |
Anotación de método HTTP para eliminar un recurso (Delete). | |
ResponseEntity |
Clase utilizada para construir respuestas HTTP completas, permitiendo configurar el cuerpo y el código de estado (ej. 201 Created, 204 No Content). | |
@Service |
Anotación que marca una clase como un componente de servicio, donde reside la lógica de negocio. Es una especialización de @Component. |
|
@Transactional |
Anotación que habilita el manejo automático de transacciones de base de datos, asegurando que las operaciones se realicen de forma atómica y que se haga rollback en caso de error. Se puede usar a nivel de clase o método. | |
@Autowired |
Anotación utilizada para la inyección de dependencias (ej. inyectar un Repositorio en un Servicio). | |
@PathVariable |
Anotación para extraer un valor de una variable de la ruta URI (ej. el ID en /productos/{id}). |
|
@RequestParam |
Anotación para obtener parámetros de consulta de la URL (ej. /buscar?nombre=valor). |
|
@RequestBody |
Anotación para mapear el cuerpo de la petición HTTP (normalmente JSON) a un objeto Java (DTO). | |
@Valid |
Anotación usada en parámetros de métodos de controlador para invocar la validación de un DTO (basada en anotaciones como @NotBlank, @Min). |
|
@Validated |
Anotación utilizada para habilitar la validación de parámetros de método en la clase Controladora. | |
@CrossOrigin |
Anotación que gestiona las políticas de CORS (Cross-Origin Resource Sharing). | |
| Composición de servicios | Patrón donde un servicio orquesta operaciones utilizando múltiples otros servicios para completar una transacción compleja. | |
| Cache simple (en memoria) | Patrón avanzado de servicio que utiliza estructuras de datos como ConcurrentHashMap para almacenar resultados de consultas frecuentes y evitar llamadas repetidas a la base de datos. |
III. JPA, Entidades y Bases de Datos
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| JPA (Java Persistence API) | API de persistencia utilizada en Spring Data JPA para definir entidades y manejar el mapeo objeto-relacional (ORM). | |
| ORM (Object-Relational Mapping) | Mapeo de objetos Java (entidades) a registros de bases de datos relacionales. | |
| Entidad (JPA) | Una clase Java anotada con @Entity que representa una tabla en la base de datos relacional. Cada instancia es una fila. |
|
@Entity |
Indica que la clase debe ser mapeada a una tabla en la base de datos. | |
@Table |
Especifica el nombre de la tabla en la base de datos a la que se mapea la entidad. | |
@Id |
Marca un campo como la clave primaria de la entidad. | |
@GeneratedValue |
Define la estrategia (ej. IDENTITY, SEQUENCE) para generar automáticamente los valores de la clave primaria. |
|
@Column |
Especifica detalles sobre cómo un atributo se mapea a una columna (nombre, si es nullable, longitud, si es único). | |
@Transient |
Indica que un campo de la clase no debe ser persistido en la base de datos. | |
@Enumerated |
Mapea un campo de tipo enum a una columna en la base de datos, especificando si se almacena como STRING o ORDINAL. |
|
@CreationTimestamp |
Anotación utilizada para establecer automáticamente la marca de tiempo cuando se crea la entidad. | |
| Lombok | Herramienta que reduce el código repetitivo al generar automáticamente getters, setters y constructores. @Data es una anotación de Lombok que combina varios métodos de generación de código. |
IV. Repositorios y Acceso a Datos
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| Repositorio (Spring Data JPA) | Una interfaz que actúa como una capa de abstracción entre la lógica de negocio y la base de datos, proporcionando métodos CRUD. Spring Data JPA genera su implementación automáticamente. | |
| CRUD | Acrónimo de las operaciones básicas: Create, Read, Update, Delete. | |
JpaRepository<T, ID> |
La interfaz de repositorio más completa en Spring Data JPA, que extiende PagingAndSortingRepository y ofrece funcionalidades completas de JPA. |
|
CrudRepository<T, ID> |
Interfaz que proporciona las operaciones CRUD básicas (save, findById, findAll, deleteById). |
|
PagingAndSortingRepository |
Interfaz que añade funcionalidad de paginación y ordenamiento a los repositorios. | |
| Query Methods (Métodos derivados) | Consultas generadas automáticamente por Spring Data JPA basándose en la convención de nombres del método de la interfaz (ej. findByNombreAndActivo). |
|
@Query |
Anotación utilizada para escribir consultas personalizadas cuando los métodos derivados no son suficientes. Permite usar JPQL o SQL nativo. | |
| JPQL (Java Persistence Query Language) | Lenguaje de consulta orientado a entidades (objetos Java) que se usa con @Query. |
|
| SQL nativo | Consultas escritas directamente en el lenguaje de la base de datos, que deben ser marcadas con nativeQuery = true dentro de @Query. |
|
@Modifying |
Anotación requerida en métodos @Query que realizan operaciones de modificación de datos (UPDATE o DELETE). |
|
Pageable |
Interfaz utilizada en los repositorios para manejar los parámetros de paginación (número de página, tamaño) y ordenamiento. | |
Sort |
Objeto utilizado para definir los criterios de ordenamiento en las consultas. |
V. Relaciones y Serialización (JPA y Jackson)
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| Relaciones en JPA | Mecanismo utilizado para modelar asociaciones entre entidades, correspondientes a las asociaciones entre tablas en bases de datos relacionales. | |
@OneToOne |
Define una relación uno a uno: una instancia de una entidad asociada a exactamente una instancia de otra. | |
@OneToMany |
Define una relación uno a muchos: una instancia de una entidad asociada a múltiples instancias de otra. | |
@ManyToOne |
Define una relación muchos a uno: múltiples instancias de una entidad asociadas a una sola instancia de otra. | |
@ManyToMany |
Define una relación muchos a muchos: requiere una tabla intermedia, ya que múltiples instancias de A se asocian a múltiples instancias de B. | |
@JoinColumn |
Anotación que especifica la columna de la clave foránea en la base de datos, usada típicamente en el lado propietario de la relación. | |
@JoinTable |
Anotación que define la tabla intermedia (o pivote) necesaria para las relaciones muchos a muchos. | |
mappedBy |
Se usa en el lado "inverso" o no propietario de una relación bidireccional para especificar el campo en la otra entidad que gestiona la clave foránea. | |
| Serialización JSON | El proceso de convertir objetos Java (entidades) a una cadena de texto en formato JSON para su transferencia. | |
| Bucles infinitos (en JSON) | Problema de serialización que ocurre cuando dos objetos se referencian mutuamente en una relación bidireccional, causando recursión infinita. | |
@JsonManagedReference |
Anotación de Jackson que se usa en el lado "padre" de una relación bidireccional, indicando que este campo debe incluirse en la serialización JSON. | |
@JsonBackReference |
Anotación de Jackson que se usa en el lado "hijo" de una relación bidireccional, indicando que este campo no debe incluirse en la serialización JSON para prevenir bucles infinitos. | |
CascadeType.ALL |
Propagación de operaciones (guardar, actualizar, eliminar) del padre a las entidades asociadas. | |
FetchType.LAZY |
Estrategia de carga de datos donde la colección o entidad asociada se carga de la base de datos solo cuando se accede a ella, lo cual es mejor para el rendimiento. | |
FetchType.EAGER |
Estrategia de carga de datos donde la colección o entidad asociada se carga inmediatamente al cargar la entidad principal. |
VI. Documentación de API con OpenAPI
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| OpenAPI | Estándar de especificación que permite estandarizar la descripción de una API REST. | |
| springdoc-openapi | Herramienta utilizada en Spring Boot para generar automáticamente la documentación OpenAPI. | |
| JSON OpenAPI | El archivo JSON que contiene la descripción completa de la API según el estándar OpenAPI. Por defecto, se expone en la ruta /v3/api-docs. |
|
| Swagger UI | Interfaz gráfica de usuario que visualiza y permite interactuar con la documentación OpenAPI generada. Se accede por defecto en /swagger-ui/index.html. |
|
OpenAPI bean |
Objeto de configuración en Java utilizado para personalizar la metadata (título, versión, descripción) del documento OpenAPI generado. | |
@Operation |
Anotación utilizada para documentar el propósito o resumen de un método específico del controlador REST. | |
@ApiResponse / ApiResponses |
Anotaciones utilizadas para documentar los posibles códigos de respuesta HTTP y sus descripciones para una operación (ej. código "200" OK). |
VII. Servicios (Capa de Negocio)
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| Servicio (Capa) | Capa que encapsula la lógica de negocio y coordina transacciones, validaciones de dominio y composición de repositorios. Expone métodos coherentes para el controlador. | |
@Service |
Anotación que marca una clase como componente de servicio. Facilita la detección automática y la inyección de dependencias. | |
@Transactional (en Servicios) |
Define límites transaccionales: asegura atomicidad de operaciones; soporta configuración de propagación e aislamiento a nivel de método. | |
| Validaciones de negocio | Reglas propias del dominio (no solo bean validation). Se aplican en métodos de servicio para garantizar consistencia y evitar estados inválidos. | |
| Composición/Orquestación | Un servicio puede coordinar varios repositorios y otros servicios para cumplir un caso de uso complejo. | |
| Mapeo DTO/Entidad | Conversión entre entidades y DTOs para aislar la capa de presentación. Herramientas comunes: ModelMapper, MapStruct. | |
| Paginación y Filtros | Los servicios reciben Pageable/Sort y aplican filtros de negocio antes de devolver resultados a controladores. |
|
| Idempotencia | Propiedad deseable en operaciones de actualización para evitar efectos secundarios al reintentar. Se diseña en la lógica de servicio. | |
| Caché (Spring Cache) | Mejora rendimiento con @Cacheable, @CacheEvict, @CachePut. Integraciones típicas: Caffeine, Ehcache, Redis. |
|
Asincronía (@Async) |
Permite ejecutar tareas en segundo plano (envío de correos, cálculos). Requiere habilitar @EnableAsync y planificar el pool de hilos. |
|
| Eventos de dominio | Comunicación desacoplada con ApplicationEventPublisher y @EventListener para reaccionar a sucesos del negocio. |
XIII. Controladores (Capa API REST)
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| Controlador (Capa) | Punto de entrada HTTP de la API. Orquesta la petición, valida entrada, delega a servicios y construye la respuesta. | |
@RestController |
Define una clase de controlador REST (combina @Controller y @ResponseBody). Retorna JSON por defecto. |
|
@RequestMapping |
Configura la ruta base y/o verbos HTTP. Útil para versionado (/api/v1). |
|
@GetMapping / @PostMapping / @PutMapping / @PatchMapping / @DeleteMapping |
Mapean métodos a verbos HTTP para operaciones CRUD. | |
@PathVariable |
Extrae variables desde la ruta (ej. /productos/{id}). |
|
@RequestParam |
Obtiene parámetros de consulta (ej. /buscar?nombre=valor). |
|
@RequestBody |
Mapea el cuerpo JSON de la petición a un DTO. | |
ResponseEntity |
Construye respuestas HTTP con cuerpo y código de estado (200, 201, 204, 400, 404). | |
@Valid / @Validated |
Activa validaciones de DTO y parámetros; integra con el manejador global de errores. | |
Paginación (Pageable, Page) |
Soporte para paginar y ordenar resultados en endpoints GET. |
|
| Serialización (Jackson) | Convierte objetos Java a JSON; cuidado con relaciones y bucles infinitos. | |
| DTOs | Separan la capa de presentación de las entidades JPA; controlan qué datos se exponen. | |
CORS (@CrossOrigin) |
Permite peticiones desde otros dominios. Configurable por anotación o global. | |
| HATEOAS (avanzado) | Agrega enlaces en respuestas para navegabilidad de recursos. | |
Documentación (@Operation, @ApiResponses) |
Anota endpoints para generar documentación con OpenAPI/Swagger. | |
| Buenas prácticas | Mantener controladores delgados, delegar la lógica a servicios, usar códigos HTTP adecuados y versionar rutas. |
IX. Seguridad
| Término Técnico | Significado / Descripción | Fuentes |
|---|---|---|
| Spring Security | Framework de seguridad para autenticación, autorización y protección de endpoints. Se integra de forma declarativa y extensible. | |
| Autenticación vs Autorización | Autenticación verifica identidad; autorización controla qué acciones puede realizar el usuario autenticado. | |
| Roles y Authorities | Permisos granulares (authority) y roles (ROLE_ADMIN). Se usan en reglas de acceso y anotaciones. |
|
SecurityFilterChain |
Bean que define la cadena de filtros de seguridad (HTTP). Configura rutas públicas/privadas, CORS, CSRF, sesiones y excepciones. | |
UserDetailsService |
Componente que carga usuarios por nombre de usuario desde base de datos u origen externo. | |
PasswordEncoder (BCrypt) |
Codificador de contraseñas seguro. BCryptPasswordEncoder es recomendado por su resistencia a ataques de fuerza bruta. |
|
AuthenticationProvider / AuthenticationManager |
Encargados de verificar credenciales y producir un Authentication válido. |
|
| JWT (Bearer Token) | Token firmado que representa al usuario. Se usa en APIs stateless junto con SessionCreationPolicy.STATELESS. |
|
| OAuth2 Resource Server | Configuración para validar JWT emitidos por un proveedor externo (Keycloak, Auth0). Dependencia: spring-boot-starter-oauth2-resource-server. |
|
| CSRF | Protección contra falsificación de peticiones. En APIs REST stateless normalmente se deshabilita; en apps con sesión y formularios se habilita. | |
| CORS | Permite peticiones desde otros orígenes. Se configura vía CorsConfigurationSource o anotaciones como @CrossOrigin. |
|
| Seguridad a nivel de método | Control con @PreAuthorize, @PostAuthorize, @Secured. Se habilita con @EnableMethodSecurity (Spring Security 6). |
|
SecurityContextHolder |
Almacena el contexto de seguridad actual (usuario autenticado y authorities) accesible desde servicios/controladores. | |
| Manejo de excepciones | AuthenticationEntryPoint (401) y AccessDeniedHandler (403) para respuestas consistentes ante credenciales inválidas o permisos insuficientes. |
|
| Política de sesión | SessionCreationPolicy.STATELESS para APIs con JWT; STATELESS evita almacenar sesiones en el servidor. |