Slide 1

Slide 1 text

Microservices
 Maturity Model
 on Rails ৿ ٱଠ࿠ (@qsona) גࣜձࣾFiNC 2018/03/24 Rails Developers Meetup 2018: Day1

Slide 2

Slide 2 text

λΠϜςʔϒϧ

Slide 3

Slide 3 text

΋͔ͯ͠͠: ઓ૪

Slide 4

Slide 4 text

ࠓ೔࿩͞ͳ͍͜ͱ • גࣜձࣾFiNCʹ͍ͭͯ • We are hiring

Slide 5

Slide 5 text

whoami • @qsona • גࣜձࣾFiNC • Microservices Meetup Λओ࠵͠ ͍ͯ·͢ • Railsྺ3೥໨ʹಥೖ • ϚΠΫϩαʔϏεͱ͍͏બ୒͸ج ຊతʹ͸࠷ߴͱ͍͏ελϯε

Slide 6

Slide 6 text

એ఻ • ٕज़ॻయ4 ʹࢀՃ͠·͢! • 2018/04/22 (೔)

Slide 7

Slide 7 text

͸͡Ίʹ

Slide 8

Slide 8 text

ϚΠΫϩαʔϏεͱ͸ "ϚΠΫϩαʔϏε͸ɺ
 ڠௐͯ͠ಈ࡞ ͢Δɺ
 খن໛Ͱࣗ཯త ͳαʔϏε Ͱ͢ɻ"

Slide 9

Slide 9 text

ϚΠΫϩαʔϏεͷओ໨త "ϚΠΫϩαʔϏεͷ࠷େͷ໨ඪ͸
 ʮαʔϏεԽ͞ΕͨػೳͷϦϦʔεαΠΫϧΛɺͦͷػೳΛ ؅ཧ͢ΔνʔϜ͕ಠࣗʹܾఆͰ͖ΔΑ͏ʹ͢Δʯ͜ͱͰ ͢ɻ ͦΕ͸ԿͷͨΊ͔ͱ͍͏ͱ
 ʮػೳΛͲΜͲΜվળͯ͠Ṷ͚͍ͨʯ͔ΒͰ͢ɻ" - ࣄۀձࣾʹ͓͚ΔϚΠΫϩαʔϏεԽʹ͍ͭͯ - arclamp
 http://arclamp.hatenablog.com/entry/2017/09/08/152005

Slide 10

Slide 10 text

෭໨త(RailsͱϚΠΫϩαʔϏε) • [ҙݟ] Railsʹ͓͍ͯɺϚΠΫϩαʔϏεԽ͸ૣ͍ํ͕͍͍ • খʙதن໛ͷ։ൃʹɺRails͸ҖྗΛൃش͢Δ • େن໛։ൃʹ͸޲͍͍ͯͳ͍෦෼͕͋Δ • ಈతܕ෇͚Ͱ͋Δ • ϨΠϠʔ͕গͳ͍ • DIͷΑ͏ͳػೳ͕ͳ͍ • େن໛ʹͳΔ·͑ʹɺ੾Γग़͍ͯ͜͠͏

Slide 11

Slide 11 text

ϚΠΫϩαʔϏε͸೉͍͠ʁ • શ෦΍Ζ͏ͱ͢Δͱ೉͍͠ • ͍͖ͳΓ׬ᘳΛ໨ࢦ͢ͷ͸ແཧ • ͦΕͧΕͷϑΣʔζͰ΍Δ΂͖͜ͱΛཧղ͠ ͍ͯΕ͹ɺͦ͜·Ͱ೉͘͠ͳ͍ͷͰ͸ʁ

Slide 12

Slide 12 text

ຊηογϣϯͷ໨త • ϚΠΫϩαʔϏεΛਐΊ্͍ͯ͘Ͱɺ
 ͦΕͧΕͷϑΣʔζʹ͓͍ͯԿΛ͢Δ΂͖ͳ ͷ͔ʁ
 Λཧղ͢Δख͕͔ΓʹͳΔ͜ͱ

Slide 13

Slide 13 text

Maturity Modelͱ͸ • ੒ख़౓ΛϨϕϧผʹఆٛ ͢Δ • ݱࡏͷঢ়ଶΛධՁ͢Δ
 ΋ͷ͞͠ • ʮ࣍ʹԿΛվળ͢΂͖ ͔ʯΛཧղ͢Δख͕͔Γ MaturityModel - 
 Martin Fowler
 https://martinfowler.com/bliki/MaturityModel.html

Slide 14

Slide 14 text

ϚΠΫϩαʔϏε੒ख़ ౓ϨϕϧΛఆٛͯ͠Έ Δ

Slide 15

Slide 15 text

Lv.0 • ϚΠΫϩαʔϏεΛ࢝ΊΔͷ͸࣌ظঘૣɻ

Slide 16

Slide 16 text

Lv.1 • ϞϊϦγοΫRailsΛޮ཰తʹ։ൃͰ͖͍ͯ Δɻ • ϚΠΫϩαʔϏεΛ࢝ΊΔͨΊͷ૊৫తͳ౔ ৕͕͋Δɻ

Slide 17

Slide 17 text

Lv.2 • ϚΠΫϩαʔϏεΛ࢝Ί͍ͯΔɻ3ݸ͘Β͍ɻ • ͦͷ૊৫ͷϏδωευϝΠϯΛཧղ͠ɺద੾ʹ αʔϏε෼ׂͰ͖͍ͯΔɻ • ෼ׂ͞ΕͨαʔϏεͷυϝΠϯΛத৺ʹɺڠྗ Ͱ͖ΔνʔϜ·ͨ͸άϧʔϓ͕͋Δɻ • ݖݶͱ੹೚ͷҕৡ͕ਐΊΒΕ͍ͯΔɻ

Slide 18

Slide 18 text

Lv.3 • ϚΠΫϩαʔϏεΛ૿΍͍ͯ͠Δɻ15ݸ͘Β͍ɻ • ༷ʑͳํ๏ͰαʔϏεΛ࿈ܞ͍ͯ͠Δɻ • αʔϏεڞ௨ͷؔ৺ࣄʹରॲ͍ͯ͠Δɻ • νʔϜͷ෼ׂΛਐΊ͍ͯΔɻ • ༷ʑͳࣗಈԽΛਐΊ͍ͯΔɻ

