{ }
type
GraphQL · Dokumentation · @doc · Schema Registry · Apollo Studio
GraphQL API dokumentieren
ohne Leser zu überfordern

Gute GraphQL-Dokumentation ist keine statische Datei, sondern lebt im Schema selbst – ergänzt durch Introspection-Tools, lebende Beispielqueries, Deprecation-Strategien und einen Schema-Registry-Workflow, der Änderungen kommunizierbar macht.

13 Min. Lesezeit @doc · Introspection · Apollo Studio · Schema Registry · Deprecation GraphQL · Magento · API Design

1. Das Dokumentationsproblem bei GraphQL

GraphQL hat einen eingebauten Dokumentationsmechanismus – Introspection –, der das vollständige Schema maschinell abfragbar macht. Das klingt nach einer Lösung für das Dokumentationsproblem, ist aber nur die Grundlage. Introspection liefert Typnamen, Feldlisten und Argumente, aber keine Erklärungen zu Bedeutung, Einschränkungen oder empfohlener Verwendung. Ein Frontend-Entwickler, der das erste Mal auf eine Magento GraphQL-API trifft, sieht im Schema hunderte von Typen und Feldern – und weiß ohne Kontextwissen nicht, welche Query für seinen Use Case die richtige ist.

Das eigentliche Dokumentationsproblem bei GraphQL ist die Balance zwischen Vollständigkeit und Zugänglichkeit. Eine vollständige Referenzdokumentation mit jedem Typ und jedem Feld ist im Schema durch Introspection abdeckbar. Was fehlt, ist der Guide-Aspekt: Welche drei Queries reichen aus, um ein Produktlisten-Frontend zu bauen? Was bedeutet price_range im Unterschied zu special_price? Welche Felder sind deprecated und was ist die Alternative? Diese Informationen können nicht automatisch aus dem Schema extrahiert werden – sie müssen vom API-Team bewusst hinzugefügt werden.

2. @doc-Direktiven: Dokumentation im Schema selbst

In Magento wird die @doc-Direktive verwendet, um Typen, Felder und Argumente direkt im Schema zu dokumentieren. Die Dokumentation wird über Introspection sichtbar und erscheint in Tools wie GraphiQL, Altair und Apollo Studio direkt neben dem Feld. Das ist der wichtigste Unterschied zu einer externen Dokumentationsdatei: die @doc-Dokumentation kann nicht veralten, ohne dass das Schema aktualisiert wird. Sie ist immer synchron mit der tatsächlichen API.

Gute @doc-Beschreibungen erklären die Semantik, nicht den Typ. Der Typ ist schon im Schema deklariert – eine Beschreibung, die nur wiederholt, was der Typ sagt ("Ein String-Wert"), ist nutzlos. Eine gute Beschreibung erklärt, was das Feld bedeutet, wann es null ist, welche Einheit ein numerischer Wert hat und was die Unterschiede zu ähnlichen Feldern sind. Kurz: was ein erfahrener Entwickler einer Person erklären würde, die das Feld zum ersten Mal sieht.


# Good @doc usage: explain semantics, not the type
type Product {
    sku: String!
        @doc(description: "Stock Keeping Unit — unique product identifier across all stores. Never changes after creation.")

    name: String!
        @doc(description: "Product display name in the current store's locale. May differ between store views.")

    price_range: PriceRange!
        @doc(description: "Price range considering configurable product variants. Use minimum_price.final_price for display. Includes taxes if store is configured to show prices with tax.")

    special_price: Float
        @doc(description: "Deprecated. Use price_range.minimum_price instead. Returns null if no special price is active for the current date range.")
        @deprecated(reason: "Use price_range.minimum_price.final_price — special_price does not account for catalog rules.")

    stock_status: ProductStockStatus!
        @doc(description: "Current stock status: IN_STOCK, OUT_OF_STOCK or null for non-tracked inventory. Does not reflect real-time warehouse data.")
}

3. Introspection als Dokumentationsgrundlage

Die GraphQL-Introspection-Query { __schema { types { name description fields { name description } } } } gibt das vollständige Schema inklusive aller Beschreibungen zurück. Tools wie GraphiQL nutzen diese Query im Hintergrund, um die Dokumentation seitenweise zu rendern. Das bedeutet: Jede @doc-Beschreibung, die im Schema steht, ist sofort in jedem Introspection-basierten Tool sichtbar – ohne manuellen Export, ohne manuelles Publishing.

