🚀 Creación Proyecto Spring Boot
Guía paso a paso para crear un proyecto Spring Boot 3 con Kotlin y dependencias esenciales.
📋 Contexto
Iniciar un proyecto Spring Boot requiere decisiones arquitectónicas desde el primer momento. Esta guía establece una base sólida con el stack tecnológico adecuado.
🎯 Objetivo
Crear un proyecto Spring Boot funcional con configuración inicial, dependencias esenciales y estructura preparada para producción.
📦 Alcance
Incluye:
- Configuración inicial (Group, Artifact, JDK)
- Selección de dependencias esenciales
- Configuración YAML por perfiles
- Estructura base del proyecto
Excluye:
- Desarrollo de features específicas
- Configuración de CI/CD
🏛️ Configuración Inicial
Nueva Proyecto (start.spring.io)
| Campo | Valor | Descripción |
|---|---|---|
| Generador | Spring Boot (start.spring.io) | Oficial de Spring |
| Lenguaje | Kotlin | Conciso, null-safety |
| Build | Gradle - Groovy/Kotlin DSL | Recomendado Kotlin DSL |
| Group | com.lgzarturo | Identidad del dominio |
| Artifact | springboot-course | Nombre del proyecto |
| Package | com.lgzarturo.springbootcourse | Paquete base |
| JDK | 21 | LTS recomendado |
| Packaging | Jar | Estándar Spring Boot |
Estructura Generada
springboot-course/
├── src/
│ ├── main/kotlin/com/lgzarturo/springbootcourse/
│ │ └── SpringbootCourseApplication.kt
│ ├── test/kotlin/
│ └── resources/
│ ├── application.properties
│ └── static/
├── build.gradle.kts
├── settings.gradle.kts
└── gradle/wrapper/
📦 Dependencias Esenciales
Core Web y API
| Dependencia | Propósito | Uso |
|---|---|---|
| Spring Web | Spring MVC, REST endpoints | @RestController, @GetMapping |
| Spring Validation | Bean Validation | @Valid, @NotBlank |
| Spring Data JPA | Abstracción de persistencia | JpaRepository, @Entity |
Bases de Datos
| Dependencia | Uso | Notas |
|---|---|---|
| H2 Database | Dev/test en memoria | Console en /h2-console (solo dev) |
| PostgreSQL Driver | Producción | Robustez, tipos ricos |
Observabilidad y Utilidades
| Dependencia | Propósito |
|---|---|
| Spring Boot Actuator | Health checks, métricas, info |
| Spring Configuration Processor | Autocompletado de config en IDE |
| Spring Boot DevTools | LiveReload, reinicio automático (dev) |
| Sentry | Captura de excepciones y performance |
Ejemplo build.gradle.kts
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-actuator")
runtimeOnly("com.h2database:h2")
runtimeOnly("org.postgresql:postgresql")
developmentOnly("org.springframework.boot:spring-boot-devtools")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
⚙️ Configuración por Perfiles
application.yaml (Base)
spring:
application:
name: springboot-course
application-dev.yaml (Desarrollo)
spring:
datasource:
url: jdbc:h2:mem:course_db;MODE=PostgreSQL;DB_CLOSE_DELAY=-1
driver-class-name: org.h2.Driver
jpa:
hibernate:
ddl-auto: create-drop
properties:
hibernate:
format_sql: true
h2:
console:
enabled: true
server:
port: 8080
management:
endpoints:
web:
exposure:
include: health,info,metrics
application-prod.yaml (Producción)
spring:
datasource:
url: jdbc:postgresql://${DB_HOST}:5432/course_db
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: org.postgresql.Driver
jpa:
hibernate:
ddl-auto: validate # Usar migraciones en prod
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
🎯 Clase Principal
@SpringBootApplication
class SpringbootCourseApplication
fun main(args: Array<String>) {
runApplication<SpringbootCourseApplication>(*args)
}
✅ Verificación Inicial
1. Health Check
curl http://localhost:8080/actuator/health
Respuesta esperada:
{ "status": "UP" }
2. Controller Ping (Opcional)
@RestController
@RequestMapping("/api")
class PingController {
@GetMapping("/ping")
fun ping() = mapOf(
"status" to "ok",
"time" to Instant.now().toString()
)
}
✅ Checklist de Setup
- JDK 21 instalado y configurado
- Gradle wrapper generado
- Dependencias descargadas (
./gradlew dependencies) - Aplicación levanta sin errores
- Actuator health responde UP
- Perfiles dev/prod configurados
- H2 console accesible (dev)