Slide 19

Slide 19 text

Lv.4 • ϏδωεʹԠͯ͡ɺ૊৫ͱٕज़͕ࣗવʹεέʔϧ͢Δɻ • ϚΠΫϩαʔϏεͷճ෮ੑ(ϨδϦΤϯε)Λ࡞Ε͍ͯΔɻ • αʔϏεো֐͕࿈࠯͠ͳ͍ঢ়ଶ • ݁Ռͱͯ͠ɺશମͷো֐΁ͷ଱ٱྗ͕ߴ͍ • ϚΠΫϩαʔϏε༝དྷͷෳࡶ͞ʹରॲͰ͖͍ͯΔɻ • αʔϏε͸ͨ͘͞Μ͋Δɻ40ݸͱ͔ɻ

Slide 20

Slide 20 text

Lv.5 • ΊͬͪΌ͍͢͝ɻͲΜͲΜεέʔϧ͢Δɻ࠷ ߴʂʂʂʂ • ∞ݸ

Slide 21

Slide 21 text

ݸਓతͳ՝୊ײ • ᷿ʹ͸Lv.4΍Lv.5ͷ࿩͕͋;Ε͍ͯΔ • ΋ͪΖΜࢀߟʹͳΔ͠ɺͦΕΛ໨ࢦ͍ͨ͠ • ͔͠͠ɺ͙͢ʹ࣮ફͰ͖ΔΘ͚Ͱ͸ͳ͍ • جຊతʹࠓճ͸Lv.3·Ͱͷ࿩Λ͠·͢

Slide 22

Slide 22 text

͜ͷޙͷষߏ੒ • 1.upto(3) do |n| • Lv.n ͷఆٛ (࠶ܝ) • Lv.n-1 => Lv.n ʹਐΉͨΊʹ΍Δ͜ͱ (ٕज़࣠/૊৫࣠) • ͜ͷϑΣʔζͰ࣮ࡍʹ͋ͬͨྫ • ͜ͷϑΣʔζʹ͓͢͢Ίͷࢀߟจݙ • end

Slide 23

Slide 23 text

Lv.0 => Lv.1

Slide 24

Slide 24 text

Lv.1ͷఆٛ

Slide 25

Slide 25 text

੒ख़౓ͷఆٛ • ϞϊϦγοΫRailsΛޮ཰తʹ։ൃͰ͖͍ͯ Δɻ • ϚΠΫϩαʔϏεΛ࢝ΊΔͨΊͷ૊৫తͳ౔ ৕͕͋Δɻ

Slide 26

Slide 26 text

Lv.1ʹਐΉͨΊʹ΍Δ ͜ͱ

Slide 27

Slide 27 text

֓ཁ • ٕज़ • தن໛ͷϞϊϦγοΫRails։ൃͰ
 ΍Δ΂͖͜ͱશͯ • ૊৫ • ৬ೳΛӽ͑ͯڠྗͰ͖Δ͜ͱ

Slide 28

Slide 28 text

[ٕज़] தن໛ͷϞϊϦγ οΫRails։ൃͰ΍Δ΂͖ ͜ͱશͯ

Slide 29

Slide 29 text

"தن໛" RailsΛͪΌΜͱ࡞Ε Δ͜ͱ • MVCͷ੹຿Λ෼ׂͰ͖Δ • PORO (PlainͳRubyΫϥε) Λ׆༻Ͱ͖Δ • RESTfulΛकΕΔ • ਖ਼نԽͨ͠DBઃܭ͕Ͱ͖Δ • ୯ମςετ͕ॻ͚Δ

Slide 30

Slide 30 text

"େن໛" Rails͸࡞Βͳ͍ • ҎԼͷϊ΢ϋ΢͸ཁΒͳ͍ • RailsʹϨΠϠʔυΞʔΩςΫνϟΛಋೖ͢Δ • Trailblazer • ͦͷଞɺ͍ΖΜͳRails֦ு • γϯϓϧʹɺRailsͷࢥ૝ʹ৐Ζ͏

Slide 31

Slide 31 text

Simple is Best.

Slide 32

Slide 32 text

[૊৫] ৬ೳΛӽ͑ͯڠ ྗͰ͖Δ͜ͱ

Slide 33

Slide 33 text

ಥવͰ͕͢
 ͭΒ͍εϥΠυͰ͢

Slide 34

Slide 34 text

৬ೳΛӽ͑ͯڠྗ͍ͯ͠ͳ͍ྫ • DevͱOpsͷ෼཭ • CSରԠ΁ͷΤϯδχΞ ͷԹ౓ײ͕௿͍ • Ӧۀͱٕज़ऀͷରཱ • ج൫։ൃνʔϜͱݱ৔ ͱͷߔ • ΫϥΠΞϯτνʔϜͱ APIνʔϜͷ෼཭ • ඼࣭؅ཧνʔϜ΁ͷ
 ؙ౤͛ • ݚڀ։ൃ͕͍ͭʹͳͬ ͯ΋Ϣʔβ΁ͷՁ஋Λ ࢈Έग़͞ͳ͍

Slide 35

Slide 35 text

ϚΠΫϩαʔϏεͷ໨త (࠶ܝ) "ϚΠΫϩαʔϏεͷ࠷େͷ໨ඪ͸ʮαʔϏεԽ͞ΕͨػೳͷϦϦʔ εαΠΫϧΛɺͦͷػೳΛ؅ཧ͢ΔνʔϜ͕ಠࣗʹܾఆͰ͖ΔΑ͏ʹ ͢Δʯ͜ͱͰ͢ɻ
 ͦΕ͸ԿͷͨΊ͔ͱ͍͏ͱʮػೳΛͲΜͲΜվળͯ͠Ṷ͚͍ͨʯ͔Β Ͱ͢ɻ" • ͜ΕΛୡ੒͢Δʹ͸ɺ
 ৬ೳΛӽ͑ͨڠྗ͕ෆՄܽ

Slide 36

Slide 36 text

Change. Yes We Can!

Slide 37

Slide 37 text

ίϛϡχέʔγϣϯͷॏཁੑ

Slide 38

Slide 38 text

