>_fieldnotes.
GUÍA DE BOLSILLO/JAVA Y SPRING BOOT
Ctrl K
FIELDNOTES/BACKEND/JAVA Y SPRING BOOT

BACKEND · REFERENCIA RÁPIDA

Java y Spring Boot

Crea tu primer proyecto Spring Boot y entiende sus opciones, capas y sintaxis desde TypeScript.

JavaSpringSpring BootInitializrMavenTypeScriptDIcapas

Spring Framework y Spring Boot

Spring Framework aporta infraestructura modular: contenedor de objetos, inyección de dependencias, Spring MVC y transacciones, entre otras piezas.

Spring Boot agrega auto-configuración, starters para dependencias comunes, configuración externa y formas convenientes de ejecutar y empaquetar una aplicación Spring.

Una comparación útil desde TypeScript es Spring Boot ≈ NestJS: ambos ayudan a estructurar aplicaciones de servidor, reciben peticiones en controladores y permiten inyectar servicios. No son equivalentes exactos; Spring Boot está construido sobre Spring y se ejecuta en la JVM, mientras NestJS se ejecuta sobre Node.js.

Crear un proyecto con Spring Initializr

La opción Spring Boot de IntelliJ abre un generador que prepara el esqueleto, el sistema de construcción y las dependencias iniciales. No es otro lenguaje: el código de la aplicación puede ser Java.

Campo Qué define Un valor inicial razonable
Type Herramienta que descarga dependencias y compila el proyecto. Maven usa pom.xml; Gradle Groovy usa build.gradle; Gradle Kotlin usa build.gradle.kts. Maven si el curso o equipo no exige otra opción.
Language Lenguaje de la aplicación. Java.
Spring Boot Versión del framework y sus dependencias compatibles. Una versión estable que ofrezca el generador; evita versiones SNAPSHOT al empezar.
JDK Java Development Kit: compilador y herramientas para desarrollar y ejecutar Java. La selección también define la versión objetivo del proyecto. El JDK instalado que sea compatible con la versión de Spring Boot seleccionada.
Packaging Formato de salida. Un JAR de Spring Boot suele poder ejecutarse con el servidor web incluido; WAR se usa cuando el destino requiere un contenedor externo o una configuración WAR. JAR para una aplicación nueva que se ejecutará por su cuenta.
Configuration Formato del archivo de configuración: application.properties o application.yml. YAML se pronuncia “yamel”. El que use el curso o el equipo; ambos expresan propiedades de Spring Boot.

JDK significa Java Development Kit. Incluye javac y otras herramientas de desarrollo; no es solo el número de versión. Comprueba que IntelliJ tenga instalado el JDK seleccionado y que esa versión sea compatible con la versión de Spring Boot elegida.

Group, Artifact, Name y Package Name

Estos campos identifican y nombran el proyecto. Como ejemplo para una API de inventario:

Campo Ejemplo Para qué sirve
Group com.andre Identifica el grupo o espacio de nombres del proyecto; suele seguir el dominio invertido. También se usa como base del paquete Java.
Artifact inventario-api Identifica este módulo en Maven/Gradle y forma parte del nombre del archivo construido.
Name inventario-api Nombre legible del proyecto; Initializr lo usa para generar nombres iniciales, como la clase principal.
Package Name com.andre.inventario Paquete raíz de las clases Java. Se escribe en minúsculas y no lleva guiones.

Group y Package Name suelen estar relacionados, pero no tienen que ser idénticos. Usa un nombre propio del proyecto en vez de dejar com.example cuando ya conozcas el dominio o la organización.

Dependencies

Son librerías iniciales, normalmente agrupadas como starters. Para una primera API REST, selecciona Spring Web. Añade Spring Data JPA y el driver de la base de datos cuando realmente vayas a persistir datos; Validation sirve para validar entradas. Puedes añadir dependencias después, así que empieza con las que necesitas ahora.

Configuración de ejemplo

El mismo valor puede escribirse en cualquiera de los dos formatos:

# application.properties
spring.application.name=inventario-api
server.port=8080
# application.yml
spring:
  application:
    name: inventario-api
server:
  port: 8080

YAML agrupa visualmente claves relacionadas con indentación; properties escribe pares clave=valor. Respeta la indentación de YAML.

Qué elegir para empezar

Si no tienes requisitos de un curso o equipo, una combinación sencilla es Java + Maven + JAR + Spring Web. Elige el JDK compatible que tengas instalado. Para el archivo de configuración, usa properties o YAML según cuál quieras aprender; la elección no cambia las capacidades de la aplicación.

