Introduction : Pourquoi GraphQL et Kotlin ?
\nDans le monde du développement web moderne, le choix de la bonne approche pour créer une API peut déterminer le succès de tout un projet. GraphQL, développé par Facebook, offre une alternative flexible à REST, permettant aux clients de demander uniquement les données dont ils ont réellement besoin. Et Kotlin, un langage de programmation moderne pour la JVM, ajoute à cela la concision, la null-sécurité et un puissant support des coroutines.
\nDans ce tutoriel, nous allons créer en pratique une API GraphQL complète en utilisant Kotlin et le framework graphql-kotlin-spring-server. Vous apprendrez à configurer le serveur, définir le schéma de données, écrire des résolveurs et tester l'API. À la fin de cet article, vous serez capable d'intégrer GraphQL dans vos propres projets Kotlin.
1. Configuration du projet et dépendances
\nPour commencer, créons un nouveau projet Spring Boot avec le support de GraphQL. Nous utiliserons Gradle comme système de build.
\n\n1.1. Création de la structure de base
\nCréez un nouveau projet dans IntelliJ IDEA ou via Spring Initializr. Ajoutez les dépendances suivantes dans 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. Configuration de l'application
\nCréez un fichier application.yml dans 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\nIl s'agit de la configuration de base. Le paramètre introspection-enabled: true permet d'utiliser GraphiQL pour les tests.
2. Définition du schéma GraphQL
\nDans graphql-kotlin, le schéma est construit automatiquement à partir de vos classes de données (data classes). C'est l'un des principaux avantages : il n'est pas nécessaire d'écrire un fichier SDL séparé.
2.1. Création du modèle de données
\nSupposons que nous créons une API pour une bibliothèque de livres. Définissons les modèles :
\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// Types d'entrée pour les mutations\ndata class BookInput(\n val title: String,\n val authorId: String,\n val year: Int,\n val genre: String\n)\n\n2.2. Service de gestion des données
\nCréons un service simple en mémoire qui stockera les données :
\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", "J.K. Rowling"),\n Author("2", "George Orwell")\n )\n private val books = mutableListOf(\n Book("1", "Harry Potter à l'école des sorciers", authors[0], 1997, "Fantasy"),\n Book("2", "1984", authors[1], 1949, "Dystopie")\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