ίϛϡχέʔγϣϯͷॏཁੑ • ϚΠΫϩαʔϏεʹ͢Δ͚ͩͰ͸ɺਓ΍૊৫ ͷ໰୊͸ղܾ͠ͳ͍ • ϚΠΫϩαʔϏεͱνʔϜΛ1:1ʹ͢Δͷ͸ɺ ॳظஈ֊Ͱ͸೉͍͠ • ޮՌతͳίϛϡχέʔγϣϯ͕ඞཁ

Slide 39

Slide 39 text

Lv.1 ͓͢͢Ίͷจݙ • ΞδϟΠϧαϜϥΠ −ୡਓ։ൃऀ΁ͷಓ− • Ϩʔϧͷ৳͹͠ํ by @willnet, 
 Rails Developers Meetup 2017

Slide 40

Slide 40 text

Lv.1 => Lv.2

Slide 41

Slide 41 text

Lv.2ͷఆٛ

Slide 42

Slide 42 text

ϑΣʔζ • ϚΠΫϩαʔϏεΛ࢝Ί͍ͯΔɻ3ݸ͘Β͍ɻ

Slide 43

Slide 43 text

੒ख़౓ͷఆٛ • ͦͷ૊৫ͷϏδωευϝΠϯΛཧղ͠ɺద੾ ʹαʔϏε෼ׂͰ͖͍ͯΔɻ • ෼ׂ͞ΕͨαʔϏεͷυϝΠϯΛத৺ʹɺڠ ྗͰ͖ΔνʔϜ·ͨ͸άϧʔϓ͕͋Δɻ • ݖݶͱ੹೚ͷҕৡ͕ਐΊΒΕ͍ͯΔɻ

Slide 44

Slide 44 text

Lv.2ʹਐΉͨΊʹ΍Δ ͜ͱ

Slide 45

Slide 45 text

֓ཁ • ٕज़ • Ϗδωε୯ҐͰͷϞδϡʔϧԽ • ྑ͍APIઃܭ • APIͷར༻ • ૊৫ • ٕज़ऀ͕ΦʔφʔγοϓΛ࣋ͭ

Slide 46

Slide 46 text

[ٕज़] Ϗδωε୯ҐͰ ͷϞδϡʔϧԽ

Slide 47

Slide 47 text

ਫฏ෼ׂͱਨ௚෼ׂ • ਫฏ෼ׂ ... ٕज़తͳڥք໘ • ྫ: MVC, ϨΠϠʔυΞʔΩςΫνϟ • ਨ௚෼ׂ ... Ϗδωεͷڥք

Slide 48

Slide 48 text

ϚΠΫϩαʔϏε=ਨ௚෼ׂ • ϚΠΫϩαʔϏε͸ਨ௚෼ׂʹ͢΂͖ • ໨త͔Βߟ͑ͯ΋ࣗવ • ΄΅ "ఆٛ" ʹ͍ۙ • ͜ͷϑΣʔζͰ͸ɺਫฏ෼ׂͰαʔϏεԽΛ ͯ͠͸͍͚ͳ͍(ېࢭ)(must not)

Slide 49

Slide 49 text

ਖ਼͍͠੹຿ͷ෼ׂ • ʮߴڽूʯ͔ͭʮૄ݁߹ʯʹͳΔΑ͏ʹ͢Δ • 1ͭͷมߋͷͨΊʹ͸ɺ1ͭͷαʔϏε͚ͩมߋ͢Ε͹Α͍ • ͋ΔαʔϏεΛมߋͯ͠΋ɺผͷαʔϏεΛมߋ͢Δඞཁ ͕ͳ͍ • ϚΠΫϩαʔϏεʹݶΒͣɺϞδϡʔϧԽʹ͍ͭͯͷطଘͷߟ ͑ํΛ࣋ͪग़ͤ͹ྑ͍ • υϝΠϯۦಈઃܭͷʮڥք͚ͮΒΕͨίϯςΩετʯ

Slide 50

Slide 50 text

Ͳ͔͜ΒϚΠΫϩαʔϏεʹ੾ Γग़͢ͷ͔ʁ • ҰݴͰද͢ͱɺʮಠཱͤͯ͞ҭ͍ͯͨ΋ͷʯ • มߋͷස౓͕ଟ͍/ଟ͍ͨ͘͠ • Ṷ͔Δ • ଞͷػೳͱͷ݁߹౓͕௿͍ • ࠓޙͷϏδωεͷํ޲ੑΛΑ͘ཧղ͢Δඞཁ

Slide 51

Slide 51 text

[ٕज़] APIઃܭ

Slide 52

Slide 52 text

API͸ϚΠΫϩαʔϏεͷ໋ • APIΛ௨ͯ͠࿈ܞ͢Δ͜ͱʹΑΓɺαʔϏεͷࣗ཯ੑ͕ੜ·ΕΔ • Jeff Bezosͷݴ༿ • શͯͷνʔϜ͸αʔϏεΠϯλʔϑΣΠεΛ௨ͯ͠ػೳΛެ։͠ɺ
 ࿈ܞͤΑ • ͦΕҎ֎ͷϓϩηεؒ௨৴ͷํ๏(DB௚ಡΈ, ڞ༗ϝϞϦ, etc)͸ېࢭͰ͋Δ • ͜ΕΛकΒͳ͍ऀ͸ղޏͩ ग़య: The Secret to Amazons Success Internal APIs
 https://apievangelist.com/2012/01/12/the-secret-to-amazons-success-internal-apis/

Slide 53

Slide 53 text

Rails ͱ API • Rails, RESTfulͷࢦ਑ʹ৐͍ͬͯ͘ͷ͕ྑ͍ • ͜ͷςʔϚͰ͸Ұ౓࿩͍ͯ͠ΔͷͰɺࠓճ͸ ׂѪ͠·͢ ࢀߟ: ϚΠΫϩαʔϏεࢦ޲ Rails API ։ൃΨΠυ
 (@qsona, ͗Μ͟Rubyձٞ01)
 https://medium.com/finc-engineering/ginzaruby01-rails-api-guide-168fe9cf5b4d

Slide 54

Slide 54 text

[ٕज़] APIͷར༻ RailsͰAPIΛར༻͢ΔଆʹͳΔͱ͖ͷTips

