5 proyectos progresivos cubriendo fundamentos de Spring Boot, APIs REST y conceptos core. Perfecto para principiantes aprendiendo desarrollo Java empresarial.
-
springboot-first-app
Perfiles Activos y Gestión de Configuración- Tecnología: Spring Boot 2.7.1, Java 11
- Concepto: Perfiles de Spring para comportamiento específico por entorno
- Ejemplo: Servicio meteorológico con perfiles "sunny" y "raining"
- Caso de uso: Gestión de configuración, separación de entornos
- Lección: Cómo cambiar comportamiento de aplicación con perfiles
-
springboot-backend
Configuración, Properties y Gestión de Secrets- Tecnología: Spring Boot 2.7.1, Java 11
- Conceptos: Perfiles Spring, propiedades externas, secrets
- Ejemplo: Sistema de gestión de empleados con MySQL
- Características:
- Múltiples perfiles de entorno (dev, test, prod)
- Archivos de configuración externalizados
- Manejo de propiedades secretas
- Docker Compose para base de datos local
- Caso de uso: Patrones de configuración del mundo real
- Lección: Gestionar configuración a través de entornos
- springboot-transaction
Gestión de Transacciones y Consistencia de Datos- Tecnología: Spring Boot 2.7.1, Java 11
- Concepto: Transacciones ACID y atomicidad
- Ejemplo: Procesamiento de pedidos e-commerce con pagos
- Características:
- Uso de anotación @Transactional
- Rollback en errores
- Operaciones con múltiples entidades
- Base de datos MySQL (Docker Compose)
- Escenario: Pedido falla si el pago falla (operación atómica)
- Caso de uso: Transacciones financieras, procesamiento de pedidos
- Lección: Asegurar consistencia de datos con transacciones
-
springboot-blog-rest-api
API REST Completa con Autenticación y Autorización- Tecnología: Spring Boot 2.7.1, Java 11
- Arquitectura: Tres capas (Controller → Service → Repository)
- Características:
- Autenticación basada en JWT
- Autorización basada en roles
- Base de datos MySQL con JPA/Hibernate
- Documentación Swagger/SpringFox
- Manejo de excepciones
- DTOs y ModelMapper
- Entidades: User, Post, Comment, Role
- Operaciones: CRUD completo para posts y comentarios
- Seguridad: Spring Security con tokens JWT
- Documentación: Docs de API Swagger autogeneradas
- Caso de uso: API de blog lista para producción
- Lección: Desarrollo completo de API REST segura
-
springboot-search-rest-api
API REST con Funcionalidad de Búsqueda Avanzada- Tecnología: Spring Boot 2.7.1, Java 11
- Arquitectura: Arquitectura en capas con patrones CRUD
- Características:
- Búsqueda por palabras clave (nombre, descripción)
- Queries JPQL (Java Persistence Query Language)
- Queries SQL nativas
- Base de datos MySQL con JPA/Hibernate
- Configuración Docker Compose
- Adminer para gestión de base de datos
- Endpoints:
- GET /api/v1/products/search1 (JPQL)
- GET /api/v1/products/search2 (SQL Nativo)
- POST /api/v1/products/create
- Caso de uso: Búsqueda de productos, filtrado, sistemas de catálogo
- Lección: Múltiples enfoques de queries en Spring Data
┌─────────────────────────────┐
│ Capa Controller │ ← Endpoints REST, manejo peticiones
├─────────────────────────────┤
│ Capa Service │ ← Lógica negocio, transacciones
├─────────────────────────────┤
│ Capa Repository │ ← Acceso datos, JPA/Hibernate
├─────────────────────────────┤
│ Capa Entity/Model │ ← Objetos dominio, mapeo BD
├─────────────────────────────┤
│ Capa Base de Datos │ ← MySQL, persistencia
└─────────────────────────────┘
Controller
↓ (inyecta)
Service
↓ (inyecta)
Repository
↓ (usa)
JPA/Hibernate
↓ (mapea)
Entidad de Base de Datos
| Proyecto | Enfoque | Nivel | Base de Datos | Seguridad | Docs API |
|---|---|---|---|---|---|
| springboot-first-app | Perfiles | Principiante | N/A | Ninguna | Ninguna |
| springboot-backend | Configuración | Principiante | MySQL | Ninguna | Ninguna |
| springboot-transaction | Transacciones | Intermedio | MySQL | Ninguna | Ninguna |
| springboot-blog-rest-api | API REST Completa | Avanzado | MySQL | JWT | Swagger |
| springboot-search-rest-api | Búsqueda y Queries | Avanzado | MySQL | Ninguna | Ninguna |
springboot-first-app
├─ Activación de perfiles
├─ Creación condicional de beans
└─ Comportamiento específico por entorno
Conceptos:
- Anotación
@Profile - Propiedad
spring.profiles.active - Múltiples archivos
application-{profile}.properties
Ejemplo:
# Ejecutar con perfil
java -jar app.jar --spring.profiles.active=rainingspringboot-backend
├─ Propiedades externas
├─ Perfiles de entorno (dev/test/prod)
├─ Gestión de secrets
└─ Configuración Docker Compose
Conceptos:
@ConfigurationProperties- Jerarquía de archivos de propiedades
- Sustitución de variables de entorno
- Perfiles Spring para diferentes entornos
Ejemplo:
# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/db_dev
# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-server:3306/db_prodspringboot-transaction
├─ Anotación @Transactional
├─ Comportamiento de rollback
├─ Garantía de atomicidad
└─ Operaciones múltiples
Conceptos:
- Transacciones ACID
- Niveles de propagación
- Niveles de aislamiento
- Rollback en excepciones
Escenario de Ejemplo:
Crear Pedido (id=1)
↓
Crear Pago (order_id=1)
↓ ¡Pago Falla!
└─ Rollback: Pedido eliminado, Pago nunca creado
Resultado: Operación atómica (todo o nada)
Código:
@Transactional
public void createOrder(OrderRequest request) {
Order order = orderRepository.save(new Order(...));
Payment payment = paymentService.process(...);
// Si el pago falla, toda la transacción hace rollback
}springboot-blog-rest-api
├─ Endpoints REST (CRUD)
├─ Autenticación (JWT)
├─ Autorización (Roles)
├─ Manejo de errores
├─ Documentación API (Swagger)
└─ Validación de datos
Arquitectura:
POST /api/auth/register
↓
AuthController.register()
↓
AuthService.register()
├─ Validar entrada
├─ Hashear contraseña
└─ Guardar usuario
POST /api/posts
├─ Verificar token JWT
├─ Comprobar autorización
↓
PostController.createPost()
↓
PostService.createPost()
└─ Guardar en base de datos
Endpoints:
POST /api/auth/register- Registro de usuarioPOST /api/auth/login- Generación token JWTGET /api/posts- Listar todos los postsPOST /api/posts- Crear postPUT /api/posts/{id}- Actualizar postDELETE /api/posts/{id}- Eliminar postPOST /api/posts/{postId}/comments- Añadir comentario
springboot-search-rest-api
├─ Queries JPQL
├─ Queries SQL nativas
├─ Parámetros de query
├─ Filtrado de búsqueda
└─ Consideraciones de rendimiento
Enfoques de Queries:
// JPQL (Orientado a objetos)
@Query("SELECT p FROM Product p WHERE p.name LIKE %:keyword%")
List<Product> searchByJPQL(@Param("keyword") String keyword);
// SQL Nativo
@Query(value = "SELECT * FROM products WHERE description LIKE %:keyword%",
nativeQuery = true)
List<Product> searchByNativeSQL(@Param("keyword") String keyword);
// Spring Data (Autogenerado)
List<Product> findByNameContaining(String keyword);- Spring Boot 2.7.1 - Framework de aplicación
- Java 11 - Lenguaje de programación
- Tomcat - Servidor web embebido
- Spring Data JPA - Abstracción de repositorios de datos
- Hibernate - ORM (Object-Relational Mapping)
- MySQL 8 - Base de datos relacional
- Spring Security - Autenticación y Autorización
- JWT (JSON Web Tokens) - Autenticación stateless
- BCrypt - Hashing de contraseñas
- Maven - Herramienta de construcción
- Docker Compose - Contenedor de base de datos local
- Adminer - UI web de base de datos
- Swagger/SpringFox - Documentación de API
- Lombok - Reducir código boilerplate
- ModelMapper - Mapeo de objetos (DTO ↔ Entity)
- Postman - Testing de API (manual)
Java 11+
Maven 3.6+
Docker & Docker Compose (para base de datos)git clone https://github.com/Cortadai/springboot-blog-rest-api.git
cd springboot-blog-rest-api
# Iniciar MySQL en Docker
docker-compose up -d
# Compilar y ejecutar
mvn clean spring-boot:run
# API disponible en http://localhost:8080
# Swagger UI en http://localhost:8080/swagger-ui.html# Asegúrate de que MySQL está corriendo localmente en puerto 3306
git clone https://github.com/Cortadai/springboot-backend.git
cd springboot-backend
# Actualizar application.properties con tus credenciales MySQL
# Luego ejecutar:
mvn clean spring-boot:run# Crear usuario
curl -X POST http://localhost:8080/api/auth/register \
-H "Content-Type: application/json" \
-d '{"username":"john","password":"password123","email":"john@example.com"}'
# Login y obtener token JWT
curl -X POST http://localhost:8080/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"john","password":"password123"}'
# Respuesta: {"token":"eyJhbGciOiJIUzUxMiJ9..."}
# Crear post con token JWT
curl -X POST http://localhost:8080/api/posts \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{"title":"Mi Primer Post","description":"Aprendiendo Spring Boot","content":"Contenido aquí..."}'-- Tabla usuarios
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(100) UNIQUE,
password VARCHAR(255),
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Tabla roles
CREATE TABLE roles (
id INT PRIMARY KEY,
name VARCHAR(50) UNIQUE
);
-- Roles de usuario (muchos a muchos)
CREATE TABLE user_roles (
user_id INT,
role_id INT,
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (role_id) REFERENCES roles(id)
);
-- Tabla posts
CREATE TABLE posts (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(255),
description VARCHAR(500),
content LONGTEXT,
user_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- Tabla comentarios
CREATE TABLE comments (
id INT PRIMARY KEY AUTO_INCREMENT,
body TEXT,
post_id INT,
user_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (post_id) REFERENCES posts(id),
FOREIGN KEY (user_id) REFERENCES users(id)
);CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
description TEXT,
price DECIMAL(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);1. Usuario envía credenciales (username/password)
↓
2. Servidor valida credenciales
↓
3. Servidor genera token JWT
│ Token incluye: user_id, roles, expiración
↓
4. Cliente almacena token JWT
↓
5. Cliente envía JWT en header Authorization
↓
6. Servidor valida firma JWT
↓
7. Servidor procesa petición
↓
8. Servidor retorna respuesta
Header.Payload.Signature
Ejemplo:
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJqb2huIiwicm9sZXMiOlsiUk9MRV9VU0VSIl0sImlhdCI6MTYzMDcwMzQ2M30.signature...
Decodificado:
{
"alg": "HS512" // Header: Algoritmo
}
{
"sub": "john", // Payload: Sujeto (usuario)
"roles": ["ROLE_USER"], // Payload: Roles
"iat": 1630703463 // Payload: Emitido en
}
@SpringBootTest
class PostServiceTest {
@Mock
PostRepository postRepository;
@InjectMocks
PostService postService;
@Test
void testCreatePost() {
// Arrange
Post post = new Post(...);
when(postRepository.save(any())).thenReturn(post);
// Act
Post created = postService.createPost(post);
// Assert
assertNotNull(created);
assertEquals("Title", created.getTitle());
}
}@SpringBootTest(webEnvironment = RANDOM_PORT)
class BlogApiIntegrationTest {
@LocalServerPort
int port;
@Test
void testPostEndpoint() {
RestTemplate template = new RestTemplate();
String url = "http://localhost:" + port + "/api/posts";
ResponseEntity<Post> response = template.postForEntity(url, postRequest, Post.class);
assertEquals(HttpStatus.CREATED, response.getStatusCode());
}
}| Concepto | Proyecto | Lección |
|---|---|---|
| Perfiles Spring | springboot-first-app | Comportamiento específico por entorno |
| Gestión de Configuración | springboot-backend | Propiedades externas, secrets |
| Inyección de Dependencias | Todos | Gestión de dependencias Spring |
| Transacciones | springboot-transaction | ACID, rollback, atomicidad |
| Endpoints REST | springboot-blog-rest-api | Operaciones CRUD, verbos HTTP |
| Autenticación | springboot-blog-rest-api | Tokens JWT, login/register |
| Autorización | springboot-blog-rest-api | Control de acceso basado en roles |
| JPA/Hibernate | Todos con BD | ORM, mapeo de entidades |
| Spring Data | Todos con BD | Patrón Repository |
| Lenguajes de Query | springboot-search-rest-api | JPQL vs SQL Nativo |
| Manejo de Excepciones | springboot-blog-rest-api | Manejo global de errores |
| Documentación API | springboot-blog-rest-api | Swagger/OpenAPI |
@Service
public class PostService {
@Autowired
private PostRepository postRepository;
@Transactional
public Post createPost(Post post) {
// Lógica de negocio aquí
return postRepository.save(post);
}
public List<Post> getAllPosts() {
return postRepository.findAll();
}
public Post getPostById(Long id) {
return postRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Post no encontrado"));
}
}@RestController
@RequestMapping("/api/posts")
public class PostController {
@Autowired
private PostService postService;
@GetMapping
public List<PostDto> getAllPosts() {
return postService.getAllPosts();
}
@PostMapping
public ResponseEntity<PostDto> createPost(@Valid @RequestBody CreatePostRequest request) {
PostDto post = postService.createPost(request);
return ResponseEntity.status(HttpStatus.CREATED).body(post);
}
@PutMapping("/{id}")
public PostDto updatePost(@PathVariable Long id, @RequestBody UpdatePostRequest request) {
return postService.updatePost(id, request);
}
@DeleteMapping("/{id}")
public ResponseEntity<?> deletePost(@PathVariable Long id) {
postService.deletePost(id);
return ResponseEntity.ok().build();
}
}Todos los proyectos etiquetados con:
#spring-boot- Framework Spring Boot#aprendizaje- Material de aprendizaje#educacion- Contenido educativo#tutorial- Estilo tutorial#java- Lenguaje Java#rest-api- Desarrollo API REST (seleccionados)
Proyecto hub spring-boot-basics también etiquetado con:
#coleccion- Hub recopilatorio#principiante- Nivel principiante#rest- Patrones REST
| Métrica | Valor |
|---|---|
| Total Proyectos | 5 |
| Framework | Spring Boot 2.7.1 |
| Versión Java | 11 |
| Base de Datos | MySQL 8 |
| Nivel de Aprendizaje | Principiante a Avanzado |
| Tiempo Estimado de Aprendizaje | 2-3 semanas |
Después de completar esta colección, comprenderás:
- ✅ Fundamentos de Spring Boot
- ✅ Gestión de configuración a través de entornos
- ✅ Inyección de dependencias e inversión de control
- ✅ Perfiles Spring para separación de entornos
- ✅ Gestión de transacciones y propiedades ACID
- ✅ Principios de diseño de API REST
- ✅ Métodos HTTP (GET, POST, PUT, DELETE)
- ✅ Autenticación con tokens JWT
- ✅ Autorización y control de acceso basado en roles
- ✅ Spring Data JPA e Hibernate
- ✅ Queries JPQL y SQL Nativo
- ✅ Manejo de excepciones y respuestas de error
- ✅ Documentación de API con Swagger
- ✅ Estrategias de testing (unitario e integración)
- ✅ Docker Compose para desarrollo local
- Code Generation Tools - Generar Java desde esquemas
- Web Services (SOAP) - Servicios web empresariales
- Angular Learning - Integración frontend
Solución: Asegúrate de que el contenedor Docker está corriendo
$ docker-compose up -d
$ docker-compose ps # Verificar contenedores
Solución: Cambiar puerto en application.properties
server.port=8081
Solución: Obtener nuevo token vía endpoint login
O aumentar expiración de token en application.properties
jwt.expiration.ms=86400000 # 24 horas
Solución: Acceder a /swagger-ui.html (no /swagger-ui.html/)
Comprobar dependencia springfox en pom.xml
Estos proyectos fueron creados como ejemplos de aprendizaje para entender el desarrollo Spring Boot desde fundamentos hasta APIs REST listas para producción.
Perfecto para:
- ✅ Principiantes aprendiendo Spring Boot
- ✅ Entender arquitectura en capas
- ✅ Aprender desarrollo de API REST
- ✅ Dominar Spring Data e Hibernate
- ✅ Implementar seguridad con JWT
- ✅ Patrones de aplicaciones del mundo real
Última actualización: Noviembre 2025