go-cloudとWireを利用したDI / go-cloud-and-dependency-injection-by-wire

go-cloudとWireを利用したDI / go-cloud-and-dependency-injection-by-wire

Go(Un)Conference(Goあんこ)LT大会 4kgの発表資料です。
https://gounconference.connpass.com/event/99487/

go-cloudの雑感とwireコマンドについてまとめました。

口頭で説明する内容や、文中のリンクは以下のブログで補足します。
https://budougumi0617.github.io/2018/10/19/presentation-gounco-lt4/

Eb6be531bcfaa99714d8d3b48665a5a9?s=128

Yoichiro Shimizu

October 19, 2018
Tweet

Transcript

  1. go-cloudとWireを利用したDI (P 6O $POGFSFODFʢ(P͋Μ͜ʣ-5େձLH :PJDIJSP4IJNJ[V!CVEPVHVNJ

  2. 自己紹介 ‣ ਗ਼ਫཅҰ࿠!CVEPVHVNJ ‣  ‣ #BDLFOE%FTLUPQ"QQFOHJOFFS ‣ (P3VCZPO3BJMT3FBDU ‣

    ϒϩάIUUQCVEPVHVNJHJUIVCJP ‣ ίϛϡχςΟ׆ಈHPMBOHUPLZP
  3. 今日のゴール ‣ HPDMPVEͷ֓ཁΛ஌Δ ‣ 8JSFͷ֓ཁΛ஌Δ ‣ XJSFίϚϯυΛ࢖ͬͨ%FQFOEFODZ*OKFDUJPO %* ͷ΍Γํ͕Θ͔Δ

  4. アジェンダ ‣ HPPHMFHPDMPVEʹ͍ͭͯ ‣ 8JSFʹ͍ͭͯ ‣ 8JSFίϚϯυΛ࢖ͬͨ%* ‣ ·ͱΊ

  5. マルチクラウドへの課題 ‣ ίϯςφʂ,VCFSOFUFTʂ ‣ ϙʔλϏϦςΟੑͷ޲্ ‣ ͱ͸ݴ͑ɺதͷΞϓϦέʔγϣϯϩδοΫ͸1BB4ʹ༊ண͍ͯ͠Δ ‣ 1BB4ఏڙαʔϏεΛར༻͠ͳ͍ͷ͸΄΅͋Γ͑ͳ͍ʢʁʣ ‣

    ࠓ೔΋΅͘ΒͷΞϓϦ͸1BB44%,ͷ"1*ʹґଘ͍ͯ͠Δ
  6. SDKに依存した実装 ྨࣅαʔϏεʹର͢Δಉ͡ૢ࡞Ͱ΋࣮૷͸͍ͩͿҟͳΔ

  7. go-cloudとは ‣ IUUQTHJUIVCDPNHPPHMFHPDMPVE ‣ ʹൃද ‣ IUUQTCMPHHPMBOHPSHHPDMPVE ‣ ϚϧνΫϥ΢υͳ։ൃΛߦ͏ͨΊͷ(PͷϥΠϒϥϦ ‣

    Ϋϥ΢υαʔϏεͷδΣωϦοΫͳ"1*Λఆٛ ‣ ݱࡏW BMQIBSFMFBTF
  8. go-cloudの概要 ‣ HPDMPVE͕αϙʔτ͍ͯ͠Δ1BB4 ‣ (PPHMF$MPVE1MBUGPSN ‣ "NB[PO8FC4FSWJDF ‣ HPDMPVE͕ఏڙ͍ͯ͠ΔΫϥ΢υαʔϏε ‣

    #-0#HPDMPVECMPC ‣ .Z42-EBUBCBTFTRM ‣ 0UIFS4UBDLESJWFS΍ϥϯλΠϜFUD
  9. 正直まだ「揃ってない」感はある

  10. まだ使えない?

  11. google/go-cloud/wire

  12. Wireの前に少し確認

  13. Dependency Injection(DI) ‣ ґଘੑͷ஫ೖ ‣ ίϯϙʔωϯτؒͷґଘؔ܎Λίʔυ͔Βഉআ͠ɺ֎෦ͷઃఆ ϑΝΠϧͳͲͰ஫ೖͰ͖ΔΑ͏ʹ͢Δ ‣ (Pʹ͸ϦονͰσϑΝΫτͳ%*πʔϧ͸ͳ͍ʢͱࢥ͍ͬͯΔʣ ‣

    ۪௚ʹίϯετϥΫλʔΠϯδΣΫγϣϯͳͲߦ͏
  14. 例:リポジトリパターンでDI ‣ BVUI5PLFO FSSSETVUJMT#VJME"VUI5PLFO ʜ EOT4USʜ ‣ DPOO FSSTRM0QFO lNZTRMz

    EOT4US  ‣ DS$PNQBOZ3FQPTJUPSZ DPOO  ‣ DTDBTF/FX$PNQBOZ6TFDBTF BS
  15. オレたちのDIはまだまだ続くぜ…

  16. しんどい

  17. WireでDIをすっきりさせる

  18. Wireとは ‣ HPDMPVEʹؚ·Ε͍ͯΔίϚϯυϥΠϯπʔϧͱ࣮૷༻"1* ‣ HPDMPVE͸8JSFΛ࢖ͬͯ%*͕ग़དྷΔΑ͏ʹ࣮૷͞Ε͍ͯΔ ‣ 8JSFΛ࢖͏͜ͱͰಘΒΕΔϝϦοτ ‣ ґଘؔ܎Λૄʹ͢ΔίʔυΛڧ੍Ͱ͖Δ ‣

    ෳࡶͳґଘؔ܎΋8JSF͕%*ίʔυΛࣗಈੜ੒ͯ͘͠ΕΔ ‣ ґଘؔ܎Λ૊Έ߹Θͤͯ৽͍͠ґଘؔ܎΋ఆٛͰ͖Δ
  19. Wireを使ったDIの流れ ‣ 1SPWJEFSͱ͍͏֓೦ʹैͬͯґଘؔ܎Λఆ͓ٛͯ͘͠ ‣ *OKFDUPSͱ͍͏֓೦ʹैͬͯ%*Λߦ͏૊Έ߹ΘͤΛఆٛ͢Δ ‣ XJSFHFOίϚϯυΛ࢖ͬͯ%*ίʔυΛࣗಈੜ੒͢Δ

  20. ProviderとInjector ‣ 8JSFʹ͸1SPWJEFSͱ*OKFDUPSͱ͍͏ͭͷ֓೦͕͋Δ ‣ 1SPWJEFS ‣ ґଘؔ܎ͷղܾ͕ඞཁͳίϯϙʔωϯτͷू߹ ‣ *OKFDUPS ‣

    1SPWJEFSΛ૊߹ΘͤͯґଘੑΛղܾ͢Δ ‣ ࣮ࡍʹ%*͢Δίʔυ͸ࣗಈੜ੒͢Δ
  21. Provider XJSF/FX4FUΛ࢖ͬͯґଘؔ܎Λఆٛ 1SPWJEFSΛجʹผͷ1SPWJEFSΛఆٛ͢Δ͜ͱ΋Ͱ͖Δ

  22. Injector XJSF#VJME࢖ͬͯఆٛ ྫ$POUFYUɺDMJ'MBHTͱ͍͏Ҿ਺ͱ1SPWJEFSΛ࢖ͬͯ BQQMJDBUJPO F Λੜ੒͢Δ

  23. Injector XJSFHFOίϚϯυΛ࢖ͬͯ*OKFDUPS͔Βࣗಈੜ੒ ʢXJSFΛ࢖Θͣʹ͔Β%*Λ͢Δͱ͜͏ͳΔʣ

  24. Injector XJSFHFOίϚϯυΛ࢖ͬͯࣗಈੜ੒ͨ͠ίʔυ FSSPS࣌ͷDMFBOVQॲཧͳͲ΋ࣗಈੜ੒ͯ͘͠ΕΔ

  25. wireを使ったDIの流れ

  26. *sql.DB(Cloud SQL)のDI

  27. wire showでProviderを確認する XJSFTIPXίϚϯυͰࢦఆͨ͠ύοέʔδͷ1SPWJEFS৘ใΛऔಘͰ͖Δ

  28. 不足分は自分で定義する DMPVETRM1BSBNTΛੜ੒͢Δؔ਺Λఆ͓ٛͯ͘͠

  29. Injectorを定義する Ϗϧυλά෇͖ͷϑΝΠϧͰ*OKFDUPSΛఆٛ͢Δ ଍Γͳ͍DPOUFYU$POUFYUͱ DMJ'MBHT લ1ͷࣗ࡞ؔ਺ͷҾ਺ ΛҾ਺Ͱ༻ҙ͢Δ

  30. wire gen

  31. 自動生成されたコード

  32. 今日のゴール ‣ HPDMPVEͷ֓ཁΛ஌Δ ‣ 8JSFͷ֓ཁΛ஌Δ ‣ XJSFίϚϯυΛ࢖ͬͨ%FQFOEFODZ*OKFDUJPO %* ͷ΍Γํ͕Θ͔Δ

  33. まとめ ‣ HPDMPVE͸΋ͬͱ"1*ఆٛ ͱαϙʔτ1BB4 ͕૿͑ͯ΄͍͠ ‣ XJSFΛ࢖͏ͱ%*ίʔυ͕؆୯ʹࣗಈੜ੒Ͱ͖ΔΑ͏ʹͳΔ ‣ XJSFίϚϯυ͸HPDMPVEҎ֎Ͱ΋࢖͑ΔͷͰࣗ࡞QLHͰ΋%*Ͱ͖Δ