Slide 55

Slide 55 text

Rails DMͰ͢ͷͰɺ͠͹Β͘ Ruby/Railsͷ࿩Λ͠·͢

Slide 56

Slide 56 text

APIΫϥΠΞϯτͷબఆ • ੜ͖ͯΕ͹ͳΜͰ΋ྑ͍ • Faraday ͕͓͢͢Ί • ෳ਺ͷAPIΛฒྻʹୟ͘༨஍Λ࢒͢ • όοΫΤϯυʹTyphoeusΛར༻ • cookpadͷࣄྫ͸͓͓͑ͯ͜͞͏ RESTful Web API ։ൃΛ͑͞͞Δ Garage - ΫοΫύου։ൃऀϒϩά
 http://techlife.cookpad.com/entry/2014/11/06/100000

Slide 57

Slide 57 text

৽͍͠૚Λ࡞Δ: Repository • ͓͢͢Ί: app/repositories • app/models ҎԼ͸ආ͚Δ • ωοτϫʔΫӽ͠ͷΞΫηε͸ɺ
 DBΞΫηεͱ͸શ͘ผ෺ • ActiveRecordͱಉ͡งғؾͰݺͼग़ͤͳ͍΄͏͕Α͍ • (ActiveResource͸๨ΕΑ͏)

Slide 58

Slide 58 text

RepositoryΫϥε͸
 ໨త͝ͱʹ෼͚Δ • ݺͼग़͢αʔϏε͝ͱͰ͸ͳ͍ • αʔϏε໊_repository.rb ͸ආ͚Δ

Slide 59

Slide 59 text

Hash Λฦͣ͞ɺΠϯελϯε/ ஋Λฦ͢ • HashΛฦ͢ͱɺݺͼग़͠ଆ͸࢖͍ʹ͍͘ • Πϯελϯεʹͯ͠ฦ͢·Ͱ͕Repositoryͷ ࢓ࣄ • ஋ (਺஋΍จࣈྻ) ͔͠ඞཁͳ͍ͳΒɺͦΕΛ ฦͯ͠Α͍

Slide 60

Slide 60 text

Ϩεϙϯεͷ͏ͪɺඞཁͳ஋ͩ ͚Λར༻͢Δ • Tolerant Reader ύλʔϯ • ࣗαʔϏεʹඞཁͳ஋͚ͩΛΠϯελϯεʹ Ϛοϓ͢Δ

Slide 61

Slide 61 text

ͩΊͳྫ class User include ActiveModel::Model attr_accessor :id, :name, :age end class UserRepository def self.get(id) response = api_client.get("/v1/users/#{id}") return nil if response.status == 404 raise 'Error' unless response.success? # response.body # => { 'id' => 1, 'name' => 'qsona', 'age' => 17 } User.new(response.body) end end

Slide 62

Slide 62 text

ͩΊͳཧ༝ • APIͷϨεϙϯεʹ৽͘͠ gender Ωʔ͕௥Ճ ͞ΕΔͱ? # response.body # => { 'id' => 1, 'name' => 'qsona', 'age' => 17, 'gender' => female } User.new(response.body) #=> ActiveModel::UnknownAttributeError: unknown attribute 'gender' for User.

Slide 63

Slide 63 text

ͩΊͳཧ༝ • API΁ͷΩʔ௥Ճ͸ɺޙํޓ׵ੑͷ͋Δมߋͱ Έͳ͞ΕΔ΂͖ • ͕ͨͬͯ͠ɺΩʔ௥ՃͰΤϥʔʹͳΔͷ͸NG

Slide 64

Slide 64 text

मਖ਼ͨ͠ྫ # response.body # => { 'id' => 1, 'name' => 'qsona', 'age' => 17 } # User.new(response.body) # => ͜͜Λमਖ਼ body = response.body User.new(id: body['id'], name: body['name'], age: body['age'])

Slide 65

Slide 65 text

Repositoryͷςετ • Repositoryࣗମͷςετ • ྫ: bblimke/webmock Λར༻͢Δ • ͜ΕΛॻ͍͓ͯ͘ͱɺܨ͗ࠐΈͷ֬౓͕͙ͬͱ্͕Δ • RepositoryΛར༻͢Δίʔυͷςετ • webmock Λ࢖͏ͷͰ͸ͳ͘ɺ
 RepositoryΛmock/stub͢ΔͷΛਪ঑

Slide 66

Slide 66 text

[૊৫] ٕज़ऀ͕Φʔφ ʔγοϓΛ࣋ͭ

Slide 67

Slide 67 text

ϚΠΫϩαʔϏεͱΦʔφʔγοϓ • ࠷ॳ͸1νʔϜͰෳ਺ͷαʔϏεΛ؅ཧͯ͠΋Α͍ • খͯ͘͞΋ࣗ཯ͨ͠ʮαʔϏεʯͰ͋Δ • αʔϏεͷΦʔφʔΛܾΊ͓͍ͯͨ΄͏͕Α͍ • ੹೚ͱݖݶͷ໌֬Խ • ٕज़ऀͷ੒௕ʹͭͳ͕ΔϝϦοτ "ϚΠΫϩαʔϏεͰ͸ͦΕͧΕಠཱͨ͠ϥΠϑαΠΫϧΛ࣋ͭෳ਺ͷࣗ཯తͳίʔυϕʔε͕͋Γ· ͢ɻଟ͘ͷ੹೚ΛҾ͖ड͚ΔલʹݸʑͷαʔϏεΛॴ༗ͤ͞Δ͜ͱͰ։ൃऀͨͪΛ޲্ͤ͞Δ͜ͱ͸ɺ ֤ࣗͷΩϟϦΞ໨ඪΛ࣮ݱͤ͞ΔͨΊͷ༏Εͨํ๏Ͱ͋Γɺಉ࣌ʹ੹೚ऀͷෛՙΛܰݮ͠·͢ɻ" - ϚΠΫϩαʔϏεΞʔΩςΫνϟ 2.10 νʔϜͷߏங

Slide 68

Slide 68 text

࣮ྫ: "ػցֶश" ϚΠΫϩαʔϏε

Slide 69

Slide 69 text

