$30 off During Our Annual Pro Sale. View Details »

GraphQL on Scala

GraphQL on Scala

Introduction for GraphQL and implementing GraphQL API using Scala.

petitviolet

June 28, 2018
Tweet

More Decks by petitviolet

Other Decks in Programming

Transcript

  1. (SBQI2-PO4DBMB
    'SJOHF$P -UE!QFUJUWJPMFU


    View Slide

  2. ͰɺͩΕʁ
    w )JSPLJ,PNVSBTBLJ
    w 8FC্Ͱ͸!QFUJUWJPMFU
    w 'SJOHFגࣜձࣾ
    w 4DBMBྺ͸೥΄Ͳ
    2

    View Slide

  3. ࠓ೔࿩͢͜ͱ
    w Կʹ(SBQI2-Λ࢖͍ͬͯΔͷ͔
    w ͳͥ(SBQI2-Λ࢖͍ͬͯΔͷ͔
    w 4DBMBͰ(SBQI2-͢Δ
    w ΍ͬͯΈͯͲ͏͔
    3

    View Slide

  4. Կʹ(SBQI2-Λ
    ࢖͍ͬͯΔͷ͔
    4

    View Slide

  5. Կʹ(SBQI2-Λ࢖͍ͬͯΔͷ͔
    w ΞυωοτϫʔΫͷ؅ཧը໘ͷαʔόαΠυ"1*
    w ޿ࠂͷ഑৴ઃఆΛ؅ཧ͢Δը໘ͷཪଆ
    w ඇެ։಺෦"1*ͱͯ͠ͷ(SBQI2-
    w ΫϥΠΞϯτ͸&MNͰ41"
    w 2VFSZ.VUBUJPOͲͪΒ΋(SBQI2-
    w Ұ෦ඇ(SBQI2-
    5

    View Slide

  6. ͳͥ(SBQI2-Λ
    ࢖͍ͬͯΔͷ͔
    6

    View Slide

  7. ͳͥ(SBQI2-Λ࢖͍ͬͯΔͷ͔
    w ʮ͑ͬɺ͜ͷϖʔδදࣔ͢Δͷʹճ΋"1*Λʁʯ
    w Կͱ͔͍͚ͨ͠Ͳ3&45ͱંΓ߹͍͕͔ͭͳ͍
    w ʮԶ͸ҰମԿΛʜʯΛආ͚͔ͨͬͨ
    w 63*ઃܭ΍1045165%&-&5&Ͱ೰Ήͱ͔
    w ྺ࢙ʹֶΜͩ
    w 3&45ɺૢ࡞ࢦ޲ɺ+40/31$ͳͲ
    w ۜͷ஄ؙΛ୳͢೔ʑ
    7

    View Slide

  8. https://speakerdeck.com/petitviolet/web-api-design


    View Slide

  9. https://speakerdeck.com/petitviolet/web-api-design
    Ͳ͏΍Β(SBQI2-͕͍͍Β͍͠


    View Slide

  10. ͳͥ(SBQI2-Λ࢖͍ͬͯΔͷ͔
    w ΫϥΠΞϯτଆʹ3FBEܥͷ੹຿Λد͍ͤͨ
    w %%%΍ͬͯͯ3FBEܥͷཁٻʹԠ͑Δͷ͕͖͍ͭ
    w 9YY3FQPTJUPSZ͕pOE#Z:ZZͩΒ͚ʹ
    w λΠϛϯά͕ྑ͔ͬͨ
    w ৽نϓϩδΣΫτൃ଍
    w αʔόαΠυʹࣗ෼͕ΞαΠϯ͞Εͨ
    w (SBQI2-Θ͔ΔΤϯδχΞ͕ϑϩϯτʹ΋
    10

    View Slide

  11. 4DBMBͰ(SBQI2-͢Δ
    11

    View Slide

  12. 4DBMBͰ(SBQI2-͢Δ
    w TBOHSJBHSBQIRMTBOHSJBΛ࢖͏
    w 4DBMBͷ(SBQI2-ϑϨʔϜϫʔΫ
    w 8FCϑϨʔϜϫʔΫ͸ಛʹ໰Θͳ͍
    w *'͸+40/Ͱɺ+40/ϥΠϒϥϦ΋ෳ਺ରԠ
    12

    View Slide

  13. งғؾ
    case class MyObject(id: Long, name: String)
    val myObjectType: ObjectType[Unit, MyObject] = derive.deriveObjectType()
    val myQuery: ObjectType[MyObjectRepository, Unit] = {
    ObjectType.apply(
    "MyQuery",
    fields[MyObjectRepository, Unit](
    { val idArg = Argument("id", LongType)
    Field(
    "findById",
    OptionType(myObjectType),
    arguments = idArg :: Nil,
    resolve = ctx => ctx.ctx.findById(ctx.arg(idArg)))
    },
    Field("all", ListType(myObjectType),
    resolve = ctx => Future { ctx.ctx.findAll })
    )
    )
    }
    13

    View Slide

  14. งғؾ
    case class MyObject(id: Long, name: String)
    val myObjectType: ObjectType[Unit, MyObject] = derive.deriveObjectType()
    val myQuery: ObjectType[MyObjectRepository, Unit] = {
    ObjectType.apply(
    "MyQuery",
    fields[MyObjectRepository, Unit](
    { val idArg = Argument("id", LongType)
    Field(
    "findById",
    OptionType(myObjectType),
    arguments = idArg :: Nil,
    resolve = ctx => ctx.ctx.findById(ctx.arg(idArg)))
    },
    Field("all", ListType(myObjectType),
    resolve = ctx => Future { ctx.ctx.findAll })
    )
    )
    }
    (SBQI2-ͷUZQF
    14

    View Slide

  15. งғؾ
    case class MyObject(id: Long, name: String)
    val myObjectType: ObjectType[Unit, MyObject] = derive.deriveObjectType()
    val myQuery: ObjectType[MyObjectRepository, Unit] = {
    ObjectType.apply(
    "MyQuery",
    fields[MyObjectRepository, Unit](
    { val idArg = Argument("id", LongType)
    Field(
    "findById",
    OptionType(myObjectType),
    arguments = idArg :: Nil,
    resolve = ctx => ctx.ctx.findById(ctx.arg(idArg)))
    },
    Field("all", ListType(myObjectType),
    resolve = ctx => Future { ctx.ctx.findAll })
    )
    )
    }
    ܕͷࣗಈಋग़
    15

    View Slide

  16. งғؾ
    case class MyObject(id: Long, name: String)
    val myObjectType: ObjectType[Unit, MyObject] = derive.deriveObjectType()
    val myQuery: ObjectType[MyObjectRepository, Unit] = {
    ObjectType.apply(
    "MyQuery",
    fields[MyObjectRepository, Unit](
    { val idArg = Argument("id", LongType)
    Field(
    "findById",
    OptionType(myObjectType),
    arguments = idArg :: Nil,
    resolve = ctx => ctx.ctx.findById(ctx.arg(idArg)))
    },
    Field("all", ListType(myObjectType),
    resolve = ctx => Future { ctx.ctx.findAll })
    )
    )
    }
    DPOUFYUͱͯ͠
    3FQPTJUPSZΛ࢖༻
    16

    View Slide

  17. งғؾ
    case class MyObject(id: Long, name: String)
    val myObjectType: ObjectType[Unit, MyObject] = derive.deriveObjectType()
    val myQuery: ObjectType[MyObjectRepository, Unit] = {
    ObjectType.apply(
    "MyQuery",
    fields[MyObjectRepository, Unit](
    { val idArg = Argument("id", LongType)
    Field(
    "findById",
    OptionType(myObjectType),
    arguments = idArg :: Nil,
    resolve = ctx => ctx.ctx.findById(ctx.arg(idArg)))
    },
    Field("all", ListType(myObjectType),
    resolve = ctx => Future { ctx.ctx.findAll })
    )
    )
    }
    OVMMBCMF͸0QUJPOͰදݱ
    17

    View Slide

  18. งғؾ
    case class MyObject(id: Long, name: String)
    val myObjectType: ObjectType[Unit, MyObject] = derive.deriveObjectType()
    val myQuery: ObjectType[MyObjectRepository, Unit] = {
    ObjectType.apply(
    "MyQuery",
    fields[MyObjectRepository, Unit](
    { val idArg = Argument("id", LongType)
    Field(
    "findById",
    OptionType(myObjectType),
    arguments = idArg :: Nil,
    resolve = ctx => ctx.ctx.findById(ctx.arg(idArg)))
    },
    Field("all", ListType(myObjectType),
    resolve = ctx => Future { ctx.ctx.findAll })
    )
    )
    }
    ඇಉظॲཧ 'VUVSF
    ͕؆୯
    18

    View Slide

  19. 4DBMBͰ(SBQI2-͢Δ
    w 4BOHSJB͸ػೳ͕े෼ʹଗ͍ͬͯΔ
    w ඇಉظॲཧ
    w ϚΫϩʹΑΔUZQFͷࣗಈಋग़
    w +40/ͱͷ૬ޓม׵
    w DBTFDMBTTͱ(SBQI2-Λ+40/͕ܨ͙
    w /໰୊ղܾ
    w 'FUDIFS%FGFSSFE3FTPMWFS
    w 3FMBZαϙʔτ
    w TBOHSJBHSBQIRMTBOHSJBSFMBZ
    19

    View Slide

  20. (SBQI2-Λ4DBMBͰ
    ΍ͬͯΈͯͲ͏͔
    20

    View Slide

  21. (SBQI2-Λ࢖ͬͯΈͯͲ͏͔
    w ײ૝ͱͯ͠ɺ(SBQI2-ʹͯ͠ྑ͔ͬͨ
    w ͍ΖΜͳ͜ͱ͔Βղ์͞Εͨ
    w ʮͱΓ͋͑ͣશ෦ฦ͔͢Β͋ͱΑΖ͘͠ʯͷָ͞
    w ؔ࿈ΦϒδΣΫτ͸SFTPMWFͰؤு࣮ͬͯ૷
    w ͿͬͪΌ͚Ͳ͏࢖ͬͯΔ͔Α͘஌Βͳ͍
    w 4DBMBͱ(SBQI2-ܕ࢓༷ͷ૬ੑͷྑ͞
    w ૉ௚ʹදݱͰ͖Δ҆͠શʹָʹ։ൃͰ͖Δ
    w OPOOVMMΛίϯύΠϥͰڧ੍Ͱ͖Δ
    21

    View Slide

  22. ͠ΜͲ͍͜ͱɺ೰ΜͰ͍Δ͜ͱ
    w (SBQI2-ͷֶशίετ͸ͦΕͳΓʹ͔͔Δ
    w εΩʔϚͷ࡞Γํʹ೰Ή
    w ϨΠϠʔυΞʔΩςΫνϟͰͷཱͪҐஔ
    w ೝূ͕Ξμϓλ૚Ͱ΍Β͟ΔΛಘͳ͍
    w &OVNΛυϝΠϯ૚ͱڞ༗͢Δ΂͖͔
    22

    View Slide

  23. ·ͱΊ
    23

    View Slide

  24. (SBQI2-PO4DBMB
    w 4DBMBͰ(SBQI2-ɺे෼΍ΕΔ
    w TBOHSJBHSBQIRMTBOHSJBͷ͓͔͛
    w (SBQI2-ͷ࢓༷ΛͪΌΜͱຬͨͤΔ
    w (SBQI2-΍ͬͯΈͯΑ͔ͬͨ
    w ࣍ʹԿ͔࡞Δͱͯ͠΋࠾༻͍ͨ͠
    w ֶशίετ͸͔͔ΔͷͰνʔϜʹΑΔ
    24

    View Slide

  25. 5IBOLZPV
    25

    View Slide