Logo von nextlevels
Projekt anfragen
Zurück zum Wiki

GraphQL

Zuletzt aktualisiert am

Kurz erklärt

GraphQL ist eine von Facebook (heute Meta) entwickelte und 2015 öffentlich freigegebene Abfragesprache für APIs samt zugehöriger Laufzeitumgebung. Die Grundidee: Statt für jede Datenansicht einen eigenen Endpunkt zu bauen, stellst du einen einzigen Endpunkt bereit, über den der Client präzise beschreibt, welche Felder er braucht — nicht mehr und nicht weniger.

Der Server liefert exakt diese Struktur zurück. Für dich als Entscheider heißt das: weniger Roundtrips, schlankere Antworten und Frontend-Teams, die neue Ansichten bauen können, ohne auf jede Backend-Anpassung zu warten. Gerade bei datenintensiven Oberflächen wie Dashboards, Produktkonfiguratoren oder Mobile Apps kann das den Unterschied zwischen träge und flüssig ausmachen.

Das Kernprinzip: Der Client bestimmt die Datenform

Bei einer klassischen REST-API definiert der Server, welche Daten ein Endpunkt zurückliefert. Will das Frontend nur den Namen und das Bild eines Produkts, bekommt es trotzdem das komplette Produktobjekt mit fünfzig Feldern — das klassische Over-Fetching. Braucht es zusätzlich noch die Bewertungen, muss es einen zweiten Endpunkt aufrufen — Under-Fetching, das zu mehreren Roundtrips führt. GraphQL dreht das um: Der Client schickt eine Query, die exakt die gewünschte Datenform beschreibt, und der Server füllt sie. Eine einzige Anfrage kann verschachtelte, zusammenhängende Daten über mehrere Entitäten hinweg liefern — etwa ein Produkt mit seinen Varianten, Bewertungen und dem Hersteller in einem Rutsch.

Das Herzstück jeder GraphQL-API ist das Schema. Es definiert in einer typisierten Sprache (Schema Definition Language, SDL), welche Typen, Felder und Beziehungen es gibt. Das Schema ist gleichzeitig Vertrag, Dokumentation und Validierungsschicht: Eine Query, die ein nicht existierendes Feld anfordert, wird abgelehnt, bevor sie überhaupt ausgeführt wird. Diese starke Typisierung ist einer der größten Vorteile von GraphQL gegenüber lose dokumentierten REST-Schnittstellen.

Ein konkretes Beispiel macht das greifbar: Eine Query wie { produkt(id: "4711") { name preis bewertungen { sterne text } } } liefert genau diese Struktur zurück — Name, Preis und eine Liste von Bewertungen mit Sternen und Text, alles in einer einzigen Antwort. Will ein anderes Frontend zusätzlich noch den Hersteller, ergänzt es einfach das Feld in seiner Query, ohne dass am Backend etwas geändert werden muss. Genau diese Entkopplung zwischen Datenbedarf und Endpunkt-Design ist der praktische Kern von GraphQL und der Grund, warum Frontend-Teams damit deutlich autonomer arbeiten können. Im Alltag bedeutet das kürzere Abstimmungsschleifen zwischen Frontend und Backend und schnellere Iterationen an der Oberfläche.

Die drei Operationstypen

  • Query — liest Daten, ohne sie zu verändern (das Gegenstück zu GET bei REST).
  • Mutation — verändert Daten: anlegen, aktualisieren, löschen (entspricht POST, PUT, PATCH, DELETE).
  • Subscription — hält eine Verbindung offen und pusht Änderungen in Echtzeit an den Client, typischerweise über WebSockets. Ideal für Live-Tickers, Chat oder Lagerbestands-Updates.

Alle drei laufen über einen einzigen HTTP-Endpunkt, meist /graphql. Das unterscheidet GraphQL fundamental von REST, wo jede Ressource ihre eigene URL hat.

Diese Bündelung auf einen Endpunkt hat einen praktischen Nebeneffekt: Die gesamte API ist über das Schema introspektierbar. Werkzeuge wie der GraphiQL- oder Apollo-Sandbox-Explorer zeigen dir live alle verfügbaren Typen, Felder und Argumente an und erlauben es, Queries interaktiv zu bauen und auszuprobieren. Für Entwickler ist das ein enormer Produktivitätsgewinn gegenüber dem Durchforsten statischer REST-Dokumentation, und für die Einarbeitung neuer Teammitglieder verkürzt es die Lernkurve spürbar.

Mit GraphQL flexibel genau die Daten abfragen