΍ͬͨ͜ͱ • ʮػցֶशʯͷϚΠΫϩαʔϏεΛ࡞ͬͨ • ༷ʑͳػցֶशϩδοΫ͕ɺ͜ͷαʔϏεʹ࣮૷͞Ε͍ͯͬͨ • Ξϯέʔτͷޙ൒ͷճ౴Λ༧ଌ͠ɺ࣭໰਺ΛݮΒ͢ • Ϣʔβʹදࣔ͢ΔίϯςϯπͷϨίϝϯυ • νϟοτϘοτͷػೳ • APIΛ௨ͯ͠ɺͦΕΒͷػೳΛఏڙ͍ͯ͠Δ

Slide 70

Slide 70 text

ىͬͨ͜͜ͱ(1) DB௚ಡΈ • ػցֶशͷϩδοΫͷͨΊʹ͸ɺؔ܎͢Δσʔλ͕ ΄΅·Δ͝ͱඞཁ • API࿈ܞͰ͸ɺಡΉํ΋࡞Δํ΋ͭΒ͍ • σʔλΛ࣋ͭαʔϏε͕DBͷϦʔυϨϓϦΧΛ༻ҙ ͠ɺͦ͜ΛػցֶशαʔϏε͕௚઀ୟ͘Α͏ʹͨ͠ • ີ݁߹ͷ͸͡·Γ

Slide 71

Slide 71 text

ىͬͨ͜͜ͱ(2) ϩδοΫͷ෼ࢄ • ػցֶशΛ͢ΔͨΊʹ΋ɺݩͷϏδωεͷϩδο Ϋ͸͋Δఔ౓ඞཁ • ϩδοΫ͕2αʔϏεʹ෼ࢄ • ڍಈΛมߋ͍ͨ࣌͠ʹɺ2αʔϏεͷमਖ਼͕ඞཁ • ڽू౓ͷ௿Լ

Slide 72

Slide 72 text

݁Ռ • ີ݁߹ɾ௿ڽूͱ͍͏ɺཧ૝ͷٯΛߦ͘ঢ়ଶ • ύϑΥʔϚϯε໰୊ΛҾ͖ى͕ͪ͜͠ • ো֐΋ى͜Γ΍͍͢

Slide 73

Slide 73 text

ͳͥͩΊ͔ͩͬͨ • Ϗδωεͷ୯ҐͰ͸ͳ͍ϚΠΫϩαʔϏεΛ࡞ͬ ͨ͜ͱ • ʮػցֶशʯͦͷ΋ͷ͸ϏδωεͰ͸ͳ͍ • Ϗδωεͷཁ੥ʹΑͬͯɺػցֶशͱ͍͏ٕज़ Λ࢖͍ͬͯΔɺ͕ਖ਼͍͠ • ٕज़ͰαʔϏε෼ׂͯ͠͠·ͬͨ(ਫฏ෼ׂ)

Slide 74

Slide 74 text

ڭ܇ • αʔϏεͷ੹຿͸ɺϏδωεͰଊ͑Δ • ଞαʔϏε΁ͷDBʹ௚ΞΫηε͢Δͷ͸͍͔ ͳΔ৔߹Ͱ΋ېࢭ(ېࢭ)(must not)

Slide 75

Slide 75 text

ػցֶशαʔϏεͷۙگ • طଘͷ "ػցֶशαʔϏε" ͸ɺঃʑʹղମ • ػցֶशͷεΫϦϓτ͸ɺঃʑʹҠߦ/࡟আ • ࡞Γ௚͠΋͍ͯ͠Δ (߲࣍) • νϟοτϘοτ͸ɺϝΠϯͷϏδωεͱͯ͠ӡ༻த • ࣦഊ͸ඞͣ͋Δ • ݁Ռ͚ͩΛݟͯݴ͏ͷ͸؆୯ • ͭΒ͍͜ͱ΋͋Δ͚Ͳ΍͍͖ͬͯ

Slide 76

Slide 76 text

ػցֶशΛ৽͘͠ϓϩμΫτʹ ಋೖ͢Δͱ͖͸ • ػցֶश͸ɺαʔϏεͷҰ෦ͱͱΒ͑Δ • ػցֶश୯ମͰͷϚΠΫϩαʔϏεԽ͸ߦΘͳ͍ • ن໛ײɾಈ࡞ͷॏ͞ʹΑΓɺ݁߹౓Λௐ੔͢Δ • খ͍͞ => RailsͷαʔϏεʹεΫϦϓτΛಉډ • େ͖͍ => αʔϏεͷࢠϓϩμΫτͱͯ͠ಠཱ • αʔϏεͷΤϯδχΞͱػցֶशͷΤϯδχΞ͕ີʹ࿈ܞͯ͠ɺ ϓϩδΣΫτΛਐΊ͍ͯΔ

Slide 77

Slide 77 text

ີʹ࿈ܞ͍ͯ͠Δ༷ࢠ

Slide 78

Slide 78 text

Lv.2 ͓͢͢Ίͷจݙ • Θ͔ΔʂυϝΠϯۦಈઃܭ ʙ ΋ͪͪ͜ΌΜͷେ๯ݥʙ / TechBooster • ϚΠΫϩαʔϏε
 ΞʔΩςΫνϟ • 1ষ, 3ষ, 4ষ 4.1ʙ4.7, 5ষ

Slide 79

Slide 79 text

Lv.2 => Lv.3

Slide 80

Slide 80 text

Lv.3ͷఆٛ

Slide 81

Slide 81 text

ϑΣʔζ • ϚΠΫϩαʔϏεΛ૿΍͍ͯ͠Δɻ15ݸ͘Β ͍ɻ

Slide 82

Slide 82 text

Lv.2͔ΒͷมԽ • αʔϏεͷ૿Ճʹͱ΋ͳ͍ɺ༷ʑͳ໰୊͕ى ͜Γ࢝ΊΔ • ૊৫໘ɾٕज़໘ͱ΋ʹʮεέʔϧʯͤ͞Δ͜ ͱ͕՝୊

Slide 83

Slide 83 text

