https://ginzarb.github.io/kaigi01/
Spring Frameworkͱൺֱֶͯ͠Ϳɺ WebΞϓϦέʔγϣϯϑϨʔϜϫʔΫͷׂ͗Μ͟Rubyձٞ 01 2017-08-05@onigra_
View Slide
Yudai Suzuki / ླ༤େ@onigra_onigra
͜ͷΛ͢Δʹ͋ͨͬͯ• ϓϩάϥϚʔͱͯ͠ࣄ͢Δ্Ͱɺ ॳΊͯͪΌΜͱֶΜͩͷ͕Ruby• ࣄͰ͏Web Application Frameworkɺ΄ͱΜͲRailsͩͬͨ
Railsʹֶ͍ͭͯΜͰߦ͘͏ͪʹ• ใΛूΊͯΈΔͱɺRailsʹׂͱ ൷͕ଟ͍͜ͱʹؾͮ͘
ྫ• MVCͷఆٛʹ͍ͭͯ• ActiveRecord
ͳΔ΄Ͳ
ࠓͷ4݄ʹస৬
http://rubykaigi.org/2017/sponsors• http://rubykaigi.org/2017/sponsors
స৬ͯ͠ Java + Spring Frameworkʹ৮ΕΔ• ਖ਼֬ʹSpring Boot• Spring BootɺSpring Frameworkͷ͍͔ͭ͘ͷϞδϡʔϧΛ౷߹ͯ͠ɺWebΞϓϦέʔγϣϯΛߏஙͨ͘͢͠͠ͷ
Spring FrameworkΛ௨͠൷ͷ༰Λ վΊͯཧղ͢Δ
͜ͷൃදͷதͰ͍͑ͨ͜ͱ• ࢲͷΑ͏ʹɺϓϩάϥϛϯάWeb։ൃΛRubyɺRails͔Β͡Ίͨํʑʹɺ ҟͳΔݴޠͷϑϨʔϜϫʔΫͷ ઃܭࢥύϥμΠϜʹ৮ΕΔ͜ͱʹΑΓɺ৽͍͠ݟΛಘΔػձʹͳ͍͚ͬͯͨͩΕ͍Ͱ͢
ҙ• ຊൃදͰপʹೖΓࠐΉͷΛආ͚ΔͨΊɺҎԼʹ͍ͭͯ ਂ͘౿ΈࠐΜͩ͠·ͤΜ• υϝΠϯۦಈઃܭ(DDD)• ΤϯλʔϓϥΠζΞϓϦέʔγϣϯΞʔΩςΫνϟύλʔϯ(PofEAA)• ͋͘·ͰRuby on RailsͱSpring Frameworkͷػೳͷൺֱͱ͍͏؍Ͱ͓͠·͢
ࠂ
גࣜձࣾΤεΤϜΤεͰɺษڧձͷձఏڙΛ͡Ί·͢• ࠷େͰ136໊·Ͱऩ༰ՄೳͳձΛఏڙͰ͖·͢• ৄࡉ@onigra_·Ͱ͓͍߹Θ͍ͤͩ͘͞• ॴେ(ࣳެԂ)• https://twitter.com/onigra_
Elastic LeadershipͷΠϕϯτΓ·͢• ฐࣾͨͳ͢ͳ͓(@sunaot)͕ΤοηΠΛدߘͨ͠ɺElastic LeadershipͷΠϕϯτΛߦ͍·͢• ήετʹϨδϟϦʔϫʔΫε߹ಉձࣾͷShinichiro OGAWA(@conceal_rs)͞ΜΛ͓ট͖͠·͢• ͪ͜Βৄࡉ͕ܾ·Γ࣍ୈɺSNSʹͯࠂ͠·͢
σʔλΞΫηε
σʔλΞΫηε• Spring FrameworkʹɺRDBMSͷσʔλӬଓԽʹΞΫηε͢ΔͨΊͷϥΠϒϥϦͱͯ͠ɺSpring Data͕ଘࡏ͢Δ• Spring DataɺRDBMSҎ֎ͷσʔλιʔεʹରԠ࣮͕ͨ͠ଘࡏ͢Δ
Spring Data• https://projects.spring.io/spring-data/• MongoDB• LDAP• ֎෦Web API• Redis• Elasticsearch• etc…
Repository• Spring Core͕ఏڙ͍ͯ͠Δ• υϝΠϯΦϒδΣΫτͱσʔλΞΫηεͷ࣮Λ্ͨ͠ͰɺRepositoryͦΕΒͷհΛߦ͏• Spring Core͕ఏڙ͢ΔRepositoryʹର͠ɺSpring DataͷΛTemplateͱݺͿ
ϑϨʔϜϫʔΫͱͯ͠ͷActiveRecordͷσϝϦοτ• ϞσϧͱDB͕ີ݁߹• Modelͱσʔλϕʔεઃܭ͕݁߹ͯ͠͠·͏• ΦϒδΣΫτ͕σʔλϕʔεςʔϒϧͱରԠ͍ͯ͠ΔͱActiveRecordඇৗʹ༗ޮ• σʔλϕʔεͷઃܭ͕ɺ͍͔ʹActiveRecordͰѻ͍͘͢͢ΔʹͲ͏͢Δ͔ɺͱ͍͏ํʹͳΓ͕ͪ
RepositoryͱTemplateΛ ༻͍࣮ͨ• Interfaceͷఆٛ• Interfaceʹର͠ɺσʔλιʔε͝ͱʹɺσʔλΞΫηεͷ۩ମతͳ࣮Λߦ͏
RepositoryͱTemplateΛ ༻͍࣮ͨ
Կ͕خ͍͔͠ʁ• RepositoryͰఆٛͨ͠ΠϯλʔϑΣʔεͱɺTemplateͷ࣮Λ͚Δ͜ͱʹΑͬͯɺ ϏδωεϩδοΫͱ࣮ͷ͕Ͱ͖Δ• σʔλΞΫηεͷ࣮ΛΓସ͑Δ͚ͩͰɺΞϓϦέʔγϣϯͷมߋ͕ྃ͢Δ• ϏδωεϩδοΫʹର࣮ͯ͠ͷมߋ͕༰қʹͳΔ
ActiveResource• ֎෦ͷWeb APIΛɺAcriveRecordΦϒδΣΫτͷΑ͏ʹѻ͏͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔgem• Rails2, 3ʹCoreʹ͕͋ͬͨɺ4Ͱ֎Εͨ
RubyͰRepository• rom-rb• http://rom-rb.org/• Ruby Object Mapper• HANAMIͷ෦Ͱ༻͞Ε͍ͯΔ• http://hanamirb.org/
Callbackͱ ΞεϖΫτࢦϓϩάϥϛϯά
ΞεϖΫτࢦϓϩάϥϛϯάͱʁ• Aspect Oriented Programming• ΦϒδΣΫτͷ୯ҐͰ͏·͘Ͱ͖ͳ͍ɺ ΦϒδΣΫτؒΛ·͙ͨػೳΛʮہ໘ʯͱ͍͏ ୯Ґ͝ͱʹϞδϡʔϧԽ͢ΔϓϩάϥϛϯάύϥμΠϜ• ΦϒδΣΫτؒΛ·͙ͨػೳͷ͜ͱΛ ʮCrosscutting Concern(ԣஅతؔ৺ࣄ)ʯͱݺͿ
Crosscutting Concernͷྫ• Logging• Caching• Error Handling• Transaction
ΞεϖΫτࢦϓϩάϥϛϯάͰ༻͍ΒΕΔ༻ޠ• Join Point• ΞϓϦέʔγϣϯ࣮ߦதͷɺ͋Δಛఆͷʮ࣌ʯΛࢦ͢• Advice• Join PointͰ࣮ߦ͞ΕΔॲཧ• Pointcut• Join Pointͷఆٛ
Spring AOP
Spring AOPͷ͍ํ• Join PointΛܾΊͯPointcutͱͯ͠ఆٛ͠ɺPointcutͰߦ͏࣮ॲཧͰ͋ΔAdviceΛఆٛ͢Δ• ಛఆͷΫϥεͷಛఆͷϝιου͕࣮ߦ͞ΕΔલޙʹɺ࣮ߦ͢ΔॲཧΛఆٛ͢Δ
Pointcutͷఆٛ@Aspectpublic class RepositoryPointcut {// UserRepositoryͷsaveϝιου͕࣮ߦ͞ΕΔ࣌(Join Point)ΛPointcutͱͯ͠ఆٛ@Pointcut("execution(* com.onigra.springaopsample.repository..UserRepository+.save(..))")public void save() {}}
Adviceͷఆٛ@Aspect@Componentpublic class LoggingAdvice {private static final Logger LOGGER = LoggerFactory.getLogger(LoggingAdvice.class);@Before(“com.onigra.springaopsample.aspect.UserPointcut.save()")public void beforeSave(JoinPoint joinPoint) {LOGGER.info("UserRepositoryͷsaveϝιου࣮ߦલʹϩάΛग़ྗ͢Δ");}}
RailsͰݴ͏ͱCallback͔ͳ
AOPͱCallbackࣅͯඇͳΔͷ
RailsͷCallback• ActiveSupport::Callbacks#run_callbacksʹ ϒϩοΫΛ͢͜ͱͰ࣮ݱ• Rubyͷݴޠͱͯ͠ͷػೳΛར༻͍ͯ͠Δ
Spring AOP• όΠτίʔυม• ίϯύΠϧޙͷόΠφϦΛվม͠ɺॲཧΛࠩ͠ࠐΉ
TransactionͰͷAOP• RailsɺActiveRecord::Transactions.transactionʹϒϩοΫΛ͢• Spring FrameworkɺTransactionΛ͔͚͍ͨ ϝιουʹର͠ɺTransactionalΞϊςʔγϣϯ(Ճใ)Λ༩• RailsͷΑ͏ʹɺϓϩάϥϜͷதͰ੍ޚΛߦ͏ํ๏ʹର͠ɺʮಛఆͷϝιουͷ࣮ߦ࣌ʹτϥϯβΫγϣϯΛ͔͚Δʯͱ͍͏ એݴΛߦ͏͜ͱΛɺʮએݴతτϥϯβΫγϣϯʯͱݺͿ• ※ϓϩάϥϛϯάʹΑΔτϥϯβΫγϣϯཧͰ͖Δ
MVCͱϨΠϠʔυΞʔΩςΫνϟ
ΞϓϦέʔγϣϯͷϨΠϠʔԽͷͱMVC(MVC2, MVC Model2)ͷશ͘ผͷʂʂʂ
RailsͷׂͷɺΞϓϦέʔγϣϯͷϨΠϠʔԽͷͱɺMVCͷ͕ࠞͬͯ͟͠·͍ͬͯΔʢ͜ͱ͕ଟ͍ؾ͕͢Δʣ
͞Βʹͦ͜ʹDDDʹ͓͚ΔαʔϏεͱPofEAAͷαʔϏεͷ͕ࠞͬͯ͟େมͳ͜ͱʹ…
ΞϓϦέʔγϣϯઃܭʹ͓͚ΔϨΠϠͷ֓೦ͱ• ݩClient-Server Modelͷߟ͑ํ• Webʹߟ͑ํ͕Ԡ༻͞Εɺൃల͖ͯͨ͠• ͔͠͠ɺΞʔΩςΫνϟจݙʹΑ༷ͬͯʑͳϨΠϠʔͷ໊শ͕ଘࡏ͢ΔͷͰҙ͕ඞཁ
ΫϥΠΞϯταʔόϞσϧʹ͓͚Δ3ΞʔΩςΫνϟ• ϓϨθϯςʔγϣϯ: UI• ΞϓϦέʔγϣϯ: ϏδωεϩδοΫ• σʔλ: σʔλΞΫηε
PofEAAʹ͓͚Δ3ΞʔΩςΫνϟ• ϓϨθϯςʔγϣϯ: UI• υϝΠϯ: ϏδωεϩδοΫ• σʔλιʔε: σʔλΞΫηε
͜ͷجຊͱͳΔ3Ͱߟ͑ͯݟΔ
Spring Framework• ϓϨθϯςʔγϣϯ• View(Template Engine(ThymeLeaf))• Controller(Spring MVC)• υϝΠϯ• Service(Spring Core)• Repository(Spring Core)• σʔλιʔε• Template(Spring Data)• ͦΕͧΕͷ͔ΒModelΛѻ͏
Spring Frameworkhttps://yo1000.gitbooks.io/self-study-spring/content/chapter1.html
Ruby on Rails• ϓϨθϯςʔγϣϯ• View(ActionView, View Template Engine(ERB))• Controller(ActionController)• υϝΠϯ• Model(ActiveRecord, ActiveModel)• σʔλιʔε• Model(ActiveRecord)
༷ʑͳϨΠϠʔԽͷύλʔϯ͕ଘࡏ͢Δ• ΞϓϦέʔγϣϯʹΑͬͯɺదͳϨΠϠԽҟͳΔ• จ຺ΞʔΩςΫνϟʹΑͬͯɺ໊শ͕ඃͬͨΓҟͳͬͨΓ૿͑ͨΓ͢Δͷʹҙ• ϨΠϠͷҙຯΛཧղ͠ɺదͳϨΠϠΛબ͠Α͏
·ͱΊ
2ͭͷϑϨʔϜϫʔΫΛ ൺֱͯ͠• RailsϢʔεέʔεΛߜͬͯɺׂΓͬͨઃܭʹ͍ͯ͠Δ• ͦͷɺϚον͠ͳ͍Ϗδωεཁ݅ʹΑͬͯɺਏΈવग़Δ• Spring Frameworkɺ͡Ί͔Β͍ϢʔεέʔεʹରԠ͢Δ͜ͱΛࢦ͍ͯ͠Δ• ෳࡶͳϏδωεཁ݅ɺظతͳ֦ுͷՄೳੑΛߟ͑ΔͱɺSpring Framework༏Εͨબࢶ• ҰํͰɺ͋Β͔͡Ίཧղ͓͖ͯ͘͠จ຺ɺ͕ࣝଟ͍
2ͭͷϑϨʔϜϫʔΫΛ ൺֱͯ͠• ઃܭͷ෯Λ٘ਜ਼ʹͭͭ͠ɺ֮͑Δ͜ͱΛݮΒͯ͠։ൃΛ্͛Δ͜ͱ͕Ͱ͖ΔActiveRecordΓศར• ໊শɺจ຺Λཧղ্ͨ͠ͰΞʔΩςΫνϟύλʔϯΛ͍͜ͳ͢ͷେม͔ͩΒɺେʹMVCͱ͍͏ྨΛͨ͠ͷͰʁ• ͦ͏ߟ͑ΔͱDHHϚδͰ͍͢͝…
ฏຌͳ݁Ͱ͕͢• ͲͪΒͷํ͕༏Ε͍ͯΔͱ͍͏Ͱͳ͘ɺϑϨʔϜϫʔΫΞʔΩςΫνϟͷࢥͱ ϢʔεέʔεΛཧղ͠ɺదͳٕज़બఆΛ͍͖ͯ͠·͠ΐ͏
ҟͳΔݴޠͷϑϨʔϜϫʔΫઃܭࢥʹ৮ΕΔ͜ͱɺઃܭͷ෯Λ͛Δ͜ͱʹͭͳ͕Δ