Von der Schnittstellen-Architektur bis zur Drittanbieter-Integration – maßgeschneiderte Software aus einer Hand.

Enterprise-Software-Leistungen ansehen

Vorteile und Schattenseiten im Überblick

GraphQL ist kein Allheilmittel, sondern ein Werkzeug mit klaren Stärken und ebenso klaren Kosten. Bevor du es einführst, lohnt ein nüchterner Blick auf beide Seiten — denn der Aufwand für Schema-Design, Resolver und Betrieb ist real und sollte sich durch einen konkreten Nutzen rechtfertigen. Die folgende Gegenüberstellung fasst die wichtigsten Punkte zusammen:

GraphQL im Vergleich: Stärken und Herausforderungen für den produktiven Einsatz
AspektStärkeHerausforderung
DatenabrufKein Over-/Under-Fetching, eine Anfrage statt vielerKomplexe Queries können den Server stark belasten
TypisierungSchema als verbindlicher, maschinenlesbarer VertragSchema-Pflege erfordert Disziplin
CachingFeingranular auf Client-Ebene möglichHTTP-Caching schwieriger als bei REST (alles via POST auf einen Endpunkt)
PerformanceSchlanke Antworten, weniger RoundtripsDas N+1-Problem bei naiver Resolver-Implementierung

Das N+1-Problem ist die häufigste Performance-Falle: Fragt eine Query eine Liste von zehn Bestellungen ab und für jede den zugehörigen Kunden, führt ein naiv implementierter Resolver elf Datenbankabfragen aus (eine für die Liste, zehn für die Kunden). Die etablierte Lösung ist ein DataLoader, der diese Einzelabfragen bündelt (Batching) und cached. Wer GraphQL produktiv betreibt, muss dieses Muster kennen — sonst skaliert die API nicht.

Ein weiterer Aspekt, der in der Praxis oft unterschätzt wird, ist die Fehlerbehandlung. GraphQL liefert standardmäßig fast immer den HTTP-Status 200 OK und transportiert Fehler in einem eigenen errors-Feld der Antwort — auch wenn nur ein Teil der Query fehlschlug. Eine Antwort kann also gleichzeitig erfolgreiche Daten und Fehler enthalten (partielle Ergebnisse). Das ist mächtig, erfordert auf Client-Seite aber eine sorgfältigere Auswertung als bei REST, wo der Status-Code allein schon viel aussagt. Teams, die von REST kommen, müssen sich hier umgewöhnen.

GraphQL in der Praxis

Die GitHub GraphQL API (v4) ist eines der prominentesten Beispiele: GitHub bietet REST und GraphQL parallel an und empfiehlt GraphQL für komplexe Abfragen, bei denen man sonst viele REST-Calls bräuchte. Auch Shopify setzt stark auf GraphQL und migriert seine Admin-API zunehmend dorthin. Im E-Commerce-Umfeld nutzt Shopware mit seiner Store-API GraphQL-ähnliche Konzepte für Headless-Szenarien, und Frameworks wie Apollo (Client und Server) sowie Relay haben sich als De-facto-Werkzeuge etabliert. Auf Server-Seite im Node.js-Umfeld sind Apollo Server und GraphQL Yoga weit verbreitet — beides passt gut zu einem modernen NestJS-Backend, wie wir es in Enterprise-Projekten einsetzen.

GraphQL spielt seine Stärken besonders im Headless-Commerce- und Composable-Commerce-Umfeld aus, wo ein Frontend Daten aus vielen Quellen (Shop, PIM, CMS, Suche) bündeln muss. Statt das Frontend mit der Orchestrierung vieler REST-Endpunkte zu belasten, kann eine GraphQL-Schicht (oft als BFF, Backend for Frontend, oder über einen Federation-Gateway) diese Quellen zu einem konsistenten Graphen zusammenführen.

Wann GraphQL — und wann lieber REST?

GraphQL lohnt sich, wenn du viele verschiedene Clients mit unterschiedlichem Datenbedarf hast, wenn Oberflächen tief verschachtelte Daten brauchen oder wenn du Daten aus mehreren Backends zusammenführst. Es ist Mehraufwand, wenn deine API simpel und ressourcenorientiert ist — dann ist REST schneller gebaut und besser cachebar. Auch für reine Datei-Uploads oder einfache CRUD-Schnittstellen ist REST oft die pragmatischere Wahl. Die Entscheidung ist keine Glaubensfrage: Viele reife Systeme bieten beides an und lassen die Clients wählen. In der Beratung empfehlen wir GraphQL selten als Selbstzweck, sondern dann, wenn der konkrete Datenbedarf der Frontends es rechtfertigt.