੒ख़౓ͷఆٛ • νʔϜͷ෼ׂΛਐΊ͍ͯΔɻ • ༷ʑͳํ๏ͰαʔϏεΛ࿈ܞ͍ͯ͠Δɻ • αʔϏεڞ௨ͷؔ৺ࣄʹରॲ͍ͯ͠Δɻ • νʔϜͷ෼ׂΛਐΊ͍ͯΔɻ • ༷ʑͳࣗಈԽΛਐΊ͍ͯΔɻ

Slide 84

Slide 84 text

Lv.3ʹਐΉͨΊʹ΍Δ ͜ͱ ͜ͷϑΣʔζ͸ଟذʹ౉ΔͨΊɺٕज़໘ʹ࿩Λߜ Γ·͢ɻ

Slide 85

Slide 85 text

֓ཁ • APIఆٛ / APIυΩϡϝϯτͷࣗಈԽ • ඇಉظΠϕϯτ࿈ܞ • ࣾ಺ϥΠϒϥϦ • Πϯϑϥ໘ͷ༷ʑͳࣗಈԽ • ϚΠΫϩαʔϏεਫ਼ਆ

Slide 86

Slide 86 text

[ٕज़] APIఆٛ / APIυ ΩϡϝϯτͷࣗಈԽ

Slide 87

Slide 87 text

࣮૷΁ͷґଘ • Lv.2Ͱ͸ɺଞαʔϏεͷ࣮૷ʹґଘ͍ͯͯ͠΋ ໰୊͸ى͖ͳ͍ • Lv.3Ͱ͸ෳࡶ͕͞૿͠ɺਏ͘ͳͬͯ͘Δ

Slide 88

Slide 88 text

ΠϯλʔϑΣΠεॏࢹ΁ • APIͷܕఆٛΛ͔ͬͪΓ͢Δ • ܕఆٛΛར༻ͯ͠ɺϨεϙϯεΛόϦσʔγ ϣϯ͢Δ • ୯ମςετʹ΋ܕఆٛΛར༻͢Δ

Slide 89

Slide 89 text

ৄࡉ • ҎԼͷࢿྉͰޠΓਚ͘͞Ε͍ͯΔ RubyKaigi 2017 ͰͲΜͳൃදΛ͔ͨ͠
 - onk.ninja https://blog.onk.ninja/2017/09/21/my_talk_of_rubykaigi_2017

Slide 90

Slide 90 text

APIఆٛΛ͔ͬͪΓ͢Δ͜ͱͷ ϚΠΫϩαʔϏεͱͯ͠ͷϝϦοτ • αʔϏε͕ؒૄ݁߹ʹͳΓɺࣗ཯ੑ͕૿͢ • αʔϏεͷ࠶ར༻ੑ͕ߴ͘ͳΔ • αʔϏε࿈ܞʹ͓͚ΔϛεΛݮΒͤΔ • ֤αʔϏεͷࣗ཯͕ɺܥΛڧ͘͢Δ

Slide 91

Slide 91 text

গ͠୤ઢͯ͠ɺ
 ςετͷ࿩

Slide 92

Slide 92 text

E2Eςετ͸ෆཁ͔? • ޡղΛڪΕͣʹݴ͑͹... ͜ͷϑΣʔζͰ͸ʮෆཁʯ • ҎԼΛ͖ͪΜͱߦ͑͹ɺܨ͗ࠐΈ͸΄΅ҰൃͰ׬ྃ͢Δ • APIઃܭɺαʔϏεؒ࿈ܞͷઃܭ • (Provider) APIܕఆٛ/υΩϡϝϯτੜ੒/αʔϏε୯ମͷςετ • (Consumer) Repositoryͷςετ • E2Eςετʹ͸σϝϦοτ͕ଟ͍

Slide 93

Slide 93 text

Consumer-Driven Contract Testing • ConsumerͱProvider͕APIʹؔ͢Δܖ໿Λ݁ͼɺͦΕΛ΋ͱ ʹProvider͕ςετ͢Δ • E2EςετͱҧͬͯσϝϦοτ͕গͳ͍ͷͰɺ༨ྗ͕͋Ε͹΍ ͬͯ΋ྑ͍ͱࢥ͏ • FiNCͰ͸2೥લ͔Βݕ౼͸͍ͯ͠Δ͕ɺࠓͷͱ͜Ζ༏ઌ౓͕ ߴ͘ͳ͍ • "ܕΛकΔ" Ҏ্ͷܖ໿Λ݁Ϳͷ͸࣮ࡍ೉ͦ͠͏

Slide 94

Slide 94 text

Ұͭͷࣄ࣮ • FiNCࣾͰ2017೥ʹى͖ͨো֐ΛৼΓฦͬͨ݁ՌɺαʔϏεؒͷE2E/CDCς ετͰ๷͛ͨ΋ͷ͸΄ͱΜͲͳ͔ͬͨ • E2EςετΛॻ্͍ͨͰɺ؂ࢹʹར༻͍ͯ͠Ε͹ɺૣظൃݟͰ͖ͨέʔε͸͍ ͔ͭ͋ͬͨ͘ (ηϚϯςΟοΫ؂ࢹ) • ͔ͦ͠͠Ε΋ݪҼ͸ɺsidekiq΍SQSͷΩϡʔ͕٧·ͬͨͳͲ • ΠϯϑϥϨϕϧͷ؂ࢹͰؾ͚ͮΔ • ଟ͍ͷ͸Client-ServerؒͰͷૄ௨ϛε • αʔϏεؒ͸ɺ୯ମςετͰ΄ͱΜͲͷ໰୊Λ๷͍͛ͯΔ

Slide 95

Slide 95 text

࠷৽৘ใ • [Day 1 A-1] ͷηογϣϯͰɺαʔϏεΛ෼ׂ ͍ͯ࣌͘͠ͷςετͷ࿩͕͋ͬͨΑ͏Ͱ͢ ҆શ͔ͭߴ଎ʹਐΊΔϚΠΫϩαʔϏεԽ / @k0kubun https://speakerdeck.com/k0kubun/railsdm2018

Slide 96

Slide 96 text

[ٕज़] ඇಉظΠϕϯτ ࿈ܞ

Slide 97

Slide 97 text

ඇಉظΠϕϯτ࿈ܞ • αʔϏεͷڽू౓ΛอͭͨΊʹඞཁʹͳΔ • ฐࣾࣄྫͷൃද͕͋ΔͷͰɺৄࡉ͸ͦͪΒʹ ϚΠΫϩαʔϏεʹ͓͚Δ ඇಉظΞʔΩςΫνϟ - ota42y https://www.slideshare.net/ota42y/ss-80254350

