Microservices Meetup vol.9 (FiNC App & Frontend) - connpass https://microservices-meetup.connpass.com/event/105174/ の発表資料です。
「クライアント・サーバ間のコンテキスト境界をどこに置くか」 という話を、ドメイン駆動設計の概念などを引きながら検討しました。
ϚΠΫϩαʔϏεͱ ΫϥΠΞϯτͱ ίϯςΩετڥքFor Microservices Meetup vol.92018/10/30FiNC Technologies Inc. / iOS Development Teamؔ ོٛ(takasek)
View Slide
!2● ོؔٛ● !UBLBTFL● 'J/$5FDIOPMPHJFT● $MJFOU&OHJOFFS J045FBNࣗݾհ
!3● ʮJ04ΞϓϦઃܭύλʔϯೖʯ ڞஶ● 1&",4ΑΓ݄ϦϦʔε༧ఆʂ[email protected]SDIJUFDUVSF.7$ .71 .77. 'MVY 3FEVY $MFBO"SDIJUFDUVSF ϞόΠϧಛ༗ͷىಈܦ࿏ɾը໘ભҠͷཧ·ͰཏʂؔɺʮઃܭͱԿ͔ʯͱ͍͏େ͖ͳओޠͰষ΄Ͳʂ .7$ʙ͔Β࿈໖ͱଓ͘ΞʔΩςΫνϟύλʔϯͷྺ࢙ͷཧʂϚαΧϦඞࢸͷϏοάΠγϡʔʹՌʹΈ·ͨ͠ʂએ
!4ຊͷ͓ʮΫϥΠΞϯτɾαʔόؒͷίϯςΩετڥքΛͲ͜ʹஔ͔͘ʯ
!5ίϯςΩετڥքʁ● ڥքͰɺϞσϧΛཧతʹ౷Ұ͞Εͨঢ়ଶʹอͭ͜ͱ● ͨͩ͠ɺڥքͷ֎ʹద༻Ͱ͖Δ͔Ͳ͏͔ؾʹ͢Δඞཁ͕ͳ͍ʮ͋ΔϞσϧΛͲͷίϯςΩετͰɹద༻͖͢Ͱͳ͍ͷ͔ʯΛࣔ͢- ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ ΑΓ
!6ίϯςΩετڥքʁ˞ڥք͚ͮΒΕͨίϯςΩετΛఆٛͨ͠ΒɺͦΕΛ҆ఆͤ͞ͳ͚ΕͳΒͳ͍● ಉ͡νʔϜͰɺίϛϡχέʔγϣϯ్͕Εͯ͠·͏ͱղऍ͕িಥ͠͏Δ● ಉ͡νʔϜͰɺݹ͍ઃܭ৽͍͠ઃܭͰίϯςΩετڥքʹͳΔʮڥքνʔϜฤͷྠֲʹै͏ʯ- ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ ΑΓ
!7BFFBFF(BackendsForFrontends)micro-servicesRepositoryUseCaseDomainViewModelViewServer sideClient side
!8BFFʁΫϥΠΞϯτϩδοΫͷͨΊͷαʔό● ௨৴ͷू● ूϩδοΫͷڞ༗Backends For Frontends
!9RepositoryBFF(BackendsForFrontends)micro-servicesRepositoryUseCaseDomainViewModelViewServer sideClient side
!10RepositoryʁσʔλΛͲ͔͜Βऔಘ͢ΔͲ͜ʹӬଓԽ͢Δ͔Λߟ͑ͳ͍● ϝϞϦ● ετϨʔδ● ωοτϫʔΫ● FUDʜσʔλऔಘɾӬଓԽͷৄࡉΛӅṭ͢Δઃܭύλʔϯ
!11RepositoryʁෳࡶͳϩδοΫΛυϝΠϯ͔ΒΓͨ͢ΊʹϦϙδτϦΛઃ͚ΔʮΫϥΠΞϯτ͕ඞཁͱ͢Δͷɺɹ͢Ͱʹଘࡏ͢ΔυϝΠϯΦϒδΣΫτͷࢀরΛखʹೖΕΔɺɹ࣮༻తͳखஈͰ͋Δʯ- ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ ΑΓ
ʮ࣮ࡍʹతͳΞΫηεΛඞཁͱ͢Δूϧʔτʹରͯ͠ͷΈɺϦϙδτϦΛఏڙ͢Δ͜ͱʯ- ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ ΑΓ
!13ूʁ● ෆม݅ʢৗʹ߹ੑΛอ͍ͬͯΔඞཁͷ͋ΔϏδωεϧʔϧʣΛ อূ͢Δ୯Ґ● ूͰ߹ੑΛҡ࣋͢Δ
!14UseCaseBFF(BackendsForFrontends)micro-servicesRepositoryUseCaseDomainViewModelViewServer sideClient side
!15UseCaseʁʮ%PNBJOʢࣝͷදݱʣΛͲͷΑ͏ʹ͏͔ʯΛࣔ͢4ϨΠϠԽΞʔΩςΫνϟͰݴ͏ͱ͜ΖͷApplication
!16ViewModel, ViewBFF(BackendsForFrontends)micro-servicesRepositoryUseCaseDomainViewModelViewServer sideClient side
!17ViewModelʁ.77. .PEFM7JFX7JFX.PEFMύλʔϯͷίϯϙʔωϯτͨͩɺΞʔΩςΫνϟͷࡉࠓճओͰͳ͍ʮ.PEFM7JFXؒͷมʯͱ͚ͩଊ͍͑ͯͩ͘͞υϝΠϯϞσϧͷσʔλΛɺView༻ͷσʔλʹม͢Δ
!18Viewʁઆ໌ෆཁը໘දࣔΛ࢘Δ
!19ϚΠΫϩαʔϏεͱίϯςΩετϚοϓBFF(BackendsForFrontends)micro-servicesRepositoryUseCaseDomainViewModelViewServer sideClient side
!20ຊͷ͓ (reprise)ʮΫϥΠΞϯτɾαʔόؒͷίϯςΩετڥքΛͲ͜ʹஔ͔͘ʯ
!21ίϯςΩετڥքΛͲ͜ʹஔ͔͘ɿBFFBFF(BackendsForFrontends)micro-servicesRepositoryUseCaseDomainViewModelViewServer sideClient side
!22BFFΛมͱͯ͠ݟͳ͢● ϝϦοτ● ߹ੑʹ͍ͭͯͷ৺ࣄΛυϝΠϯ͔Βഉআ● ϓϥοτϑΥʔϜ J04"OESPJEͷॏෳ࣮Λഉআ● σϝϦοτ● #''ʹཔΓ͗͢ΔʹࢄίϯϐϡʔςΟϯάͷݪଇͷઓ
!23ࢄίϯϐϡʔςΟϯάͷݪଇ● ωοτϫʔΫ৴པͰ͖ͳ͍● ʢ࣌ʹ͔ͳΓͷʣԆ͕ৗʹൃੜ͢Δ● ଳҬ෯ʹݶΓ͕͋Δ● ωοτϫʔΫηΩϡΞͰͳ͍● ཧऀෳͰ͋Δ● సૹίετθϩͰͳ͍● ωοτϫʔΫҰ༷Ͱͳ͍- ࣮ફυϝΠϯۦಈઃܭ ΑΓ
!24ίϯςΩετڥքΛͲ͜ʹஔ͔͘ɿRepositorymicro-servicesRepositoryUseCaseDomainViewModelViewServer sideClient side
!25RepositoryΛมͱͯ͠ݟͳ͢● ϝϦοτ● ߹ੑʹ͍ͭͯͷ৺ࣄΛυϝΠϯ͔ΒഉআͰ͖Δ● σϝϦοτ● ͜ΕϏδωεϩδοΫͳͷͰʜʁ● ϓϥοτϑΥʔϜ J04"OESPJEͷॏෳ࣮
!26ίϯςΩετڥքΛͲ͜ʹஔ͔͘ɿUseCasemicro-servicesRepositoryDomainViewModelViewServer sideClient sideUseCase
!27UseCaseΛมͱͯ͠ݟͳ͢● ϝϦοτ● ʮαʔόͷίϯςΩετΛΫϥΠΞϯτͰͲͷΑ͏ʹѻ͏͔ʯ ʹϏδωεϩδοΫͰ͋Δɺͱ͍͏ೝࣝ● ΫϥΠΞϯτ։ൃͰɺࣗવʹ͜͜ʹམͪண͘͜ͱ͕ଟͦ͏● σϝϦοτ● ϓϥοτϑΥʔϜ J04"OESPJEͷॏෳ࣮
!28ίϯςΩετڥքΛͲ͜ʹஔ͔͘ɿViewModelmicro-servicesRepositoryViewServer sideClient sideUseCaseViewModelDomain
!29ίϯςΩετڥքΛͲ͜ʹஔ͔͘ɿViewModelmicro-servicesServer sideClient sideViewModelView
!30ViewModelͷ● ૢ࡞ͷୡ● ϓϨθϯςʔγϣϯঢ়ଶͷอ࣋● 7JFX༻ͷσʔλͷม● ը໘ؒͷ߹ੑ୲อ● αʔϏεؒͷ߹ੑ୲อ
!31ViewModelΛมͱͯ͠ݟͳ͢● ΞϯνύλʔϯͰʁ
!32ίϯςΩετڥքΛͲ͜ʹஔ͔͘ɿViewmicro-servicesServer sideClient sideViewMicro Frontends
!33ViewΛมͱͯ͠ݟͳ͢● ϝϦοτ● 7JFXϚΠΫϩαʔϏεͷ୯Ґͱݟͳ͢● σϝϦοτ● ΞϓϦͷ߹ʹɺ 7JFXϚΠΫϩαʔϏεʢಠཱͯ͠ϏϧυՄೳͳ୯ҐʣͰͳ͍● Γը໘ίϯϙʔωϯτؒͷ߹ੑΛؾʹ͠ͳ͚ΕͳΒͳ͍● ͦΕ7JFXͷͩΖ͏͔ʁ
!34ΫϥΠΞϯτ͕୲อ͖͢߹ੑ● .PEFMͱ7JFXͷؒͷ߹ੑ● 6*ૢ࡞Λ.PEFMʹୡ● .PEFMͷঢ়ଶมߋΛ7JFXʹө● ڞ௨͢Δ.PEFMʹؔ৺ͷ͋Δͯ͢ͷ7JFXʹมߋ͕ಉظ͞ΕΔ● .PEFMͱ.PEFMͷ߹ੑ● αʔϏε"͔ΒͷϨεϙϯεͱ αʔϏε#͔ΒͷϨεϙϯεΛͻͱͭͷ.PEFMʹ݁߹͢Δ● αʔϏε"Λߋ৽ͨ͠ΒɺαʔϏε#ʹมԽ͕ੜ͍ͯ͡Δ͔͠Εͳ͍
!35Q.ʮModelͱModelͷ߹ੑʯΫϥΠΞϯτ͕୲อ͖͢ͷʁʮαʔϏε"͕มΘͬͨΒαʔϏε#ʹมߋ͕͋ΔʯαʔόͰ୲อ͖͢Ͱʁ" ʢΫϥΠΞϯτ͕"1*Λೳಈతʹୟ͍ͯߋ৽Λऔಘ͢Δੈք؍ͰʣͦΕݪཧతʹແཧ● ʮαʔϏε"ͷߋ৽͕ɺαʔϏε#ʹө͞ΕΔʯͱͯ͠ʜ● ΫϥΠΞϯτɺαʔϏε"ͷߋ৽"1*Λୟ͍ͨ͋ͱɺ ໌ࣔతʹαʔϏε#ͷऔಘ"1*Λୟ͘ඞཁ͕͋Δ● αʔϏε͕ؒ݁Ռ߹ੑΛલఏʹ͍ͯ͠Δ߹ɺ ͞ΒʹʮͲͷ͘Β͍Ͱө͞Ε͏Δ͔ʯʮϦτϥΠΛͲ͏͢Δ͔ʯߟྀ● ΫϥΠΞϯτ͕࣋ͭαʔϏε#ͷঢ়ଶεφοϓγϣοτͰ͔͠ͳ͍● ΫϥΠΞϯτϚΠΫϩαʔϏεؒͷؔੑʹ͍ͭͯͷࣝΛ࣋ͨ͟ΔΛಘͳ͍
!36ͷয● αʔόϨεϙϯεͷܗ6*ૢ࡞ͷαʔόͷୡʁ● αʔϏεؒͷϋϒͱͯ͠ɺදࣔ༰ͷ߹ੑΛҡ࣋͢Δʁ● ࢄίϯϐϡʔςΟϯάΛආ͚ΔͨΊͷϩʔΧϧͳΠϯλϑΣʔεʁ● ෳͷը໘ؒͰͷ߹ੑͷҡ࣋ʁ● ΫϥΠΞϯτͱαʔόͷίϯςΩετ͕Ͳ͜·Ͱ౷߹Մೳ͔ɺ ʮϏδωεϩδοΫʯͷް͞ͰมΘΓ͏ΔΫϥΠΞϯτʹ͓͚ΔʮϏδωεϩδοΫʯͱԿ͔
ʮϏδωεϩδοΫʯͷఆٛΞϓϦʹΑͬͯɺαʔϏεʹΑͬͯҧ͏ͣ
͋ͳͨͷαʔϏεʹ͓͍ͯΫϥΠΞϯτͷίϯςΩετͱԿͰ͔͢ʁ