Sigue una petición

HTTP request
  → Controller   ruta, entrada y respuesta HTTP
  → Service      reglas / caso de uso
  → Repository   acceso a persistencia
  → Database
  ← DTO / response

Las capas son una convención, no una obligación universal. Busca una ruta parecida y sigue los patrones de ese repositorio.

Inversión de control e inyección

Inversión de control: el framework administra la creación y el ciclo de vida de los componentes.

Inyección de dependencias: una clase recibe desde fuera los objetos que necesita. La inyección por constructor deja visible ese contrato y facilita probar la clase.

@Service
public class OrderService {
    private final OrderRepository repository;

    public OrderService(OrderRepository repository) {
        this.repository = repository;
    }
}

Anotaciones que encontrarás

  • @SpringBootApplication: configuración y punto de entrada de Spring Boot.
  • @RestController, @GetMapping, @PostMapping: controladores y rutas HTTP.
  • @Service, @Repository: componentes con un rol reconocible.
  • @Configuration, @Bean: configuración explícita de objetos.
  • @Transactional: define un límite transaccional; revisa su alcance real.

Desde NestJS, la forma general del recorrido puede resultar familiar:

NestJS / TypeScript Spring Boot / Java Función
@Controller('usuarios') @RestController + @RequestMapping("/usuarios") Recibir peticiones HTTP.
@Get() / @Post() @GetMapping / @PostMapping Mapear un método HTTP.
@Param('id') @PathVariable Leer un segmento de la ruta.
@Query('q') @RequestParam Leer un parámetro de consulta.
@Body() @RequestBody Leer el cuerpo de la petición.
@Injectable() @Service (entre otros componentes Spring) Registrar un objeto para inyección.

La inyección por constructor también existe en ambos ecosistemas. En Spring, si una clase tiene un único constructor, normalmente no hace falta anotar ese constructor con @Autowired.

@RestController
@RequestMapping("/saludo")
public class SaludoController {
    @GetMapping
    public String saludar(@RequestParam(defaultValue = "mundo") String nombre) {
        return "Hola, " + nombre;
    }
}

La ruta sería GET /saludo?nombre=Ana. @RequestParam corresponde al query parameter; para una ruta como /usuarios/42, se usaría @PathVariable.

Sintaxis Java desde TypeScript

La lógica de if, for, clases e interfaces puede parecer familiar. En Java el tipo se escribe antes del nombre y un método declara su visibilidad, tipo de retorno y parámetros.

TypeScript Java
string String
number int, long, double u otro tipo numérico según el dato
boolean boolean
const final para una variable que no se reasigna
console.log(x) System.out.println(x)
null / undefined null solo es una analogía parcial; Java no tiene undefined
function sumar(a: number, b: number): number {
  return a + b;
}
public int sumar(int a, int b) {
    return a + b;
}

Una comparación de herramientas también es aproximada: Maven y pom.xml administran dependencias y compilación, mientras npm y package.json administran paquetes y scripts de JavaScript/TypeScript. Java compila a bytecode que ejecuta la JVM; TypeScript se transforma a JavaScript.

Lombok

Lombok genera código durante la compilación. Por eso un constructor, getter o logger puede no estar escrito en el archivo fuente.

  • @RequiredArgsConstructor genera un constructor para los campos final que requieren inicialización.
  • @Getter / @Setter generan métodos de acceso.
  • @Slf4j genera el logger log.
  • @Data combina getters, setters, equals, hashCode, toString y un constructor requerido. Revisa los efectos antes de usarlo en entidades.

Si el editor marca errores que no aparecen al compilar, revisa el plugin de Lombok y el procesamiento de anotaciones.

MapStruct

MapStruct genera implementaciones de mappers tipados durante la compilación. Se usa para convertir DTOs y modelos.

@Mapper(componentModel = "spring")
public interface UserMapper {
    UserDto toDto(User source);
    User toEntity(CreateUserRequest source);
}

Busca la configuración del procesador de anotaciones y las asignaciones explícitas para campos con nombres diferentes.

Excepciones y HTTP

Las excepciones pueden modelar fallos de un caso de uso. Una clase anotada con @RestControllerAdvice suele traducirlas a respuestas HTTP coherentes. No captures una excepción para ocultarla o responder con un valor vacío si el contrato no lo pide.

Recursos oficiales