Skip to content

Repository files navigation

Curso Spring Boot - Proyectos de Aprendizaje

Spring Boot Java PostgreSQL Maven

Repositorio con múltiples proyectos de aprendizaje en Spring Boot, incluyendo APIs REST completas con autenticación JWT, gestión de eventos, sistema de portfolio con Spring Security y más.

📋 Tabla de Contenidos


🚀 Proyectos Principales

1. Portfolio API

API REST para gestión de portfolios profesionales con información personal, educación, experiencia laboral y habilidades.

🛠 Tecnologías

  • Spring Boot 4.1.0
  • Spring Data JDBC
  • Spring Security
  • PostgreSQL
  • Thymeleaf (vistas web)
  • Lombok
  • Bean Validation

⚙️ Configuración y Arranque

Requisitos
  • Java 21
  • Maven 3.9+ (o usar ./mvnw)
  • PostgreSQL 15+
Pasos
  1. Navegar al proyecto

    cd portfolio
  2. Configurar variables de entorno

    cp .env.example .env

    Editar .env con tus credenciales de PostgreSQL:

    PG_URL_DATABASE=jdbc:postgresql://YOUR_PG_HOST/YOUR_PG_DATABASE?sslmode=require&channelBinding=require
    PG_USER=YOUR_PG_USER
    PG_PASSWORD=YOUR_PG_PASSWORD
  3. Iniciar la aplicación

    ./mvnw spring-boot:run
  4. Acceder a la aplicación

    http://localhost:8080
    

📡 Endpoints Disponibles

Personal Info
Método Endpoint Descripción
GET /api/test-personal-info/all Obtener toda la información personal
GET /api/test-personal-info/{id} Obtener información personal por ID
POST /api/test-personal-info Crear nueva información personal
PUT /api/test-personal-info/{id} Actualizar información personal
DELETE /api/test-personal-info/{id} Eliminar información personal

Ejemplo de body (POST/PUT):

{
  "firstName": "Carlos",
  "lastName": "Martinez",
  "title": "Backend Developer",
  "email": "carlos.martinez@example.com",
  "phone": "+5491134567890",
  "profileDescription": "Desarrollador backend especializado en Node.js y NestJS",
  "profileImageUrl": "img/profile-placeholder.jpg",
  "yearsOfExperience": 4,
  "linkedinUrl": "https://linkedin.com/in/carlosmartinez",
  "githubUrl": "https://github.com/carlosmartinez"
}
Education
Método Endpoint Descripción
GET /api/education Listar toda la educación
GET /api/education/{id} Obtener educación por ID
POST /api/education Crear nuevo registro de educación
PUT /api/education/{id} Actualizar educación
DELETE /api/education/{id} Eliminar educación

Ejemplo de body (POST/PUT):

{
  "degree": "Máster en Desarrollo Full Stack",
  "institution": "Instituto Tecnológico Digital",
  "startDate": "2022-09-15",
  "endDate": "2023-07-30",
  "description": "Formación avanzada en desarrollo web y APIs REST",
  "personalInfoId": 1
}
Experience
Método Endpoint Descripción
GET /api/experience Listar toda la experiencia laboral
GET /api/experience/{id} Obtener experiencia por ID
POST /api/experience Crear nueva experiencia
PUT /api/experience/{id} Actualizar experiencia
DELETE /api/experience/{id} Eliminar experiencia

Ejemplo de body (POST/PUT):

{
  "jobTitle": "Desarrollador Java Senior",
  "companyName": "Tech Solutions S.A.",
  "startDate": "2023-01-01",
  "endDate": null,
  "description": "Desarrollo y mantenimiento de aplicaciones empresariales",
  "personalInfoId": 1
}
Skills
Método Endpoint Descripción
GET /api/skill Listar todas las habilidades
GET /api/skill/{id} Obtener habilidad por ID
GET /api/skill/personal-info/{id} Obtener habilidades por Personal Info ID
POST /api/skill Crear nueva habilidad
PUT /api/skill/{id} Actualizar habilidad
DELETE /api/skill/{id} Eliminar habilidad

Ejemplo de body (POST/PUT):

{
  "name": "Angular",
  "levelPercentage": 85,
  "iconClass": "fab fa-angular",
  "personalInfoId": 1
}

2. Events API

API REST para gestión de eventos con autenticación JWT, categorías, speakers y paginación. Incluye optimizaciones para evitar el problema N+1 y documentación Swagger/OpenAPI.

🛠 Tecnologías

  • Spring Boot 4.1.0
  • Spring Data JPA
  • Spring Security + JWT
  • PostgreSQL / H2
  • MapStruct (mapeo DTO)
  • Lombok
  • Bean Validation
  • Swagger/OpenAPI 3 (documentación)
  • Docker & Docker Compose

⚙️ Configuración y Arranque

Requisitos
  • Java 21
  • Maven 3.9+ (o usar ./mvnw)
  • Docker & Docker Compose (para ejecutar con contenedor)
Opción 1: Arranque Local
  1. Navegar al proyecto

    cd events-api
  2. Configurar variables de entorno

    cp .env.example .env

    Editar .env con tus credenciales:

    NEON_DB_URL=jdbc:postgresql://YOUR_HOST/YOUR_DATABASE
    NEON_DB_USER=YOUR_USER
    NEON_DB_PASSWORD=YOUR_PASSWORD
    JWT_SECRET=your_secret_key_here
    JWT_EXPIRATION=86400000
  3. Iniciar la aplicación

    ./mvnw spring-boot:run