Für Produktionsumgebungen ist es sinnvoll, Introspection für unauthentifizierte Anfragen zu deaktivieren. Das verhindert, dass das vollständige Schema für Dritte sichtbar ist, und reduziert die Angriffsfläche für gezielte Query-Konstruktion gegen bekannte Felder. In Entwicklungs- und Staging-Umgebungen hingegen sollte Introspection aktiv sein, damit Entwicklungstools korrekt funktionieren. Magento bietet dafür keine eingebaute Konfiguration; ein Nginx-Level-Block oder ein Plugin auf der Request-Verarbeitungsebene ist die übliche Lösung.

4. Tools: GraphiQL, Apollo Studio und Hive im Vergleich

GraphiQL ist das Browser-basierte Standard-Tool für GraphQL-Exploration: Es nutzt Introspection, zeigt eine Dokumentationsansicht und erlaubt das interaktive Ausführen von Queries. Magento liefert GraphiQL in der Entwicklungsumgebung mit – erreichbar unter /graphiql des Shop-Endpoints. Für Produktivumgebungen ist der GraphQL-Endpunkt selbst der Dokumentationsanker, wenn Tools wie Altair gegen ihn konfiguriert werden.

Apollo Studio (ehemals Graph Manager) ist ein vollständiges Schema-Management-Tool: Es speichert Schema-Versionen, visualisiert Breaking Changes zwischen Versionen, zeigt Query-Analytics für produktive Anfragen und erlaubt Kommentare und Annotationen auf Feldern jenseits der @doc-Direktive. GraphQL Hive (The Guild) ist eine Open-Source-Alternative mit ähnlichem Funktionsumfang, die selbst gehostet werden kann. Beide Tools sind für Teams mit mehr als einer Person an der API sinnvoll – für Solo-Entwickler reicht GraphiQL mit gutem @doc-Einsatz.

5. Lebende Beispielqueries als Dokumentationsform

Die effektivste Form der GraphQL-Dokumentation sind Use-Case-orientierte Beispielqueries: Queries, die einen konkreten Anwendungsfall vollständig abbilden und kommentiert erklären, warum bestimmte Felder angefragt werden und welche Optionen es gibt. Diese Queries können in einem Apollo Studio als Saved Operations hinterlegt, in einem Git-Repository als .graphql-Dateien versioniert oder in einer Persisted-Query-Bibliothek gespeichert werden.

Der Vorteil von Beispielqueries gegenüber Feld-für-Feld-Beschreibungen ist der Use-Case-Fokus: Statt zu fragen "Was macht dieses Feld?", beantwortet die Beispielquery die Frage "Welche Query brauche ich, um eine Produktlistenseite zu bauen?" Eine handvoll gut gewählter Beispielqueries – Produktliste, Produktdetail, Warenkorb, Checkout, Kundenlogin – sind für einen Frontend-Entwickler wertvoller als eine vollständige Feld-Dokumentation aller 400 Felder im Magento-Schema.


# Use-case example: Product listing page query
# Covers: pagination, filters, sorting, price display with tax
query ProductListingPage(
  $categoryId: String!
  $pageSize: Int = 20
  $currentPage: Int = 1
  $sort: ProductAttributeSortInput
) {
  products(
    filter: { category_uid: { eq: $categoryId } }
    pageSize: $pageSize
    currentPage: $currentPage
    sort: $sort
  ) {
    total_count
    page_info {
      current_page
      page_size
      total_pages
    }
    items {
      uid
      sku
      name
      url_key
      # Use price_range — not special_price (deprecated)
      price_range {
        minimum_price {
          regular_price { value currency }
          final_price { value currency }   # includes active catalog rules
          discount { percent_off amount_off }
        }
      }
      # Thumbnail for listing card — not full image
      thumbnail {
        url
        label
      }
      stock_status
    }
  }
}

6. Deprecation: alte Felder kommunizieren ohne Schock

