GoMVCΞϓϦέʔγϣϯͷΞʔΩςΫνϟΛมߋ͢Δ2020.01.29 howtv.go - @inari111
View Slide
• ܊ ࠸• Twitter: @inari111• GitHub: @inari111• Go / Layered Architecture / Protocol buffers• 2019.04~ hey (Coiney)• πέ͍ࣗݾհ
ి൪߸ΛೖྗSMSૹ৴λοϓͯ͠ಉҙͰπέ͍ྃ2ϲ݄ҎʹίϯϏχͰࢧ͍
• ࠓͷπέ͍ͷΞʔΩςΫνϟ• ࠓͷΞʔΩςΫνϟͷ• ৽͍͠ΞʔΩςΫνϟ(Ծ)ࠓ͢͜ͱ
ϑϨʔϜϫʔΫrevelΛ༻appᵓᴷᴷ clientᵓᴷᴷ controllersᵓᴷᴷ libraryᵓᴷᴷ modelsᵓᴷᴷ routesᵓᴷᴷ servicesᵋᴷᴷ viewsࠓͷΞʔΩςΫνϟ$POUSPMMFS4FSWJDF.PEFM.PEFMͷؔݺͼग़͠$MJFOU4.4ૹ৴֎෦"1*ϏδωεϩδοΫӬଓԽॲཧ
•ModelԼ͕ؔʹͳ͍ͬͯΔՕॴ͕ଟ͍•໊͕ؔ͘ͳͬͯ͠·͏•GetConsumerByPhoneNumber, UpdateSettlementToXXX…•ؔͳͷͰͲͷService͔ΒͰݺͼग़ͤͯ͠·͏• mockԽ͕εϚʔτʹͰ͖ͳ͍•Modelͷίʔυ͕ଟ͘ͳ͖ͬͯͨ•Model͕domaininfraͷׂΛ୲͍ͬͯΔ•ӬଓԽͷॲཧͱυϝΠϯϩδοΫ͕Ͱ͖͍ͯͳ͍
•ίʔυྔ͕૿͖͑ͯͯɺϝϯςͮ͠Β͍Օॴ͕ग़͖ͯͨ•υϝΠϯϩδοΫͱӬଓԽॲཧΛ͚Δ͜ͱͰؔ৺ࣄͷΛߦ͍͍ͨͳͥΞʔΩςΫνϟΛมߋ͍ͨ͠ͷ͔
৽͍͠ΞʔΩςΫνϟ(Ծ)$POUSPMMFS%PNBJO4FSWJDF.PEFM3FQPTJUPSZݺͼग़͠$MJFOU4.4ૹ৴֎෦"1*ϏδωεϩδοΫ3FQPTJUPSZ*OUFSGBDF%#Ϟσϧ3FQPTJUPSZ࣮2VFSZ4FSWJDF*OUFSGBDF2VFSZ4FSWJDF࣮ࢀরܥϞσϧυϝΠϯϞσϧ
• υϝΠϯϞσϧ• ϏδωεϩδοΫ• RepositoryͷinterfaceDomain$POUSPMMFS%PNBJO4FSWJDF.PEFM3FQPTJUPSZݺͼग़͠ϏδωεϩδοΫ3FQPTJUPSZ*OUFSGBDF%#Ϟσϧ3FQPTJUPSZ࣮2VFSZ4FSWJDF*OUFSGBDF2VFSZ4FSWJDF࣮ࢀরܥϞσϧυϝΠϯϞσϧ
domain/consumer/repository.go
services/consumer.go
• DBϞσϧ• Repositoryͷ࣮• υϝΠϯϞσϧ 㲗 DBϞσϧ• Query Serviceͷ࣮Model$POUSPMMFS%PNBJO4FSWJDF.PEFM3FQPTJUPSZݺͼग़͠ϏδωεϩδοΫ3FQPTJUPSZ*OUFSGBDF%#Ϟσϧ3FQPTJUPSZ࣮2VFSZ4FSWJDF*OUFSGBDF2VFSZ4FSWJDF࣮ࢀরܥϞσϧυϝΠϯϞσϧ
• ෳूʹ·͕ͨΔσʔλΛऔಘ͢ΔͨΊʹಋೖ• ServiceʹࢀরܥϞσϧɺinterfaceΛఆٛ• interfaceͷ࣮Modelʹஔ͘Query Service$POUSPMMFS%PNBJO4FSWJDF.PEFM3FQPTJUPSZݺͼग़͠ϏδωεϩδοΫ3FQPTJUPSZ*OUFSGBDF%#Ϟσϧ3FQPTJUPSZ࣮2VFSZ4FSWJDF*OUFSGBDF2VFSZ4FSWJDF࣮ࢀরܥϞσϧυϝΠϯϞσϧ
• ৽نػೳՃΛࢭΊͣʹ͍͍ײ͡ʹϦϑΝΫλΛਐΊ͍ͯ͘ʹ• ෳRepositoryʹ·͕ͨΔτϥϯβΫγϣϯ• ServiceͰτϥϯβΫγϣϯுΔ͔͠ͳ͍…ʁ• ίʔυྔ͕૿͑ͯ͘ΔͱMVCͩͱͭΒ͍…ͱࢥ͏Έ
• RepositoryͷಋೖʹΑΓӬଓԽॲཧͱυϝΠϯϩδοΫͷΛߦ͏͜ͱʹͨ͠• Query ServiceΛ࡞ͯ͠ෳूʹ·͕ͨΔσʔλΛऔಘ͢Δ͜ͱʹͨ͠• DDDCQRSΛಋೖ͢Δ͜ͱ͕తͰͳ͍͕ɺΑΓ҆શͰϝϯς͍͢͠ίʔυΛࢦͨ݁͠Ռ͜ΕΒΛऔΓೖΕ͍ͨͱࢥͬͨ·ͱΊ