Opción 2: Docker Compose
  1. Construir e iniciar con Docker

    cd events-api
    docker-compose up --build
  2. Acceder a la aplicación

    http://localhost:8080
    
  3. Acceder a la documentación Swagger

    http://localhost:8080/swagger-ui/index.html
    

🔐 Autenticación

La API utiliza JWT (JSON Web Tokens) para la autenticación. Primero debes registrarte y luego iniciar sesión para obtener un token.

Registro

POST /api/v1/auth/register

{
  "username": "testuser",
  "password": "123456",
  "email": "example@gmail.com",
  "name": "Usuario Test",
  "roles": ["ROLE_USER"]
}
Login

POST /api/v1/auth/login

{
  "username": "admin",
  "password": "123456"
}

Respuesta:

{
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "tokenType": "Bearer"
}

Para los siguientes endpoints, incluir el token en el header:

Authorization: Bearer {accessToken}

📡 Endpoints Disponibles

Events
Método Endpoint Descripción
GET /api/v1/events Listar eventos con paginación y filtros
GET /api/v1/events?page=0&size=10 Eventos paginados
GET /api/v1/events?name=Conferencia&page=0&size=5 Búsqueda con filtros
GET /api/v1/events/{id} Obtener evento por ID
GET /api/v1/events/problematic Demostración problema N+1
GET /api/v1/events/optimized-join-fetch Eventos optimizados (JOIN FETCH)
GET /api/v1/events/optimized/all-details Eventos con todos los detalles optimizados
POST /api/v1/events Crear nuevo evento
PUT /api/v1/events/{id} Actualizar evento
DELETE /api/v1/events/{id} Eliminar evento

Ejemplo de body (POST/PUT):

{
  "name": "Lanzamiento de Spring Boot 5.0",
  "date": "2026-06-23",
  "location": "Online",
  "categoryId": 2,
  "speakersIds": [1, 2]
}
Categories
Método Endpoint Descripción
GET /api/v1/categories Listar todas las categorías
GET /api/v1/categories/{id} Obtener categoría por ID
POST /api/v1/categories Crear nueva categoría
PUT /api/v1/categories/{id} Actualizar categoría
DELETE /api/v1/categories/{id} Eliminar categoría

Ejemplo de body (POST/PUT):

{
  "name": "Tecnología",
  "description": "Eventos relacionados con tecnología y software"
}
Speakers
Método Endpoint Descripción
GET /api/v1/speakers Listar todos los speakers
GET /api/v1/speakers/{id} Obtener speaker por ID
POST /api/v1/speakers Crear nuevo speaker
PUT /api/v1/speakers/{id} Actualizar speaker
DELETE /api/v1/speakers/{id} Eliminar speaker

Ejemplo de body (POST/PUT):

{
  "name": "Andrés Podadera",
  "email": "andrespoda@gmail.com",
  "bio": "Experto en Spring Boot y arquitectura de software"
}

🎯 Características Destacadas

  • Autenticación JWT: Sistema completo de registro y login con tokens JWT
  • Optimización N+1: Endpoints con y sin optimización para demostrar el problema N+1 en JPA
  • Paginación: Soporte de paginación en listados de eventos
  • Filtros: Búsqueda de eventos por nombre y otros criterios
  • Validación: Validación de datos con Bean Validation
  • MapStruct: Mapeo automático entre entidades y DTOs
  • Documentación OpenAPI: Swagger UI integrado
  • Dockerizado: Listo para desplegar con Docker Compose

📚 Documentación de APIs

La colección completa de Postman con todos los endpoints, ejemplos de requests y tests automatizados está disponible en:

docs/Curso SpringBoot Portfolio.postman_collection.json

Importar en Postman

  1. Abrir Postman
  2. Ir a File > Import
  3. Seleccionar el archivo Curso SpringBoot Portfolio.postman_collection.json
  4. La colección incluye:
    • ✅ Todos los endpoints de Portfolio API
    • ✅ Todos los endpoints de Events API
    • ✅ Configuración automática de tokens JWT
    • ✅ Ejemplos de requests y responses
    • ✅ Tests automatizados
    • ✅ Visualizaciones de respuestas

📂 Otros Proyectos de Aprendizaje

cv-springboot

Proyecto de ejercicios y prácticas adicionales de Spring Boot con Thymeleaf y modelo MVC.

spring-boot-junit-console-maven

Ejemplos y ejercicios de testing con JUnit en aplicaciones de consola Spring Boot.

spring-boot-learning-mockito

Prácticas de testing con Mockito para crear mocks y tests unitarios efectivos.

spring-boot-validator

Ejemplos de validación de datos con Bean Validation y anotaciones personalizadas.

spring-seccion-15-angular-cors

Proyecto de integración entre Spring Boot y Angular con configuración de CORS.


🔒 Notas de Seguridad

  • Los archivos .env contienen información sensible y NO deben subirse al repositorio
  • Las plantillas .env.example están versionadas como referencia
  • Cambiar las claves JWT por defecto en producción
  • Usar contraseñas seguras en bases de datos productivas
  • Configurar SSL/TLS en PostgreSQL para conexiones seguras

🎓 Recursos

Curso Base

Java: Spring Boot - Guía definitiva

Documentación Oficial


📝 Licencia

Este es un repositorio de aprendizaje personal. El código está disponible para fines educativos.


🤝 Contribuciones

Este es un proyecto de aprendizaje personal, pero sugerencias y feedback son bienvenidos a través de issues.

About

Proyectos del curso de Springboot - Portfolio Web y Api Rest

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages