Tester un développeur GraphQL sur le schéma, le N+1 et la fédération

Le développeur GraphQL back-end conçoit le schéma que consomment les applications web et mobiles, puis écrit les résolveurs qui vont chercher les données dans les bases et les services existants. L'entretien porte surtout sur les requêtes N+1, l'évolution du schéma sans casser les clients et la limite posée aux requêtes trop lourdes.

Recevoir la fiche complète

Mis à jour le Par l'équipe Delectus5 min de lecture

La fiche Développeur GraphQL : technologies, chaîne du poste, une question et la grille d'évaluation

Selon le langage du serveur, les questions d'entretien d'un développeur GraphQL changent. Les offres françaises associent GraphQL à Node.js et TypeScript avec Apollo Server, à Java avec Spring Boot et Spring for GraphQL, plus rarement à .NET avec Hot Chocolate. Dans beaucoup d'offres, GraphQL est cité comme un plus, et l'équipe accepte de former un bon développeur back-end. Vérifiez d'abord le socle du langage, puis l'expérience GraphQL réelle.

Le piège vient des profils front. Un développeur React qui a consommé une API GraphQL avec Apollo Client connaît la syntaxe des requêtes, sans avoir jamais écrit de résolveur ni réglé un N+1 en base. Côté serveur, l'expérience se reconnaît à des détails : un DataLoader créé à chaque requête, un champ déprécié avant d'être retiré, une limite de coût en production, une erreur partielle renvoyée avec des données.

Sur une architecture où plusieurs équipes partagent le graphe, demandez si la personne a travaillé avec Apollo Federation et ce qu'elle a fait le jour où un sous-graphe est tombé. Le PDF contient 30 questions sur six axes, un cas de 20 minutes et une grille de 1 à 4.

Du schéma au routeur, l'outillage GraphQL côté serveur

Schéma et SDL

Le schéma décrit les types, les champs, les lectures (Query), les écritures (Mutation) et les abonnements (Subscription). C'est le contrat passé avec les applications clientes. On l'écrit soit directement en SDL (schema-first), soit à partir du code typé (code-first, avec Pothos, Nexus ou des annotations Java). Demandez laquelle des deux approches la personne a pratiquée.

Résolveurs et DataLoader

Chaque champ a une fonction qui va chercher sa valeur. Sans précaution, une liste de 50 commandes qui affiche chacune son client déclenche 51 requêtes en base. DataLoader regroupe ces appels en un seul et garde un cache le temps d'une requête HTTP. C'est le premier point à vérifier en entretien.

Apollo Server, GraphQL Yoga, Mercurius

Apollo Server est le serveur GraphQL le plus répandu en Node.js. La version 5 est la version courante, et la 4 n'est plus maintenue depuis janvier 2026, ce qui compte si le code existant est ancien. GraphQL Yoga et Mercurius (sur Fastify) sont les alternatives les plus citées. NestJS fournit un module GraphQL au-dessus d'Apollo ou de Mercurius.

Spring for GraphQL, DGS, Hot Chocolate

Côté Java, Spring for GraphQL est le projet officiel de l'écosystème Spring, avec des contrôleurs annotés (@QueryMapping, @SchemaMapping) et le regroupement des appels par @BatchMapping. Le framework DGS de Netflix s'appuie aujourd'hui sur Spring for GraphQL. Côté .NET, le serveur le plus courant est Hot Chocolate.

Apollo Federation

Elle assemble plusieurs sous-graphes, chacun tenu par une équipe, en un supergraphe servi par un routeur unique. Une entité (un client, un produit) est déclarée dans un sous-graphe avec la directive @key et complétée par les autres. La composition se vérifie avant le déploiement, avec la CLI Rover ou le registre GraphOS.

Pagination, erreurs et subscriptions

La pagination par curseur suit souvent la convention Connections de Relay (edges, node, pageInfo). Une réponse GraphQL peut contenir à la fois des données et une liste d'erreurs, avec un code HTTP 200, ce qui change le traitement des échecs. Les subscriptions passent le plus souvent par WebSocket avec le protocole graphql-ws, parfois par Server-Sent Events.

Sécurité et limitation des requêtes

Un client peut écrire une requête très imbriquée ou multiplier les alias pour charger le serveur. Les parades sont la limite de profondeur, un coût calculé par requête, la limitation de débit et, pour les applications maison, une liste de requêtes autorisées (trusted documents). Les droits se contrôlent dans la couche métier, objet par objet.

Outillage et tests

GraphQL Code Generator produit les types TypeScript à partir du schéma. Les tests exécutent de vraies opérations contre le serveur (executeOperation avec Apollo Server, GraphQlTester avec Spring). Des contrôles de schéma en CI, avec Rover ou graphql-inspector, repèrent un changement cassant avant la mise en production.

La plupart des offres françaises qui citent GraphQL côté serveur cherchent un développeur Node.js et TypeScript ou Java et Spring Boot, et le poste reste un poste back-end. Le développeur expose une API aux applications web et mobiles, souvent devant des services REST et des bases existantes qu'il ne remplace pas. Plus le nombre d'équipes qui partagent le graphe augmente, plus la fédération et la gouvernance du schéma prennent de place : registre, contrôles en CI, règles de dépréciation. Sur une petite API servie à une seule application, le travail porte surtout sur la modélisation, le N+1 et les droits d'accès.

Les compétences GraphQL côté serveur, sujet par sujet

  • Conception et évolution du schéma
  • Résolveurs, N+1 et DataLoader
  • Pagination, erreurs et subscriptions
  • Sécurité et limitation des requêtes
  • Fédération et composition de sous-graphes
  • Tests, performance et mise en production

Cinq problèmes de serveur GraphQL à faire résoudre

Chaque question vient avec ce qu'une bonne réponse contient et le signal qui doit vous alerter. Pas besoin d'être technique pour les poser : écoutez si le candidat raconte du vécu.

  1. Question 1 · confirmé

    Une requête renvoie 50 commandes avec, pour chacune, le nom du client. En base, vous voyez 51 requêtes. Que se passe-t-il et comment corrigez-vous ?

    Une bonne réponseLe résolveur du champ client est appelé une fois par commande, d'où une requête par ligne. La correction standard est un DataLoader : il collecte les identifiants demandés pendant le même tour de boucle, lance une seule requête avec un IN, puis renvoie les résultats dans l'ordre des clés. Le DataLoader est créé pour chaque requête HTTP, dans le contexte, pour que son cache ne mélange pas les utilisateurs. En Java, @BatchMapping de Spring for GraphQL fait le même travail.

    Signal d'alerte« J'ajoute un cache Redis », ou une jointure faite systématiquement dans le résolveur parent, même quand le client ne demande pas le champ. Un DataLoader unique partagé entre toutes les requêtes du serveur.

  2. Question 2 · confirmé

    Le champ address, de type String, doit devenir un objet avec rue, code postal et ville. Des applications mobiles en production l'utilisent. Comment faites-vous ?

    Une bonne réponseOn ne change pas le type d'un champ existant. La personne ajoute un nouveau champ (postalAddress, de type Address), marque l'ancien avec @deprecated et une raison, puis suit l'usage réel de l'ancien champ dans les métriques ou le registre de schéma. Elle le retire quand plus aucune version d'application en circulation ne l'appelle, ce qui peut prendre des mois avec des applications mobiles.

    Signal d'alerteModifier le type en place et prévenir les équipes front, ou ouvrir un /graphql/v2 comme pour une API REST versionnée.

  3. Question 3 · senior

    Votre API GraphQL est publique. Qu'est-ce qui empêche un client d'envoyer une requête qui fait tomber le serveur ?

    Une bonne réponsePlusieurs limites vérifiées avant l'exécution : profondeur maximale, nombre d'alias et de champs, taille des listes demandées (un argument first plafonné) et un coût calculé par requête, qui la fait rejeter au-delà d'un seuil. S'y ajoutent un délai maximal d'exécution, un plafond sur les requêtes groupées et une limitation de débit fondée sur le coût plutôt que sur le nombre d'appels. Pour une API qui ne sert que ses propres applications, le candidat propose une liste de requêtes autorisées (trusted documents).

    Signal d'alerte« On désactive l'introspection », présenté comme la protection principale, ou une limitation de débit qui ne compte que les requêtes HTTP.

  4. Question 4 · confirmé

    Un résolveur échoue sur un seul champ d'une requête qui en demande vingt. Que reçoit le client, avec quel code HTTP, et comment concevez-vous le schéma pour ce cas ?

    Une bonne réponseLa réponse contient les données des autres champs et une entrée dans errors avec le chemin du champ en échec. Si le champ est nullable, il vaut null ; s'il ne l'est pas, le null remonte jusqu'au premier parent nullable, parfois jusqu'à data entier. Le code HTTP reste 200 dès que data n'est pas null. Le candidat garde nullables les champs qui dépendent d'un service externe et modélise les erreurs métier attendues (stock insuffisant, e-mail déjà utilisé) dans le type de retour de la mutation, par exemple avec une union.

    Signal d'alerte« Le serveur renvoie une 500 », ou un schéma où tout est non nullable pour que le front n'ait rien à tester, sans voir que la moindre panne efface alors toute la réponse.

  5. Question 5 · senior

    Deux équipes tiennent chacune un sous-graphe, l'une pour les produits, l'autre pour les avis. Comment le client obtient-il un produit avec ses avis en une seule requête ?

    Une bonne réponseProduct est une entité déclarée avec @key(fields: "id") dans le sous-graphe produits. Le sous-graphe avis ajoute à cette entité un champ reviews et fournit un résolveur de référence (__resolveReference avec Apollo) qui retrouve l'entité à partir de sa clé. Le routeur construit un plan de requête : il interroge d'abord les produits, puis envoie les clés au sous-graphe avis en un seul appel _entities. La composition est vérifiée en CI avant chaque déploiement.

    Signal d'alerteLe sous-graphe produits appelle l'API des avis dans ses propres résolveurs, ou les deux schémas sont fusionnés à la main dans une passerelle maison.

