als alternative zu rest @manuel mauky manuel mauky- bibliothek generiert graphql-schema aus jpa...
TRANSCRIPT
![Page 1: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/1.jpg)
als Alternative zu RESTManuel Mauky
@manuel_mauky
![Page 2: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/2.jpg)
API
Single-Page-Apps und mobile Apps
![Page 3: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/3.jpg)
API
Wie kommen die Daten zum Client?
?
![Page 4: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/4.jpg)
Klassisch: REST/Hypermedia● zahlreiche Ressourcen, jeweils über URIs erreichbar
● Hyperlinks zwischen Ressourcen
● HTTP als Protokoll
● verschiedene Repräsentationen, z.B. JSON
![Page 5: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/5.jpg)
MotivationWarum lohnt es sich, sich mit GraphQL zu beschäftigen?
![Page 6: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/6.jpg)
Gründe, sich mit GraphQL zu beschäftigen- Löst einige Schwierigkeiten mit REST-APIs
- Netzwerk-Performance
- Ermöglicht neue Ideen im Frontend
![Page 7: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/7.jpg)
Beispiel
![Page 8: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/8.jpg)
Beispiel: Blog-System
Article Author
Comment
1
0..*
1..*0..*
0..*
0..1
![Page 9: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/9.jpg)
Articleid: String
permalink: String
teaser: String
text: String
releaseDate: Datetime
authors: [Author]
comments: [Comment]
![Page 10: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/10.jpg)
Authorid: String
name: String
comments: [Comment]
![Page 11: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/11.jpg)
Commentid: String
text: String
author: Author?
guestAuthor: String?
![Page 12: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/12.jpg)
REST+Hypermedia
![Page 13: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/13.jpg)
Use-Case: Artikel-Übersicht (10 Artikel)Benötigte Daten:
Je Artikel:
Titel, Permalink, Teasertext, releasedate
Autoren: Name
Anzahl Kommentare
![Page 14: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/14.jpg)
Use-Case 2: Artikel-DetailsBenötigte Daten:
Artikel:
Titel, Permalink, Teasertext, releasedate, Text
Autoren: Name
Kommentare: Autorname, Text
![Page 15: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/15.jpg)
REST+HypermediaGET /api/ → Liste von verfügbaren Ressourcen
GET /api/article → Liste von Artikeln mit Titel, Permalink, Teaser, ReleaseDate
![Page 16: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/16.jpg)
REST+HypermediaJe Artikel:
GET /api/article/:id/authors → Autoren des Artikels
GET /api/article/:id/comments → Kommentare
![Page 17: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/17.jpg)
REST+HypermediaDetail-Ansicht:
GET /api/article/:id → Text
![Page 18: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/18.jpg)
REST+Hypermedia- viele Requests (im Beispiel 22 Requests für Startseite)
- Underfetching (zu wenig Daten geladen)
- Overfetching (überflüssige Daten geladen)
![Page 19: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/19.jpg)
Naive "Lösung":
Hypermedia → Alle Daten "embedden"
![Page 20: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/20.jpg)
Lösung: Alle Daten "embedden"Idee: Artikel-Ressource enthält direkt alle Daten
Nur noch 1 Request
![Page 21: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/21.jpg)
Lösung: Alle Daten "embedden"Idee: Artikel-Ressource enthält direkt alle Daten
Nur noch 1 Request
Probleme: - Unnötige Daten werden übertragen- Vorteile von Hypermedia gehen verloren
![Page 22: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/22.jpg)
Query-Parameter / Projections
![Page 23: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/23.jpg)
Query-Parameter / Projections/api/article?withAuthor=true&withComments=true
![Page 24: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/24.jpg)
Query-Parameter / Projections/api/article?projection=short-article
![Page 25: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/25.jpg)
View-Spezifische Ressourcen
![Page 26: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/26.jpg)
View-Spezifische Ressourcen/api/article_overview
/api/article_details/:id
/api/author_list
/api/authors_comments_list/:id
![Page 27: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/27.jpg)
Problem: Kopplung Server und Client
![Page 28: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/28.jpg)
Problem: Kopplung Server und ClientNeue Ansichten im Client benötigen neue Ressourcen auf dem Server
![Page 29: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/29.jpg)
Herausforderung: Fehlende Typisierung
![Page 30: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/30.jpg)
Herausforderung: Fehlende Typisierung/api/article/:id
Welche Daten kommen eigentlich als Antwort?
![Page 31: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/31.jpg)
Herausforderung: Versionierung
![Page 32: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/32.jpg)
Herausforderung: Versionierung/api/article/:id
Welche Daten kommen eigentlich als Antwort?
Welche Daten kommen in 2 Monaten als Antwort?
![Page 33: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/33.jpg)
![Page 34: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/34.jpg)
GraphQL- Abfragesprache für (Web-)APIs
- Entwickelt von Facebook
- Seit 2012 bei Facebook Mobile App im Einsatz
- Seit Ende 2015 OpenSource
![Page 35: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/35.jpg)
GraphQL - Technisches- ein einziger Endpunkt
- statisch typisiertes Schema
- Schema erlaubt Introspection
- Queries per HTTP POST oder GET
- Trennung von Query und Mutation → Ansätze von CQRS
![Page 36: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/36.jpg)
Beispiel: Blog-System
![Page 37: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/37.jpg)
Use-Case: Artikel-Übersicht (10 Artikel)Benötigte Daten:
Je Artikel:
Titel, Permalink, Teasertext, releasedate
Autoren: Name
Anzahl Kommentare
![Page 38: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/38.jpg)
Query:
{ Article { title }}
Response:
{ "data": { "Article": [ { "title": "Some Title" }, { "title": "Other.." }
] }}
![Page 39: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/39.jpg)
{ Article { id title permalink teaser releaseDate }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02.." }, { "id": "sdöf234ds2", "title": "Other..", ... }
] }}
![Page 40: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/40.jpg)
{ Article { id title permalink teaser releaseDate authors { name } comments { id } }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02..", "authors": [ { "name": "Hugo", } ], "comments": [ { "id": "lsldsö2fö2", } }, { "id": "sdöf234ds2", "title": "Other..", ... }
] }}
![Page 41: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/41.jpg)
Use-Case 2: Artikel-DetailsBenötigte Daten:
Artikel:
Titel, Permalink, Teasertext, releasedate, Text
Autoren: Name
Kommentare: Autorname, Text
![Page 42: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/42.jpg)
{ Article(id: "sd342") { id text ... authors { name } comments { id text author { name } } }}
{ "data": { "Article": [ { "id": "sd342", ... "authors": [ { "name": "Hugo", } ], "comments": [ { "id": "lsldsö2fö2", "text": "Erster!!111!", "author": { "name": "Horsti" } } ] }, { "id": "sdöf234ds2", "title": "Other..", ... }
] }}
![Page 43: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/43.jpg)
Mutations
![Page 44: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/44.jpg)
mutation { addAuthor(username: "Horsti") {
idname
}}
{ "data": { "addAuthor": { "id": "lsdö34", "name": "Horsti" } }}
![Page 45: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/45.jpg)
Neue Ideen im Frontend
![Page 46: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/46.jpg)
Query-Optimierung + Caching
![Page 47: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/47.jpg)
{ Article { id title permalink teaser releaseDate }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02.." }, { "id": "sdöf234ds2", "title": "Other..", ... }
] }}
Schritt 1: Artikel-Übersicht
![Page 48: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/48.jpg)
{ Article (id: "sd34..") { id title text permalink teaser releaseDate }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "text": "some long text…", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02.." } ] }}
Schritt 2: Artikel-Details
![Page 49: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/49.jpg)
{ Article (id: "sd34..") { id title text permalink teaser releaseDate }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "text": "some long text…", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02.." } ] }}
Schritt 2: Artikel-Details
![Page 50: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/50.jpg)
{ Article (id: "sd34..") { id title text permalink teaser releaseDate }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "text": "some long text…", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02.." } ] }}
Schritt 2: Artikel-Details
![Page 51: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/51.jpg)
{ Article (id: "sd34..") { id title text permalink teaser releaseDate }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "text": "some long text…", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02.." } ] }}
Schritt 2: Artikel-Details
![Page 52: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/52.jpg)
{ Article (id: "sd34..") { id text }}
{ "data": { "Article": [ { "id": "sd3423s32", "text": "some long text…", } ] }}
Schritt 2: Artikel-Details
![Page 53: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/53.jpg)
{ Article (id: "sd34..") { id text }}
{ "data": { "Article": [ { "id": "sd3423s32", "text": "some long text…", } ] }}
Schritt 2: Artikel-Details
![Page 54: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/54.jpg)
{ Article { id title permalink teaser releaseDate }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02.." }, { "id": "sdöf234ds2", "title": "Other..", ... }
] }}
Schritt 3: Zurück zur Übersicht
![Page 55: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/55.jpg)
{ Article { id title permalink teaser releaseDate }}
{ "data": { "Article": [ { "id": "sd3423s32", "title": "Some Title", "permalink": "some_title", "teaser": "Lorem Ipsum..", "releaseDate": "2017-02.." }, { "id": "sdöf234ds2", "title": "Other..", ... }
] }}
Schritt 3: Zurück zur Übersicht
![Page 56: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/56.jpg)
Query-Optimierung und Caching- Entwickler beschreibt Daten-Anforderungen je Ansicht
- Framework optimiert Queries und übernimmt Caching
![Page 57: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/57.jpg)
Query co-location
![Page 58: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/58.jpg)
![Page 59: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/59.jpg)
Header-Komponente
{ Article(id: "123") { title authors { name } releaseDate}
![Page 60: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/60.jpg)
Autor-Komponente
{ Article(id: "123") { authors { name pictureUrl description }}
![Page 61: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/61.jpg)
Content-Komponente
{ Article(id: "123") { text }}
![Page 62: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/62.jpg)
Schlechte Idee: Jede Komponente führt eigene Requests aus
![Page 63: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/63.jpg)
Idee- Jede UI-Komponente definiert ihre
Daten-Anforderungen
query
queryquery
![Page 64: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/64.jpg)
Idee- Jede UI-Komponente definiert ihre
Daten-Anforderungen - Parents sammeln Queries von Childs
query
queryquery
![Page 65: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/65.jpg)
Idee- Jede UI-Komponente definiert ihre
Daten-Anforderungen - Parents sammeln Queries von Childs- Parents "mergen" Queries
query query
queryquery
![Page 66: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/66.jpg)
Idee- Jede UI-Komponente definiert ihre
Daten-Anforderungen - Parents sammeln Queries von Childs- Parents "mergen" Queries- Root-Komponente führt Gesamt-Query aus
query query
queryquery
query
![Page 67: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/67.jpg)
Idee- Jede UI-Komponente definiert ihre
Daten-Anforderungen - Parents sammeln Queries von Childs- Parents "mergen" Queries- Root-Komponente führt Gesamt-Query aus- Root reicht Daten an Kinder durchquery query
queryquery
query
![Page 68: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/68.jpg)
Vorteile- Childs sind unabhängig von ihren Parents
- Parents sind Unabhängig von Daten-Bedürfnissen der Childs
- Neues Feature (Daten) in Child → keine Änderung in Parent
- Queries können optimiert werden
- Caching
![Page 69: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/69.jpg)
GraphQL SchemaWie sieht der Server aus?
![Page 70: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/70.jpg)
type Author { id: ID! name: String!}
![Page 71: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/71.jpg)
type Author { id: ID! name: String! articles: [Article]}
type Comment { id: ID! text: String! author: Author]
type Article { id: ID! releaseDate: String teaser: String text: String permalink: String authors: [Author] comments: [Comment]}
![Page 72: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/72.jpg)
type QueryType { Author(id: String): [Authors] Article(id: String, permalink: String): [Article] Comment: [Comment]}
schema { query: QueryType mutation: MutationType}
![Page 73: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/73.jpg)
Wo kommen die Daten her?
![Page 74: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/74.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
![Page 75: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/75.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
![Page 76: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/76.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
![Page 77: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/77.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
id(a1)
![Page 78: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/78.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
{id:"123"}
id(a1)
![Page 79: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/79.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
{id:"123"}
id(a1) text(a1)
![Page 80: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/80.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
{id:"123"} {text:"lala"}
id(a1) text(a1)
![Page 81: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/81.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
{id:"123"} {text:"lala"}
id(a1) text(a1) authors(a1)
![Page 82: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/82.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
{id:"123"} {text:"lala"}
id(a1) text(a1) authors(a1)
[ author1 ]
![Page 83: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/83.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
{id:"123"} {text:"lala"}
id(a1) text(a1) authors(a1)
[ author1 ]
name(author1)
![Page 84: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/84.jpg)
Resolver
{Articles {
idtextauthors {
name}
}}
Articles()
[ a1 , a2 ]
{id:"123"} {text:"lala"}
id(a1) text(a1) authors(a1)
[ author1 ]
name(author1)
{name: "Hugo"}
![Page 85: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/85.jpg)
- für jedes Feld existiert eine Resolver-Funktion
- skalare Typen → "Getter" by default
- komplexe Typen → selbst implementieren
- Dadurch beliebige Daten-Quellen anbindbar
- Automatisierung durch Libraries
Wo kommen die Daten her?
![Page 86: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/86.jpg)
GraphQL JPA- https://github.com/jcrygier/graphql-jpa
- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver
- Beta-Status
- noch kein offizieller Mutation-Support
![Page 87: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/87.jpg)
Fazit
![Page 88: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/88.jpg)
Aktueller Stand- GraphQL-Spec existiert- Mehrere PAAS-Anbieter existieren- Ein paar Firmen migrieren (z.B. Github)- Referenz-Implementierung in JavaScript wird aktiv entwickelt- Java-Implementierungen existieren, aber weniger aktiv- REST-Wrapper für sanfte Migration
![Page 89: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/89.jpg)
Vorteile- Minimierung von Netzwerk-Requests- Minimierung von übertragenen Daten- Interessante Möglichkeiten für Entwickler
- Statische Typisierung des Schemas- API-Explorer
- Neue Frontend-Patterns ermöglichen saubere Komponenten-Trennung- Nur notwendige Felder werden resolved → Vorteil bei teurer Berechnung
![Page 90: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/90.jpg)
Nachteile / Offene Fragen- Framework-Support außerhalb von JavaScript- Microservices? API-Gateway?- Requests sind größer- Kein Caching auf Netzwerk-Ebene- N+1 Problem zum Server verschoben
- Lösung: DataFetcher
- Rekursive Queries / Nested-Queries
![Page 91: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/91.jpg)
Rekursive Queries{ Article { authors { articles { authors { articles { authors { … } } } }
![Page 92: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/92.jpg)
Nachteile / Offene Fragen- Framework-Support außerhalb von JavaScript- Microservices? API-Gateway?- Requests sind größer- Kein Caching auf Netzwerk-Ebene- N+1 Problem zum Server verschoben
- Lösung: DataFetcher
- Rekursive Queries- potentielles Sicherheits/Performance-Risiko- Lösung: Nesting-Level begrenzen
![Page 93: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/93.jpg)
Vorteile von REST+Hypermedia- Etablierte Technologie- Breite Tool- und Framework-Unterstützung- Caching auf Netzwerkebene- Server kann Client steuern → Update auf Server ändert Client-Verhalten- Dynamische Änderungen
"REST" ohne Hypermedia?
![Page 94: als Alternative zu REST @manuel mauky Manuel Mauky- Bibliothek generiert GraphQL-Schema aus JPA Entities inkl. Resolver - Beta-Status - noch kein offizieller Mutation-Support Fazit](https://reader034.vdocuments.net/reader034/viewer/2022043004/5f85c0a97ba8f07e7860c415/html5/thumbnails/94.jpg)
Fragen?@manuel_mauky
github.com/lestardwww.lestard.eu