Die offizielle Spezifikation und ausführliche Lernressourcen findest du auf graphql.org.

Schema-Design und Federation in größeren Systemen

Je größer eine Organisation, desto mehr Teams arbeiten an unterschiedlichen Teilen der Daten. Hier hilft Apollo Federation: Mehrere unabhängige GraphQL-Services (Subgraphs) werden über ein Gateway zu einem einzigen, einheitlichen Graphen zusammengeführt. Das Bestell-Team pflegt den Bestell-Subgraph, das Produkt-Team den Produkt-Subgraph — und der Client sieht trotzdem nur ein konsistentes Schema. Das ist das GraphQL-Pendant zu einer sauber geschnittenen Microservices-Landschaft und ein wichtiger Baustein, damit GraphQL auch in größeren Enterprise-Architekturen nicht zum Engpass wird.

Beim Schema-Design selbst gelten ein paar bewährte Faustregeln: Felder additiv weiterentwickeln statt brechend ändern, das @deprecated-Directive nutzen, um Felder schonend auszumustern, und das Schema an den fachlichen Bedürfnissen der Clients ausrichten statt an der internen Datenbankstruktur. Ein gutes Schema ist ein Produkt, kein Abbild der Tabellen. Diese Denkweise — das Schema als langlebigen Vertrag zu behandeln — entscheidet maßgeblich darüber, ob eine GraphQL-API über Jahre wartbar bleibt oder zur Altlast wird.

Sicherheit und Betrieb

Die Flexibilität von GraphQL ist zugleich ihr größtes Risiko: Ein Client kann theoretisch beliebig tiefe und teure Queries formulieren. Produktive GraphQL-APIs brauchen deshalb Schutzmechanismen wie Query-Depth-Limiting (maximale Verschachtelungstiefe), Query-Complexity-Analyse (Kostenbudget pro Anfrage), Rate-Limiting und das Deaktivieren der Introspection in Produktion, wenn das Schema nicht öffentlich sein soll. Authentifizierung läuft meist über dieselben Mechanismen wie bei REST — Bearer-Tokens, JWT, API-Keys — und die Autorisierung gehört pro Feld oder Resolver durchgesetzt, nicht nur pro Endpunkt. Wer diese Aspekte ignoriert, öffnet die Tür für Denial-of-Service durch teure Queries.

Ein bewährtes Muster für öffentliche oder mobile Clients sind außerdem persistierte Queries: Statt beliebige Queries zuzulassen, registriert der Client vorab eine feste Liste erlaubter Operationen, die der Server unter einem Hash kennt. Zur Laufzeit schickt der Client nur noch den Hash statt der vollen Query. Das reduziert die Angriffsfläche drastisch, spart Bandbreite und macht zugleich besseres Edge-Caching möglich. Für eine Mobile App im Produktivbetrieb ist das oft der pragmatischste Weg, die Flexibilität von GraphQL mit den Sicherheits- und Performance-Anforderungen eines öffentlichen Endpunkts in Einklang zu bringen.

Häufige Fragen zu GraphQL

Ist GraphQL ein Ersatz für REST?
Nicht zwingend. GraphQL und REST lösen unterschiedliche Probleme. Viele Systeme betreiben beide parallel und nutzen GraphQL für komplexe, client-getriebene Abfragen und REST für einfache, cachebare Ressourcen.

Braucht GraphQL eine spezielle Datenbank?
Nein. GraphQL ist datenbankunabhängig. Es liegt als Abstraktionsschicht über beliebigen Datenquellen — relationale Datenbanken, NoSQL, andere APIs oder eine Mischung davon.

Was ist das N+1-Problem bei GraphQL?
Ein Performance-Problem, bei dem für eine Liste von N Elementen N zusätzliche Abfragen ausgelöst werden. Die Standardlösung ist ein DataLoader, der die Abfragen bündelt und cached.

Wie funktioniert Caching bei GraphQL?
Anders als bei REST, wo HTTP-Caching über URLs greift, läuft GraphQL meist über POST auf einen Endpunkt. Caching passiert deshalb eher auf Client-Ebene (etwa im Apollo Client Cache) oder über persistierte Queries.

Ist GraphQL nur für große Anwendungen sinnvoll?
Nicht ausschließlich, aber der Mehraufwand für Schema und Resolver lohnt sich vor allem, wenn mehrere Clients mit unterschiedlichem Datenbedarf bedient werden oder Daten aus mehreren Quellen zusammenkommen.

Weiterführende Artikel