Introducción: Por qué GraphQL y Kotlin son la pareja ideal para una API moderna
El desarrollo web moderno requiere APIs flexibles y eficientes. REST, que durante mucho tiempo fue el estándar, a menudo conduce al problema de over-fetching (cuando el servidor envía más datos de los necesarios) o under-fetching (cuando se necesitan múltiples solicitudes para obtener información completa). GraphQL resuelve estos problemas permitiendo al cliente solicitar solo los datos necesarios en una sola consulta.
Kotlin, por su parte, es un lenguaje moderno, conciso y type-safe, ideal para crear servicios backend robustos. Gracias a la librería graphql-kotlin de Expedia Group, crear una API GraphQL en Kotlin se vuelve simple e intuitivo. En este tutorial, crearemos paso a paso una API GraphQL completa para gestionar una lista de libros.
Qué aprenderás:
- Cómo configurar un proyecto en Spring Boot con soporte para GraphQL.
- Cómo definir el esquema GraphQL usando clases de Kotlin.
- Cómo implementar Queries y Mutations.
- Cómo probar la API a través de la IDE GraphiQL integrada.
Paso 1: Configuración del proyecto y dependencias
Para empezar, crearemos un nuevo proyecto Spring Boot. Usaremos Gradle (Kotlin DSL), que es el estándar para proyectos modernos de Kotlin.
1.1. Creando el proyecto
Puedes usar Spring Initializr o crear la estructura manualmente. Necesitaremos las siguientes dependencias:
- Spring Web — para ejecutar el servidor HTTP.
- Spring Boot Starter GraphQL — la integración principal.
- Kotlin Reflection — para el funcionamiento de la librería graphql-kotlin.
1.2. Archivo build.gradle.kts
plugins { id("org.springframework.boot") version "3.2.0" id("io.spring.dependency-management") version "1.1.4" kotlin("jvm") version "1.9.20" kotlin("plugin.spring") version "1.9.20"}
group = "com.example"version = "0.0.1-SNAPSHOT"
java { toolchain { languageVersion = JavaLanguageVersion.of(17) }}
repositories { mavenCentral()}
dependencies { implementation("org.springframework.boot:spring-boot-starter-web") implementation("org.springframework.boot:spring-boot-starter-graphql") implementation("com.expediagroup:graphql-kotlin-spring-server:7.0.1") implementation("org.jetbrains.kotlin:kotlin-reflect") testImplementation("org.springframework.boot:spring-boot-starter-test")}1.3. Configuración de application.yml
spring: graphql: graphiql: enabled: true # Habilitamos la IDE integrada para pruebas schema: locations: "classpath:graphql/**/"server: port: 8080Paso 2: Definición del esquema y modelo de datos
En GraphQL, el esquema es el contrato entre el cliente y el servidor. La librería graphql-kotlin permite definir el esquema automáticamente basándose en las clases de Kotlin (enfoque code-first). Esto evita tener que escribir archivos .graphqls manualmente.
2.1. Creando el modelo de datos
Crearemos un modelo simple Book y un repositorio para almacenar datos en memoria.
package com.example.graphqlkotlin.model
data class Book( val id: String, val title: String, val author: String, val year: Int)2.2. Repositorio (in-memory)
package com.example.graphqlkotlin.repository
import com.example.graphqlkotlin.model.Bookimport org.springframework.stereotype.Repositoryimport java.util.concurrent.ConcurrentHashMap
@Repositoryclass BookRepository { private val books = ConcurrentHashMap( mapOf( "1" to Book("1", "Guerra y Paz", "León Tolstói", 1869), "2" to Book("2", "Crimen y Castigo", "Fiódor Dostoyevski", 1866) ) )}