Das @deprecated-Direktiv in GraphQL ist der Mechanismus für geordnete API-Evolution: Ein Feld wird als deprecated markiert, bleibt aber funktional, bis alle Clients auf die neue Variante migriert haben. Die reason-Angabe in @deprecated(reason: "...") ist die Pflichtinformation: Sie erklärt, welches Feld die Alternative ist und warum das ursprüngliche Feld ersetzt wird. Ohne eine klare reason-Angabe ist die Deprecation für den Konsumenten nutzlos – er weiß, dass etwas deprecated ist, aber nicht was er stattdessen verwenden soll.

Ein Deprecation-Workflow für Teams umfasst mehr als das Setzen der Direktive: Zunächst wird das neue Feld eingeführt, bevor das alte als deprecated markiert wird. Dann folgt eine Kommunikationsphase, in der Frontend-Teams über die Änderung informiert werden – über Changelog, Slack, Schema-Registry-Notifications oder direkten Kontakt. Erst nach einer definierten Übergangszeit wird das deprecated Feld tatsächlich entfernt. Dieser Prozess ist in kleinen Teams oft informeller, in großen Plattformen mit vielen Frontend-Konsumenten aber kritisch für stabile API-Verträge.

7. Schema-Registry: Dokumentation im Team

Eine Schema-Registry ist ein zentrales Repository für GraphQL-Schema-Versionen, das mehr leistet als ein einfaches Git-Repository: Es validiert Breaking Changes automatisch, sendet Benachrichtigungen an betroffene Teams, verknüpft Schema-Versionen mit Deployment-Events und visualisiert Schema-Diffs in einem lesbaren Format. Apollo Studio und GraphQL Hive sind die bekanntesten Implementierungen. Für Magento-Projekte ohne Federation ist eine selbst gehostete Schema-Registry oft ausreichend: Ein einfaches Git-Repository mit einem GraphQL-Inspector-Check in der CI-Pipeline deckt die wichtigsten Anforderungen ab.

GraphQL Inspector (@graphql-inspector von The Guild) prüft in der CI-Pipeline, ob eine neue Schema-Version Breaking Changes enthält: entfernte Felder, geänderte Typen, geänderte Non-Nullable-Deklarationen. Diese Checks können als verpflichtend konfiguriert werden, sodass Breaking Changes ohne explizite Ausnahme-Konfiguration den Build blockieren. Das ist die minimale Schema-Governance, die jedes Team mit mehr als einer Person an der API einrichten sollte.

8. Magento-Schema dokumentieren: wo anfangen

Das Magento-Core-Schema hat bereits @doc-Direktiven auf vielen Feldern, aber die Qualität ist ungleichmäßig: Manche Felder haben präzise Beschreibungen, andere haben generische oder fehlende Erklärungen. Für eigene Erweiterungen des Schemas ist es empfehlenswert, jeden Typ, jedes Feld und jedes Argument mit einer @doc-Beschreibung zu versehen – auch wenn die Beschreibung kurz ist. Kurz und präzise ist besser als gar nicht dokumentiert.

Der pragmatische Einstiegspunkt für die Dokumentation eines Magento-Projekts ist die Zusammenstellung der fünf bis zehn häufigsten Use-Case-Queries im Frontend und ihre Dokumentation als kommentierte .graphql-Dateien im Projektrepository. Diese Queries sind die "lebende Dokumentation" des Projekts: Sie zeigen, was die API in der Praxis leistet, welche Felder relevant sind und welche Muster bei Problemen zu untersuchen sind. Ein neuer Frontend-Entwickler im Projekt findet dort seinen Einstiegspunkt – ohne das gesamte Schema zu lesen.

9. Zusammenfassung

GraphQL-APIs ohne kognitive Überlastung zu dokumentieren bedeutet: Dokumentation im Schema selbst durch @doc-Direktiven, Introspection-Tools als interaktive Referenz, Use-Case-Queries als primäre Dokumentationsform und einen klaren Deprecation-Prozess als Kommunikationsmittel für API-Evolution. Diese vier Ebenen zusammen ergeben eine Dokumentation, die automatisch aktuell bleibt, werkzeuggestützt zugänglich ist und den Fokus auf das legt, was Frontend-Teams tatsächlich brauchen: Antworten auf ihre konkreten Use Cases.

Der häufigste Fehler bei GraphQL-Dokumentation ist der Versuch, alles zu dokumentieren. Ein vollständiges Handbuch aller 400 Felder des Magento-Schemas ist nicht hilfreich, weil es niemand liest. Zehn kommentierte Use-Case-Queries, fünf @doc-Beschreibungen auf den kritischsten Feldern und ein klarer Deprecation-Hinweis auf drei veralteten Feldern sind wertvoller als ein vollständiges Referenzwerk ohne Praxisbezug.