Slide 98

Slide 98 text

[ٕज़] Πϯϑϥ໘ͷ ༷ʑͳࣗಈԽ FiNCͰ͸Docker, Amazon ECSΛར༻͍ͯ͠· ͢ɻࠓճ͸ඈ͹͠·͢ɻ

Slide 99

Slide 99 text

[ٕज़] ϚΠΫϩαʔϏ εਫ਼ਆ ͓΋ͯͳ͠ͷ৺

Slide 100

Slide 100 text

தԝूத؅ཧ੎ྗ • ϚΠΫϩαʔϏεͷߦ͘खΛ્Ήఢ

Slide 101

Slide 101 text

தԝ؅ཧʹͨ͘͠ͳΔྫ • ڞ௨Խ (DRY) • ݸਓ৘ใ • ηΩϡϦςΟ • σϓϩΠεΫϦϓτ • ϑϩϯτΤϯυ • UIͷ౷Ұੑ

Slide 102

Slide 102 text

தԝूத؅ཧ੎ྗͱͷઓ͍ • தԝ؅ཧ͸ϚΠΫϩαʔϏεਫ਼ਆͱ૬൓͢Δ • தԝ؅ཧͨ͘͠ͳΔཧ༝͸ɺ༷ʑͳͱ͜Ζʹ ଘࡏ͢Δ • ͦΕΒͷཁ݅ͱɺϚΠΫϩαʔϏεΛཱ྆͢ Δ౒ྗΛ͢Δ

Slide 103

Slide 103 text

࣮ྫ: ؅ཧը໘େ౷Ұ ߏ૝ ϚΠΫϩαʔϏε৓ʹݱΕͨఢର੎ྗ

Slide 104

Slide 104 text

ϚΠΫϩαʔϏεͱ؅ཧը໘ • ϚΠΫϩαʔϏεʹ΋؅ཧը໘͸ඞཁ • ී௨ͷαʔϏεͱಉ͡ɺͰ͢ΑͶ • ϚΠΫϩαʔϏεͷ਺͚ͩ؅ཧը໘͕Ͱ͖Δ • devise ͱ͔Λ࢖ͬͯΊ͍Ί͍ʹ࣮૷͢Δ

Slide 105

Slide 105 text

՝୊ • ΞΫηείϯτϩʔϧ͕؅ཧͰ͖͍ͯͳ͍ • ֤αʔϏε͕ಠࣗͰΞΧ΢ϯτ؅ཧ • ୀ৬ऀͷΞΧ΢ϯτΛ࡟আͰ͖͍ͯͳ͍ • ࢖͏ਓ͕ɺͲ͜ʹԿ͕͋Δͷ͔Θ͔Βͳ͘ͳΔ • UX͕౷߹͞Ε͍ͯͳ͍ • େྔʹϒοΫϚʔΫ͢Δ͜ͱʹ

Slide 106

Slide 106 text

ͦ͜Ͱ؅ཧը໘େ౷Ұߏ૝ • ΞΫηείϯτϩʔϧΛूத؅ཧ • ΞΧ΢ϯτ؅ཧ (ೝূ) • ୭͕ԿΛͰ͖Δ͔ͷ؅ཧ (ೝՄ)

Slide 107

Slide 107 text

ىͬͨ͜͜ͱ • ͪͬͱ΋ਐ·ͳ͍

Slide 108

Slide 108 text

ىͬͨ͜͜ͱ • ͦ͏͜͏͍ͯ͠Δ͏ͪʹɺ৽͍͠؅ཧը໘Λ ࡞Γͨ͘ͳΔ • ࡞Ζ͏ͱͨ͠Βʮ͜ΕҎ্؅ཧը໘Λ૿΍͞ ͳ͍Ͱ͘ΕʯͱݴΘΕͨ

Slide 109

Slide 109 text

൓࿦ͨ͠ • ൓࿦͠ͳ͕Β΋ɺ൓ল͍ͯ͠Δ໘΋͋Δ
 (ݱʹ໰୊͕ى͖͍ͯΔ͔Β)

Slide 110

Slide 110 text

தԝ؅ཧ͍ͨ͠ཧ༝ • ΞΫηείϯτϩʔϧ • ೝূ 
 (ձࣾͷActive DirectoryΞΧ΢ϯτΛ࢖͍͍ͨ) • ೝՄ (ݖݶͷ؅ཧ) • UX (γʔϜϨεʹભҠͰ͖Δ)

Slide 111

Slide 111 text

ΞΫηείϯτϩʔϧ (ೝূ) • Single Sign-onΛ͢Δࣾ಺GemΛ࡞ͬͨ • ADΛར༻͢ΔͨΊɺruby-saml Λϕʔε • Rails Engine • ࣾ಺ADͷ(ൿಗͰ͸ͳ͍)৘ใΛgem಺ʹ࣋ ͨͤɺಋೖΛ؆୯ʹ

Slide 112

Slide 112 text

࡞ͬͨਓ

Slide 113

Slide 113 text

ΞΫηείϯτϩʔϧ (ೝՄ) • ೝՄ͸ͦ΋ͦ΋தԝ؅ཧͰ͖ͳ͍ • ೝՄ͸ϏδωεϩδοΫ • ֤αʔϏεͰ࣮૷͢΂͖΋ͷ • ϢʔβʹλάΛషΔػೳ͚ͩɺࣾ಺Gemͷதʹ࡞ͬͨ • ؆қతͳ΋ͷ • (͜͜ʹೝՄͷϩδοΫ౳·ͰؚΊΔͱͭΒ͘ͳΔ)

Slide 114

Slide 114 text

UXͷ౷߹ • ཁٻͷϨϕϧʹΑͬͯ΍Γํ͕มΘΔ • ·ͩ΍͍ͬͯͳ͍ • ࣾ಺؅ཧը໘ͳͷͰɺ
 ཁٻϨϕϧ͸͍·ͷͱ͜Ζ࠷௿ • ࣍ͷྫͰ΋࿩͠·͢

Slide 115

Slide 115 text

