als alternative zu rest @manuel mauky manuel mauky- bibliothek generiert graphql-schema aus jpa...

94
als Alternative zu REST Manuel Mauky @manuel_mauky

Upload: others

Post on 01-Aug-2020

4 views

Category:

Documents


0 download

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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
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

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

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

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

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

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

{ 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

{ 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

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

{ 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

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

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

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

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

{ 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

{ 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

{ 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

{ 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

{ 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

{ 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

{ 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

{ 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

{ 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

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

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
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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

- 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

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

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

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

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

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

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

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

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

Fragen?@manuel_mauky

github.com/lestardwww.lestard.eu