Introducción: ¿Por qué GraphQL y Kotlin?
\nEn el mundo del desarrollo web moderno, elegir el enfoque correcto para crear una API puede determinar el éxito de todo el proyecto. GraphQL, desarrollado por Facebook, ofrece una alternativa flexible a REST, permitiendo a los clientes solicitar solo los datos que realmente necesitan. Y Kotlin, un lenguaje de programación moderno para la JVM, añade a esto concisión, seguridad contra nulos y un potente soporte para corrutinas.
\nEn este tutorial crearemos en la práctica una API GraphQL completa utilizando Kotlin y el framework graphql-kotlin-spring-server. Aprenderá a configurar el servidor, definir el esquema de datos, escribir resolutores y probar la API. Al final del artículo, podrá implementar GraphQL de forma independiente en sus proyectos con Kotlin.
1. Configuración del proyecto y dependencias
\nPara empezar, crearemos un nuevo proyecto en Spring Boot con soporte para GraphQL. Usaremos Gradle como sistema de compilación.
\n\n1.1. Creación de la estructura base
\nCree un nuevo proyecto en IntelliJ IDEA o a través de Spring Initializr. Agregue las siguientes dependencias en build.gradle.kts:
plugins {\n id("org.springframework.boot") version "3.2.0"\n id("io.spring.dependency-management") version "1.1.4"\n kotlin("jvm") version "1.9.21"\n kotlin("plugin.spring") version "1.9.21"\n}\n\ndependencies {\n implementation("org.springframework.boot:spring-boot-starter-web")\n implementation("com.expediagroup:graphql-kotlin-spring-server:7.0.1")\n implementation("org.jetbrains.kotlin:kotlin-reflect")\n implementation("org.jetbrains.kotlin:kotlin-stdlib")\n testImplementation("org.springframework.boot:spring-boot-starter-test")\n}\n\n1.2. Configuración de la aplicación
\nCree el archivo application.yml en src/main/resources:
server:\n port: 8080\n\ngraphql:\n packages:\n - "com.example.graphqldemo"\n schema:\n introspection-enabled: true\n exception-handlers-enabled: true\nEsta es la configuración básica. El parámetro introspection-enabled: true permite usar GraphiQL para pruebas.
2. Definición del esquema GraphQL
\nEn graphql-kotlin, el esquema se construye automáticamente basándose en sus clases de datos (data classes). Esta es una de las principales ventajas: no es necesario escribir un archivo SDL separado.
2.1. Creación del modelo de datos
\nSupongamos que estamos creando una API para una biblioteca de libros. Definamos los modelos:
\npackage com.example.graphqldemo.model\n\ndata class Book(\n val id: String,\n val title: String,\n val author: Author,\n val year: Int,\n val genre: String\n)\n\ndata class Author(\n val id: String,\n val name: String,\n val books: List<Book> = emptyList()\n)\n\n// Tipos de entrada para mutaciones\ndata class BookInput(\n val title: String,\n val authorId: String,\n val year: Int,\n val genre: String\n)\n\n2.2. Servicio para trabajar con datos
\nCreemos un servicio simple en memoria que almacenará los datos:
\npackage com.example.graphqldemo.service\n\nimport com.example.graphqldemo.model.Author\nimport com.example.graphqldemo.model.Book\nimport com.example.graphqldemo.model.BookInput\nimport org.springframework.stereotype.Service\nimport java.util.UUID\n\n@Service\nclass LibraryService {\n private val authors = mutableListOf(\n Author("1", "Joanne Rowling"),\n Author("2", "George Orwell")\n )\n private val books = mutableListOf(\n Book("1", "Harry Potter y la piedra filosofal", authors[0], 1997, "Fantasía"),\n Book("2", "1984", authors[1], 1949, "Distopía")\n )\n\n fun getBooks(): List<Book> = books\n fun getBookById(id: String): Book? = books.find { it.id == id }\n fun getAuthors(): List<Author> = authors\n fun addBook(input: BookInput): Book {\n val author = authors.fin