新規サービスのWebAPI開発でスキーマ駆動開発を目指してみた話

 新規サービスのWebAPI開発でスキーマ駆動開発を目指してみた話

スキーマ駆動開発の取り組み事例を紹介します。
@shibadog39

41a66760b3483d518d9e48a7da37f91b?s=128

shibadog1121

August 28, 2019
Tweet

Transcript

  1. ৽نαʔϏεͷ8FC"1*։ൃͰ εΩʔϚۦಈ։ൃΛ໨ࢦͯ͠Έͨ࿩ !TIJCBEPH ᓎҪوԝ

  2. ࣗݾ঺հ ᓎҪوԝ !TIJCBEPH ɾ೥݄೔͔ΒϝυϐΞࣾһ ɾ৽نࣄۀΛ୲౰͢ΔνʔϜͷΤϯδχΞ ɾ3BJMT7VFKT ɾ͸͡Ίͯͷ-5ొஃ

  3. αʔϏε঺հ ʮLBLBSJʯ ױऀ͞ΜͷϦϐʔλʔԽΛ໨ࢦ͢ௐࡎༀہΛࢧԉ

  4. LBLBSJͷఏڙՁ஋ ɾνϟοτ૬ஊ ɾ͓஌ΒͤҰ੪ૹ৴ FUD ɾॲํͤΜૹ৴ ɾళ಄νΣοΫΠϯ ɾࣄલ໰਍

  5. େ͖ͳస׵ͷ࣌ظΛܴ͍͑ͯΔௐࡎༀہۀք ױऀ͞Μͷༀہ બఆཧ༝ ڝ૪ཁҼ ໳લༀہ පӃͷۙ͘Ͱศར ཱ஍͕த৺ ͳ͡ΈͷༀہͰ҆৺ ༀہػೳༀࡎࢣͷ࣭ࡏݿྔ FUD

    ͔͔Γ͚ͭༀہ පӃ ॲํͤΜ ༀہ ༀہ ॲํͤΜ පӃ ॲํͤΜͷԠधͷେ൒͕ ໨ͷલͷපӃɾΫϦχοΫ ༷ʑͳҩྍػ͔ؔΒ ॲํͤΜΛԠध͢Δༀہ ͜Ε·Ͱ ͜Ε͔Β
  6. ༀہۀքͷಈ͖Λݟӽͯ͠ͲΜͲΜػೳ։ൃத

  7. ༀہ༻8FCը໘ ױऀ༻ϞόΠϧΞϓϦ

  8. LBLBSJͷ։ൃମ੍ 8FCϑϩϯτΤϯδχΞ ϞόΠϧΞϓϦΤϯδχΞ αʔόʔαΠυΤϯδχΞ º º º

  9. 8F`SFIJSJOH

  10. ͍ͭͰʹ

  11. ༀہܦӦऀͷํ΋୳͍ͯ͠·͢

  12. ΞδΣϯμ  εΩʔϚۦಈΛ໨ࢦ͢ཧ༝  0QFO"1*ͱ͸  ͳʹ͕Ͱ͖Δͷ͔  LBLBSJͷ"1*։ൃ 

    ·ͱΊ
  13. εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝

  14. 8FC"1*։ൃ͸೉͍͠ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝

  15. 8FC"1*։ൃγʔϯ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝ υΩϡϝϯτͷϝϯς͞Εͯͳͯͭ͘Β͍ͷਤ よっしゃ開発するぜ ΫϥΠΞϯταΠυͪΌΜ 定義通りに実装したのに 動かん αʔόʔαΠυ͘Μ 資料更新するの忘れてた

  16. 8FC"1*։ൃγʔϯ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝ ɾυΩϡϝϯτ௨ΓͷϨεϙϯεΛظ଴࣮ͯ͠૷ͨ͠ͷʹಈ͔ͳ͍ ɾυΩϡϝϯτ͡Όͳͯ͘ɺ࣮૷ݟͯͱ͔ݴΘΕΔ ɾͱ͸͍͑υΩϡϝϯτΛϝϯς͢Δͷ໘౗͍͘͞

  17. 8FC"1*։ൃγʔϯ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝ ΫϥΠΞϯταΠυ։ൃελʔτͰ͖ͳͯ͘ਏ͍ͷਤ αʔόʔαΠυ͘Μ よっしゃAPI開発するぜ やばい 思ったより時間かかりそう ΫϥΠΞϯταΠυͪΌΜ テトリスして待ってるわ

  18. 8FC"1*։ൃγʔϯ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝ ɾαʔόʔαΠυͷ࣮૷͕ऴΘΔ·ͰΫϥΠΞϯταΠυ͸଴ػ ɾΫϥΠΞϯταΠυ͔Βͷ'#͕஗͘ͳΔͷͰख໭Γίετ͕େ ɾؤு࣮ͬͯ૷ͨ͠෦෼͕࣮͸ෆཁͩͬͨΈ͍ͨͳ͜ͱ͕ى͖ͯ൵͍͠

  19. 8FC"1*։ൃͷେ໰୊ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝  υΩϡϝϯτͱ࣮૷͕ဃ཭  ฒྻͰ։ൃΛਐΊΒΕͣɺ։ൃޮ཰্͕͕Βͳ͍

  20. 8FC"1*։ൃͭΒ͍ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝

  21. ͦΜͳ͋ͳͨʹ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝ εΩʔϚۦಈ։ൃ

  22. εΩʔϚۦಈ։ൃͱ͸ ɾ޾ͤʹ"1*։ൃΛߦ͍ͬͯ͘͜ͱΛ໨ࢦͨ͠։ൃख๏ ɾ"1*هड़ݴޠ˞Λ༻͍ͯεΩʔϚ ʹ"1*ఆٛ Λදݱ ɾεΩʔϚ͔ΒυΩϡϝϯτɾίʔυΛγεςϚςΟοΫʹࣗಈੜ੒ ˞0QFO"1*"1*#MVF1SJOU3".-౳͕͋Δ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝

  23. εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝ ਐΊํͷΠϝʔδ ΫϥΠΞϯταΠυ αʔόʔαΠυ "1*ఆٛΛ ҰॹʹܾΊΔ ϞοΫͷఏڙ ࣮૷ ࣮૷ ݁߹ςετ

    ϦϦʔε ૣ͍λΠϛϯάͰ ૬ޓ'#
  24. ΍ͬͯΈ͍ͨ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝

  25. 0QFO"1*ͱ͸ ͳͥ࢖͏ͷ͔

  26. 0QFO"1*ͱ͸ ɾ8FC"1*ͷεΩʔϚΛهड़͢ΔͨΊͷϑΥʔϚοτ KTPOZBNMܗࣜ ɾ0QFO"1**OJUJBUJWFͱ͍͏ஂମ (PPHMF.JDSPTPGU*#.౳͕ࢀՃ ͕ਪ ਐ͍ͯ͠Δ ɾ΋ͱ΋ͱ͸ʮ4XBHHFSʯ˞ ೥ʹ0QFO"1*΁ϦωʔϜ͞Εͨ 0QFO"1*ͱ͸

    ͳͥ࢖͏ͷ͔ ˞͜ͷ໊࢒Ͱ0QFO"1*ͷपลπʔϧͷ໊લʹ4XBHHFS͕࢒͍ͬͯͨΓ͢Δ IUUQTXXXPQFOBQJTPSH
  27. 0QFO"1*ͱ͸ ͳͥ࢖͏ͷ͔ IUUQTHJUIVCDPN0"*0QFO"1*4QFDJGJDBUJPOCMPCNBTUFSFYBNQMFTWQFUTUPSFZBNM ΤϯυϙΠϯτͷύ ε )551ϝιου ظ଴͞ΕΔϨεϙϯε ϦΫΤετύϥϝʔλʔ

  28. पลπʔϧ͕ڧྗ εΩʔϚͷڞ༗ɾ֬ೝָ͕ʹͰ͖Δ 0QFO"1*ͱ͸ ͳͥ࢖͏ͷ͔ ˠεΩʔϚۦಈ։ൃʹॏཁͳཁૉ͕ଗ͍ͬͯΔ εΩʔϚ͔ΒίʔυΛࣗಈੜ੒ εΩʔϚͷฤूָ͕ʹͰ͖Δ IUUQTHJUIVCDPN0QFO"1*5PPMT PQFOBQJHFOFSBUPS IUUQTFEJUPSTXBHHFSJP

    IUUQTTXBHHFSJPUPPMTTXBHHFSVJ
  29. ΫϥΠΞϯταΠυ αʔόʔαΠυ "1*ఆٛΛ ҰॹʹܾΊΔ ϞοΫͷఏڙ ࣮૷ ࣮૷ ݁߹ςετ ϦϦʔε 0QFO"1*ͱ͸

    ͳͥ࢖͏ͷ͔ εΩʔϚͷڞ༗ɾ֬ೝָ͕ʹͰ͖Δ εΩʔϚ͔ΒίʔυΛࣗಈੜ੒ εΩʔϚͷฤूָ͕ʹͰ͖Δ
  30. ࢖ͬͯΈ͍ͨ εΩʔϚۦಈ։ൃΛ໨ࢦ͢ཧ༝

  31. LBLBSJͷ"1*։ൃ

  32. 8FC"1*։ൃͷେ໰୊  υΩϡϝϯτͱ࣮૷͕ဃ཭  ฒྻͰ։ൃΛਐΊΒΕͣɺ։ൃޮ཰্͕͕Βͳ͍ LBLBSJͷ"1*։ൃ

  33. 8FC"1*։ൃͷେ໰୊  υΩϡϝϯτͱ࣮૷͕ဃ཭  ฒྻͰ։ൃΛਐΊΒΕͣɺ։ൃޮ཰্͕͕Βͳ͍ LBLBSJͷ"1*։ൃ

  34. υΩϡϝϯτͱ࣮૷ͷဃ཭Λ๷͙ LBLBSJͷ"1*։ൃ ࡞ઓ"1*ϦΫΤετΛεΩʔϚ௨Γʹ͢Δ εΩʔϚ͔ΒΫϥΠΞϯτϥΠϒϥϦΛࣗಈੜ੒ ࡞ઓ"1*ϨεϙϯεΛεΩʔϚ௨Γʹ͢Δ εΩʔϚ௨Γͷܗࣜʹͳ͍ͬͯΔ͔ࣗಈςετͰνΣοΫ

  35. υΩϡϝϯτͱ࣮૷ͷဃ཭Λ๷͙ ϦΫΤετฤ LBLBSJͷ"1*։ൃ ΫϥΠΞϯτϥΠϒϥϦΛ0QFO"1*(FOFSBUPSͰࣗಈੜ੒ ࣗಈੜ੒ͷ࢓૊Έ͸$*ʹऔΓࠐΜͰ͍Δ ˠεΩʔϚͷߋ৽ʹࣗಈͰ௥ਵ ίʔυ͚ͩͰ͸ͳ͘ɺϝιουͷҰཡ౳ ͷυΩϡϝϯτ΋Ұॹʹࣗಈੜ੒͞ΕΔ

  36. LBLBSJͷ"1*։ൃ ΫϥΠΞϯταΠυ͸ ࣗಈੜ੒͞ΕͨϥΠϒϥϦͷϝιουΛୟ͚ͩ͘

  37. LBLBSJͷ"1*։ൃ υΩϡϝϯτͱ࣮૷ͷဃ཭Λ๷͙ Ϩεϙϯεฤ ɾʮDPNNJUUFFʯͱ͍͏HFNΛಋೖ https://github.com/interagent/committee ɾ"1*ϦΫΤετɾϨεϙϯε͕εΩʔϚ௨Γ͔νΣοΫͰ͖Δ ɾϨεϙϯεͷςετͰBTTFSU@TDIFNB@DPOGPSNΛݺͿ͚ͩͰ͍͍

  38. ɾܕνΣοΫ ɾSFRVJSFE υΩϡϝϯτͱ࣮૷ͷဃ཭Λ๷͙ Ϩεϙϯεฤ LBLBSJͷ"1*։ൃ

  39. ɾOVMMBCMF ɾFOVN υΩϡϝϯτͱ࣮૷ͷဃ཭Λ๷͙ Ϩεϙϯεฤ LBLBSJͷ"1*։ൃ

  40. ɾBEEJUJPOBM1SPQFSUJFT εΩʔϚʹఆٛ͞Ε͍ͯͳ͍QSPQFSUZ ͕Ϩεϙϯεʹؚ·Ε͍ͯͳ͍͔Ͳ͏ ͔νΣοΫͰ͖Δ υΩϡϝϯτͱ࣮૷ͷဃ཭Λ๷͙ Ϩεϙϯεฤ LBLBSJͷ"1*։ൃ

  41. 8FC"1*։ൃͷେ໰୊  υΩϡϝϯτͱ࣮૷͕ဃ཭  ฒྻͰ։ൃΛਐΊΒΕͣɺ։ൃޮ཰্͕͕Βͳ͍ LBLBSJͷ"1*։ൃ

  42. ΫϥΠΞϯταΠυ αʔόʔαΠυ "1*ఆٛΛ ҰॹʹܾΊΔ ϞοΫͷఏڙ ࣮૷ ࣮૷ ݁߹ςετ ϦϦʔε ૣ͍λΠϛϯάͰ

    ૬ޓ'# ฒྻͰ։ൃΛਐΊͯޮ཰Λ্͛Δ LBLBSJͷ"1*։ൃ ͜ͷ෦෼ΛͲ͏΍ͬͯਐΊΔ͔
  43. ฒྻͰ։ൃΛਐΊͯޮ཰Λ্͛Δ LBLBSJͷ"1*։ൃ ࡞ઓϞοΫΛૉૣ͘ఏڙ͢Δ 4XBHHFS6*ͷFYBNQMFΛར༻͢Δ ࡞ઓ"1*ఆٛͷڞ༗Λ؆୯ʹ TXBHHFSWJFXFSͱ͍͏$ISPNF֦ுΛར༻͢Δ

  44. ϞοΫΛૉૣ͘ఏڙ͢Δ LBLBSJͷ"1*։ൃ ࣗಈੜ੒͞ΕΔFYBNQMFΛجʹ଎߈ͰϞοΫͷ࣮૷͕Ͱ͖Δ ίϐϖ͚ͨͩ͠ͰϞοΫͷ࣮૷͕׬ྃ 4XBHHFS6*Ͱࣗಈੜ੒͞Εͨ FYBNQMF

  45. LBLBSJͷ"1*։ൃ ɾ޻਺Λ͔͚ͣʹϞοΫΛఏڙ˞ ɾૣ͍λΠϛϯάͰΫϥΠΞϯταΠυ͔Βͷ'#͕ಘΒΕΔͷͰ मਖ਼ίετ͕௿͍ ˞0QFO"1*(FOFSBUPSΛ༻͍ͯϞοΫαʔόʔΛఏڙ͢Δํ๏΋͋ΔͷͰ͕͢ɺϞοΫ༻ͷίϯςφ্ཱͪ͛ ΔΑ͏ʹͨ͠ΓΫϥΠΞϯταΠυͷ޲͚ઌΛม͑ͨΓͱ໘౗ͦ͏͔ͳͱࢥ͍ͬͯ·͢ɻ஌ݟٻΉʂ ϞοΫΛૉૣ͘ఏڙ͢Δ

  46. ΫϥΠΞϯταΠυ αʔόʔαΠυ "1*ఆٛΛ ҰॹʹܾΊΔ ϞοΫͷఏڙ ࣮૷ ࣮૷ ݁߹ςετ ϦϦʔε εΩʔϚͷڞ༗ɾ֬ೝָ͕ʹͰ͖Δ

    LBLBSJͷ"1*։ൃ "1*ఆٛͷڞ༗
  47. LBLBSJͷ"1*։ൃ 4XBHHFS6*͸ศར 公式のライブデモ: https://petstore.swagger.io/?_ga=2.240324099.1201964793.1566722432-82597943.1560763776#/ ͨͩɺTXBHHFSVJͷίϯςφΛ্ཱͪ͛Δඞཁ͕͋Δ "1*ఆٛͷڞ༗

  48. LBLBSJͷ"1*։ൃ "1*ఆٛͷڞ༗ HJUIVC্ͷεΩʔϚΛ4XBHHFS6*ͷܗࣜͰ֬ೝͰ͖Δ✌

  49. LBLBSJͷ"1*։ൃ σϞ ެࣜͷεΩʔϚFYBNQMFIUUQTHJUIVCDPN0"*0QFO"1* 4QFDJGJDBUJPOCMPCNBTUFSFYBNQMFTWQFUTUPSFZBNM

  50. LBLBSJͷ8FC"1*։ൃ LBLBSJͷ"1*։ൃ 8FCϑϩϯτ 41"ը໘ "1* 0QFO"1*ܥಋೖࡁΈ 4XBHHFS6*&EJUPSར༻ ࣗಈςετͰϨεϙϯεͷόϦσʔγ ϣϯ࣮ࢪ 0QFO"1*(FOFSBUPSͰΫϥΠΞϯτ

    ϥΠϒϥϦࣗಈੜ੒ ϞόΠϧΞϓϦ"1* 0QFO"1*ܥಋೖࡁΈ 4XBHHFS6*&EJUPSར༻ ࣗಈςετͰϨεϙϯεͷόϦσʔγ ϣϯ࣮ࢪ
  51. ·ͱΊ

  52. ɾυΩϡϝϯτΛϝϯς͢ΔͷͭΒ͍ͱ͍͏ؾ͔࣋ͪΒͷղ์ ɾυΩϡϝϯτ͕ஔ͍͚ͯ΅ΓʹͳΔڪා͔Βͷղ์ ɾϑϩϯτΤϯδχΞ଴ͨͤΔͷ೜ͼͳ͍ͱ͍͏ؾ͔࣋ͪΒͷղ์ ·ͱΊ εΩʔϚۦಈ͸๻ͨͪΛղ์ͯ͘͠ΕΔ

  53. ɾपลπʔϧ͕ͱͯ΋ॆ࣮͍ͯ͠Δ ɾࣗ෼ͨͪͷ։ൃϑϩʔʹ͍͔ʹ૊ΈࠐΉͷ͔͸޻෉ͷ͠Ͳ͜Ζ ɾͰ͖Δͱ͜Ζ͔Βগͣͭ͠ಋೖ͢Δ͜ͱ͕Ͱ͖Δ ·ͱΊ 0QFO"1*͸ڧ͍

  54. None