Recevez la fiche d'entretien complète en PDF

La fiche pour mener l'entretien de bout en bout, prête à imprimer ou à partager avec le manager.

  • 30 questions sur 6 axes, avec la bonne réponse, le signal d'alerte et la relance
  • Le niveau visé pour chaque question
  • Une mise en situation de 20 minutes et ce qu'on attend du candidat
  • La grille d'évaluation de 1 à 4, axe par axe

Avant d'embaucher sur GraphQL, quatre réponses courtes

Quelles compétences demander à un développeur GraphQL back-end ?

D'abord un bon niveau dans le langage du serveur, le plus souvent TypeScript avec Node.js ou Java avec Spring Boot, et en bases de données. Côté GraphQL, la conception d'un schéma, des résolveurs écrits avec DataLoader, la pagination par curseur, les erreurs partielles et les limites posées aux requêtes. Si plusieurs équipes partagent le graphe, ajoutez Apollo Federation et les contrôles de schéma en CI.

Un développeur front qui utilise Apollo Client peut-il tenir le poste ?

Il connaît la syntaxe des requêtes, les fragments et le cache client, ce qui aide. Il lui manque souvent tout ce qui se passe côté serveur : résolveurs, accès aux données, N+1, droits par objet, coût des requêtes. Posez-lui la question des 51 requêtes en base et celle des changements cassants. S'il y répond avec précision, le profil peut convenir ; sinon, prévoyez une montée en compétences.

GraphQL remplace-t-il les API REST dans une équipe ?

Rarement en totalité. Beaucoup d'équipes placent GraphQL devant des services REST et des bases existantes, pour servir chaque écran web ou mobile en une requête. REST reste courant entre services, pour les webhooks et les téléchargements de fichiers. En entretien, un candidat capable de dire quand GraphQL n'apporte rien, par exemple pour une API simple consommée par un seul client, montre du recul sur l'outil.

Quel test technique proposer à un développeur GraphQL ?

Un petit serveur existant avec un N+1 à corriger et un champ à faire évoluer sans casser les clients se traite en moins d'une heure. Vous voyez si la personne compte les requêtes en base, place le DataLoader au bon endroit et pense à @deprecated. Pour un senior, ajoutez une discussion sur la limitation des requêtes et la fédération. Un exercice en direct, commenté à voix haute, en dit plus qu'un long projet fait chez soi.

Pour structurer vos autres entretiens, consultez aussi nos pages sur les questions d'entretien de recrutement, la méthode de l'entretien structuré et la grille d'évaluation d'entretien.

Les fiches voisines

Toutes les fiches →

Voyez Delectus sur vos propres offres.

Commencez gratuitement. Passez à l'échelle quand vous êtes prêt.

Demander une démo

Votre ATS, connecté à Delectus

  • Workable
  • Teamtailor
  • iCIMS
  • Lever
  • SmartRecruiters
  • Jobvite
  • Greenhouse
  • Pinpoint