GraphQL API dokumentieren ohne Leser zu überfordern — Das Wichtigste auf einen Blick

@doc im Schema

Semantik erklären, nicht den Typ wiederholen. @doc-Beschreibungen sind immer synchron mit der API – sie können nicht veralten ohne das Schema zu aktualisieren.

Use-Case-Queries

5–10 kommentierte Queries für die häufigsten Frontend-Use-Cases im Git-Repository. Wertvoller als eine vollständige Feld-Referenz ohne Praxisbezug.

Deprecation

@deprecated mit klarer reason-Angabe, Einführung des neuen Felds vor der Deprecation des alten, Übergangszeit kommunizieren, dann entfernen.

Schema-Registry

GraphQL Inspector in CI-Pipeline für automatische Breaking-Change-Erkennung. Apollo Studio oder Hive für Teams mit vielen Konsumenten.

10. Vergleich: Dokumentationsstrategien für GraphQL

Strategie Aufwand Aktualitätsrisiko Geeignet für
@doc im Schema Gering Keines – immer synchron Alle Projekte
Use-Case-Queries in Git Mittel Gering – bei Schema-Änderung prüfen Alle Projekte mit Frontend-Team
Apollo Studio / Hive Mittel bis hoch Keines – Schema-versioniert Teams mit mehreren Konsumenten
Externe Dokumentation (Confluence) Hoch Hoch – manuell zu pflegen Überbrückung wenn keine bessere Option
GraphQL Inspector in CI Einmalig einrichten Automatisch – blockiert Breaking Changes Teams ab 2 Entwicklern an der API

11. FAQ: GraphQL API dokumentieren ohne Leser zu überfordern

1Unterschied @doc und @deprecated?
@doc fügt eine Beschreibung hinzu, die über Introspection sichtbar ist. @deprecated markiert ein Feld als veraltet mit Grund. Beide erscheinen in GraphiQL und Apollo Studio.
2@doc-Beschreibungen veralten lassen?
Nicht möglich. @doc ist direkt im Schema – kann nicht veralten, ohne dass das Schema geändert wird. Automatisch synchron mit der API.
3Introspection in Produktion deaktivieren?
Für öffentliche APIs sinnvoll. Verringert die Angriffsfläche. In Entwicklung und Staging aktiv lassen, damit Tools korrekt funktionieren.
4Was macht GraphQL Inspector?
Vergleicht zwei Schema-Versionen und identifiziert Breaking Changes. In CI-Pipelines integrierbar, blockiert den Build bei nicht erlaubten Breaking Changes.
5Apollo Studio vs. GraphQL Hive?
Studio bei bestehendem Apollo-Ökosystem. Hive für selbst gehostete Open-Source-Lösung außerhalb des Apollo-Stacks. Beide leisten ähnliches für Schema-Management.
6Wie lange bleibt ein deprecated Feld verfügbar?
Mindestens einen Release-Zyklus. Bei großen Plattformen drei bis sechs Monate. Niemals ohne Vorankündigung aller bekannten Konsumenten entfernen.
7Was sind Use-Case-Queries und wo hinterlegt man sie?
Kommentierte Queries für konkrete Frontend-Anwendungsfälle. Als .graphql-Dateien im Projektrepository, als Saved Operations in Apollo Studio oder als Persisted Queries.
8Muss jedes Feld eine @doc-Beschreibung haben?
Idealerweise ja, pragmatisch wichtiger sind nicht-offensichtliche Felder, Felder mit Einschränkungen und Alternativen zu deprecated Feldern.
9Dokumentation automatisch generieren?
Tools wie SpectaQL und GraphDoc können aus Introspection statische Doku-Seiten generieren. Qualität hängt von vorhandenen @doc-Beschreibungen ab. Ohne @doc: nur eine Typ-Referenz ohne Semantik.
10Magento customer-Query für Frontend-Teams dokumentieren?
Kommentierte Beispielquery mit relevanten Feldern, Hinweis auf Token-Authentifizierung, Erklärung von addresses/default_billing/default_shipping und Hinweis auf deprecated Felder und ihre Alternativen.