ྫ·ͱΊ • தԝ؅ཧ͸ɺϚΠΫϩαʔϏεͷࢥ૝ʹ൓͢ Δ • தԝ؅ཧ͍ͨ͠ཧ༝͸͋Δ • ໰୊ΛݟۃΊɺద੾ʹରॲ͢Δ

Slide 116

Slide 116 text

ྫ·ͱΊ • ڞ௨ͷؔ৺ࣄ͸ɺࣾ಺GemͰରॲ͢Δ • ϏδωεͷϩδοΫ͸ؚΊͳ͍͜ͱ • Gemʹࣾ಺ಛ༗ͷ৘ใ·ͰؚΊɺಋೖΛ؆୯ʹ͢ Δ • (΋ͪΖΜɺࣾ಺ಛ༗ͷ΋ͷҎ֎͸OSSʹ͠Α͏ʂ)

Slide 117

Slide 117 text

ࣾ಺Gemʹؔ͢Δ͍͍࿩2ͭ • Ϋϩʔζυιʔε͔Β࢝ΊΔΦʔϓϯιʔε
 2017-05-23 Speee Cafe Meetup #07 େ஥ ೳ࢙ a.k.a. @onk
 https://www.slideshare.net/takafumionaka/ss-76268823 • ApplicationTemplateͷεεϝ
 2017-08-06 ͗Μ͟ Ruby ձٞ 01 େ஥ ೳ࢙ a.k.a. @onk
 https://www.slideshare.net/takafumionaka/applicationtemplate

Slide 118

Slide 118 text

࣮ྫ: 
 ෳ਺छผͷϢʔβʹఏڙ͢Δ αʔϏεͷϚΠΫϩαʔϏεԽ ϚΠΫϩαʔϏε͸API͚ͩʹ͢΂͖͔ɺView΋ఏ ڙ͢΂͖͔ʁ

Slide 119

Slide 119 text

๏ਓ޲͚αʔϏε • Ϣʔβ͕2छྨଘࡏ͢Δ • ैۀһ • ਓࣄ • ͦΕͧΕͷϢʔβ޲͚ʹɺΞϓϦέʔγϣϯ ͕͋Δ

Slide 120

Slide 120 text

৽نϚΠΫϩαʔϏε • ͋Δ৽ػೳΛ࡞Γ͍ͨ • ن໛ײΛߟ͑ͯɺϚΠΫϩαʔϏεԽ͍ͨ͠ • ैۀһ΋ਓࣄ΋ɺͦΕͧΕͷUIΛ௨ͯ͠ར༻ ͢Δ

Slide 121

Slide 121 text

APIϞʔυʹ͢Δʁ • 1) API͚ͩΛఏڙ͢Δ • UI͸طଘͷैۀһ/ਓࣄΞϓϦέʔγϣϯʹ࣮૷ • طଘΞϓϦέʔγϣϯ͔ΒAPIΛୟ͘ • 2) View΋ఏڙ͢Δ • UIΛԿΒ͔ͷํ๏Ͱ౷߹͢Δ

Slide 122

Slide 122 text

ϝϦοτ/σϝϦοτ
 1) API͚ͩΛఏڙ͢Δ • ϝϦοτ: UIͷ౷߹͕؆୯ • σϝϦοτ: ࣮૷͕෼ࢄ͢Δ • ػೳ࣮૷ͷͱ͖ɺ3αʔϏεʹखΛ͍ΕΔ͜ ͱʹͳΔ

Slide 123

Slide 123 text

ϝϦοτ/σϝϦοτ
 2) View΋ఏڙ͢Δ • ϝϦοτ: ࣮૷͕1αʔϏεʹ·ͱ·Δ(ߴڽू) • σϝϦοτ: UIͷ౷߹͕೉͍͠ • 1ը໘Ͱෳ਺αʔϏε͕ฦ͢HTMLΛ౷߹͢ Δͷ͸೉͍͠

Slide 124

Slide 124 text

ࠓճ͸2Λબ୒ (͢Δ༧ఆ) • UI͸ɺ͋Δఔ౓੾Γ཭͞Ε͍ͯͯ΋໰୊ͳ͍ • ผͷURLυϝΠϯͰఏڙ • Single Sign-onͰମݧΛγʔϜϨεʹ͢Δ • ϚΠΫϩαʔϏεͷϝϦοτΛ༏ઌ • ஫: ϢʔβମݧΑΓٕज़Λ༏ઌ͍ͯ͠Δɺͱ͍͏Θ͚Ͱ͸ͳ͍ • γʔϜϨεͳϢʔβମݧΑΓ΋ɺߴ଎ʹPDCAΛճͯ͠Ձ஋Λఏڙ͠ ͍ͯ͘ํʹॏ͖Λ͓͍͍ͯΔ

Slide 125

Slide 125 text

UIͷڞ௨Խ • UIͷϔομ෦෼ͳͲΛɺαʔϏεؒͰڞ௨Խ͢Δඞཁ͕͋Δ • ΍Γํ͸͍͔ͭ͘ߟ͑ΒΕΔ • ίϐϖ • ϥΠϒϥϦͰڞ༗ • 1ͭͷαʔϏε͕ఏڙ (iframe) • ݕ౼த

Slide 126

Slide 126 text

Lv.3 ͓͢͢Ίͷจݙ • ϚΠΫϩαʔϏεΞʔΩ ςΫνϟ

Slide 127

Slide 127 text

·ͱΊ

Slide 128

Slide 128 text

·ͱΊͰ͢ • ϚΠΫϩαʔϏεʹؔ࿈͢Δ࿩୊͸ٕज़࿦ɾ૊৫࿦ ͳͲଟذʹΘͨΔ • શͯͷೳྗΛҰேҰ༦ʹͯ֫͠ಘ͢Δ͜ͱ͸ෆՄೳ • ֤εςʔδʹΑͬͯͲͷΑ͏ͳೳྗΛ֫ಘ͍ͯ͘͠ ΂͖͔Λ࿦ͨ͡ • εϞʔϧελʔτ͔Βঃʑʹ΍͍͖ͬͯ

Slide 129

Slide 129 text

Microservices͸࠷ ߴʂʂʂʂʂʂʂʂʂ ʂʂʂʂʂʂʂ