Slide 1

Slide 1 text

Spring Frameworkͱൺֱֶͯ͠Ϳɺ
 WebΞϓϦέʔγϣϯϑϨʔϜϫʔΫͷ ੹຿෼ׂ ͗Μ͟Rubyձٞ 01 2017-08-05 @onigra_

Slide 2

Slide 2 text

Yudai Suzuki / ླ໦༤େ @onigra_ onigra

Slide 3

Slide 3 text

͜ͷ࿩Λ͢Δʹ͋ͨͬͯ • ϓϩάϥϚʔͱͯ͠࢓ࣄ͢Δ্Ͱɺ
 ॳΊͯͪΌΜͱֶΜͩͷ͕Ruby • ࢓ࣄͰ࢖͏Web Application Framework͸ɺ ΄ͱΜͲRailsͩͬͨ

Slide 4

Slide 4 text

Railsʹֶ͍ͭͯΜͰߦ͘͏ͪʹ • ৘ใΛूΊͯΈΔͱɺRailsʹ͸ׂͱ
 ൷൑͕ଟ͍͜ͱʹؾͮ͘

Slide 5

Slide 5 text

ྫ • MVCͷఆٛʹ͍ͭͯ • ActiveRecord

Slide 6

Slide 6 text

ͳΔ΄Ͳ

Slide 7

Slide 7 text

ࠓ೥ͷ4݄ʹస৬

Slide 8

Slide 8 text

http://rubykaigi.org/2017/sponsors • http://rubykaigi.org/2017/sponsors

Slide 9

Slide 9 text

స৬ͯ͠
 Java + Spring Frameworkʹ৮ΕΔ • ਖ਼֬ʹ͸Spring Boot • Spring Boot͸ɺSpring Frameworkͷ͍ͭ͘ ͔ͷϞδϡʔϧΛ౷߹ͯ͠ɺWebΞϓϦ έʔγϣϯΛߏங͠΍ͨ͘͢͠΋ͷ

Slide 10

Slide 10 text

Spring FrameworkΛ௨͠ ൷൑ͷ಺༰Λ
 վΊͯཧղ͢Δ

Slide 11

Slide 11 text

͜ͷൃදͷதͰ఻͍͑ͨ͜ͱ • ࢲͷΑ͏ʹɺϓϩάϥϛϯά΍Web։ൃΛ RubyɺRails͔Β͸͡Ίͨํʑʹɺ
 ҟͳΔݴޠͷϑϨʔϜϫʔΫͷ
 ઃܭࢥ૝΍ύϥμΠϜʹ৮ΕΔ͜ͱʹΑΓɺ ৽͍͠஌ݟΛಘΔػձʹͳ͍͚ͬͯͨͩΕ͹ ޾͍Ͱ͢

Slide 12

Slide 12 text

஫ҙ • ຊൃදͰ͸পʹೖΓࠐΉͷΛආ͚ΔͨΊɺҎԼʹ͍ͭͯ
 ਂ͘౿ΈࠐΜͩ࿩͸͠·ͤΜ • υϝΠϯۦಈઃܭ(DDD) • ΤϯλʔϓϥΠζΞϓϦέʔγϣϯΞʔΩςΫνϟύλʔ ϯ(PofEAA) • ͋͘·ͰRuby on RailsͱSpring Frameworkͷػೳͷൺֱͱ ͍͏؍఺Ͱ͓࿩͠·͢

Slide 13

Slide 13 text

ࠂ஌

Slide 14

Slide 14 text

גࣜձࣾΤεΤϜΤεͰ͸ɺ ษڧձͷձ৔ఏڙΛ͸͡Ί·͢ • ࠷େͰ136໊·Ͱऩ༰Մೳͳձ৔ΛఏڙͰ͖· ͢ • ৄࡉ͸@onigra_·Ͱ͓໰͍߹Θ͍ͤͩ͘͞ • ৔ॴ͸େ໳(ࣳެԂ) • https://twitter.com/onigra_

Slide 15

Slide 15 text

Elastic Leadershipͷ Πϕϯτ΍Γ·͢ • ฐࣾͨͳ΂͢ͳ͓(@sunaot)͕ΤοηΠΛدߘ͠ ͨɺElastic LeadershipͷΠϕϯτΛߦ͍·͢ • ήετʹϨδϟϦʔϫʔΫε߹ಉձࣾͷ Shinichiro OGAWA(@conceal_rs)͞ΜΛ͓ট͖͠ ·͢ • ͪ͜Β΋ৄࡉ͕ܾ·Γ࣍ୈɺSNSʹͯࠂ஌͠·͢

Slide 16

Slide 16 text

σʔλΞΫηε

Slide 17

Slide 17 text

σʔλΞΫηε • Spring Frameworkʹ͸ɺRDBMS౳ͷσʔλ ӬଓԽ૚ʹΞΫηε͢ΔͨΊͷϥΠϒϥϦͱ ͯ͠ɺSpring Data͕ଘࡏ͢Δ • Spring Data͸ɺRDBMSҎ֎ͷσʔλιʔε ʹରԠ࣮ͨ͠૷͕ଘࡏ͢Δ

Slide 18

Slide 18 text

Spring Data • https://projects.spring.io/spring-data/ • MongoDB • LDAP • ֎෦Web API • Redis • Elasticsearch • etc…

Slide 19

Slide 19 text

Repository • Spring Core͕ఏڙ͍ͯ͠Δ • υϝΠϯΦϒδΣΫτͱσʔλΞΫηεͷ࣮૷Λ ෼཭্ͨ͠ͰɺRepository͸ͦΕΒͷ஥հΛߦ͏ • Spring Core͕ఏڙ͢ΔRepositoryʹର͠ɺ Spring Dataͷ੹຿ΛTemplateͱݺͿ

Slide 20

Slide 20 text

ϑϨʔϜϫʔΫͱͯ͠ͷ ActiveRecordͷσϝϦοτ • ϞσϧͱDB͕ີ݁߹ • Modelͱσʔλϕʔεઃܭ͕݁߹ͯ͠͠·͏ • ΦϒδΣΫτ͕σʔλϕʔεςʔϒϧͱ௚઀ରԠ͠ ͍ͯΔͱActiveRecord͸ඇৗʹ༗ޮ • σʔλϕʔεͷઃܭ͕ɺ͍͔ʹActiveRecordͰѻ͍ ΍͘͢͢Δʹ͸Ͳ͏͢Δ͔ɺͱ͍͏ํ޲ʹͳΓ͕ͪ

Slide 21

Slide 21 text

RepositoryͱTemplateΛ
 ༻͍࣮ͨ૷ • Interfaceͷఆٛ • Interfaceʹର͠ɺσʔλιʔε͝ͱʹɺσʔ λΞΫηεͷ۩ମతͳ࣮૷Λߦ͏

Slide 22

Slide 22 text

RepositoryͱTemplateΛ
 ༻͍࣮ͨ૷

Slide 23

Slide 23 text

Կ͕خ͍͔͠ʁ • RepositoryͰఆٛͨ͠ΠϯλʔϑΣʔεͱɺ Templateͷ࣮૷Λ෼͚Δ͜ͱʹΑͬͯɺ
 ϏδωεϩδοΫͱ࣮૷ͷ෼཭͕Ͱ͖Δ • σʔλΞΫηε૚ͷ࣮૷Λ੾Γସ͑Δ͚ͩͰɺΞϓ Ϧέʔγϣϯͷมߋ͕׬ྃ͢Δ • ϏδωεϩδοΫʹର࣮ͯ͠૷ͷมߋ͕༰қʹͳΔ

Slide 24

Slide 24 text

ActiveResource • ֎෦ͷWeb APIΛɺAcriveRecordΦϒδΣΫ τͷΑ͏ʹѻ͏͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔgem • Rails2, 3ʹ͸Coreʹ͕͋ͬͨɺ4Ͱ֎Εͨ

Slide 25

Slide 25 text

RubyͰRepository • rom-rb • http://rom-rb.org/ • Ruby Object Mapper • HANAMIͷ಺෦Ͱ࢖༻͞Ε͍ͯΔ • http://hanamirb.org/

Slide 26

Slide 26 text

Callbackͱ
 ΞεϖΫτࢦ޲ϓϩάϥϛϯά

Slide 27

Slide 27 text

ΞεϖΫτࢦ޲ϓϩάϥϛϯά ͱ͸ʁ • Aspect Oriented Programming • ΦϒδΣΫτͷ୯ҐͰ͸͏·͘෼཭Ͱ͖ͳ͍ɺ
 ΦϒδΣΫτؒΛ·͙ͨػೳΛʮہ໘ʯͱ͍͏
 ୯Ґ͝ͱʹϞδϡʔϧԽ͢ΔϓϩάϥϛϯάύϥμΠ Ϝ • ΦϒδΣΫτؒΛ·͙ͨػೳͷ͜ͱΛ
 ʮCrosscutting Concern(ԣஅతؔ৺ࣄ)ʯͱݺͿ

Slide 28

Slide 28 text

Crosscutting Concernͷྫ • Logging • Caching • Error Handling • Transaction

Slide 29

Slide 29 text

ΞεϖΫτࢦ޲ϓϩάϥϛϯά Ͱ༻͍ΒΕΔ༻ޠ • Join Point • ΞϓϦέʔγϣϯ࣮ߦதͷɺ͋Δಛఆͷʮ࣌఺ʯΛࢦ͢ • Advice • Join PointͰ࣮ߦ͞ΕΔॲཧ • Pointcut • Join Pointͷఆٛ

Slide 30

Slide 30 text

Spring AOP

Slide 31

Slide 31 text

Spring AOPͷ࢖͍ํ • Join PointΛܾΊͯPointcutͱͯ͠ఆٛ͠ɺ PointcutͰߦ͏࣮ॲཧͰ͋ΔAdviceΛఆٛ͢ Δ • ಛఆͷΫϥεͷಛఆͷϝιου͕࣮ߦ͞ΕΔ લ΍ޙʹɺ࣮ߦ͢ΔॲཧΛఆٛ͢Δ

Slide 32

Slide 32 text

Pointcutͷఆٛ @Aspect public class RepositoryPointcut { // UserRepositoryͷsaveϝιου͕࣮ߦ͞ΕΔ࣌఺(Join Point)ΛPointcutͱͯ͠ఆٛ @Pointcut("execution(* com.onigra.springaopsample.repository..UserRepository+.save(..))") public void save() {} }

Slide 33

Slide 33 text

Adviceͷఆٛ @Aspect @Component public 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ϝιου࣮ߦલʹϩάΛग़ྗ͢Δ"); } }

Slide 34

Slide 34 text

RailsͰݴ͏ͱCallback͔ͳ

Slide 35

Slide 35 text

AOPͱCallback͸ ࣅͯඇͳΔ΋ͷ

Slide 36

Slide 36 text

RailsͷCallback • ActiveSupport::Callbacks#run_callbacksʹ
 ϒϩοΫΛ౉͢͜ͱͰ࣮ݱ • Rubyͷݴޠͱͯ͠ͷػೳΛར༻͍ͯ͠Δ

Slide 37

Slide 37 text

Spring AOP • όΠτίʔυม׵ • ίϯύΠϧޙͷόΠφϦΛվม͠ɺॲཧΛࠩ ͠ࠐΉ

Slide 38

Slide 38 text

TransactionͰͷAOP • Rails͸ɺActiveRecord::Transactions.transactionʹϒϩοΫΛ౉͢ • Spring Framework͸ɺTransactionΛ͔͚͍ͨ
 ϝιουʹର͠ɺTransactionalΞϊςʔγϣϯ(෇Ճ৘ใ)Λ෇༩ • RailsͷΑ͏ʹɺϓϩάϥϜͷதͰ੍ޚΛߦ͏ํ๏ʹର͠ɺʮಛఆ ͷϝιουͷ࣮ߦ࣌ʹτϥϯβΫγϣϯΛ͔͚Δʯͱ͍͏
 એݴΛߦ͏͜ͱΛɺʮએݴతτϥϯβΫγϣϯʯͱݺͿ • ※ϓϩάϥϛϯάʹΑΔτϥϯβΫγϣϯ؅ཧ΋Ͱ͖Δ

Slide 39

Slide 39 text

MVCͱ ϨΠϠʔυΞʔΩςΫνϟ

Slide 40

Slide 40 text

ΞϓϦέʔγϣϯͷ ϨΠϠʔԽͷ࿩ͱ MVC(MVC2, MVC Model2)ͷ࿩͸ શ͘ผͷ࿩ʂʂʂ

Slide 41

Slide 41 text

Railsͷ੹຿෼ׂͷ࿩͸ɺ ΞϓϦέʔγϣϯͷϨΠϠʔԽͷ࿩ͱɺ MVCͷ࿩͕ࠞͬͯ͟͠·͍ͬͯΔ ʢ͜ͱ͕ଟ͍ؾ͕͢Δʣ

Slide 42

Slide 42 text

͞Βʹͦ͜ʹDDDʹ͓͚ΔαʔϏεͱ PofEAAͷαʔϏεͷ࿩͕ࠞͬͯ͟ େมͳ͜ͱʹ…

Slide 43

Slide 43 text

ΞϓϦέʔγϣϯઃܭʹ͓͚Δ ϨΠϠͷ֓೦ͱ͸ • ݩ͸Client-Server Modelͷߟ͑ํ • Webʹ΋ߟ͑ํ͕Ԡ༻͞Εɺൃల͖ͯͨ͠ • ͔͠͠ɺΞʔΩςΫνϟ΍จݙʹΑ༷ͬͯʑ ͳϨΠϠʔͷ໊শ͕ଘࡏ͢ΔͷͰ஫ҙ͕ඞཁ

Slide 44

Slide 44 text

ΫϥΠΞϯταʔόϞσϧʹ͓ ͚Δ3૚ΞʔΩςΫνϟ • ϓϨθϯςʔγϣϯ: UI • ΞϓϦέʔγϣϯ: ϏδωεϩδοΫ • σʔλ: σʔλΞΫηε

Slide 45

Slide 45 text

PofEAAʹ͓͚Δ3૚ΞʔΩςΫ νϟ • ϓϨθϯςʔγϣϯ: UI • υϝΠϯ: ϏδωεϩδοΫ • σʔλιʔε: σʔλΞΫηε

Slide 46

Slide 46 text

͜ͷجຊͱͳΔ3૚Ͱ ߟ͑ͯݟΔ

Slide 47

Slide 47 text

Spring Framework • ϓϨθϯςʔγϣϯ • View(Template Engine(ThymeLeaf౳)) • Controller(Spring MVC) • υϝΠϯ • Service(Spring Core) • Repository(Spring Core) • σʔλιʔε • Template(Spring Data) • ͦΕͧΕͷ૚͔ΒModelΛѻ͏

Slide 48

Slide 48 text

Spring Framework https://yo1000.gitbooks.io/self-study-spring/content/chapter1.html

Slide 49

Slide 49 text

Ruby on Rails • ϓϨθϯςʔγϣϯ • View(ActionView, View Template Engine(ERB౳)) • Controller(ActionController) • υϝΠϯ • Model(ActiveRecord, ActiveModel) • σʔλιʔε • Model(ActiveRecord)

Slide 50

Slide 50 text

༷ʑͳϨΠϠʔԽͷύλʔϯ͕ ଘࡏ͢Δ • ΞϓϦέʔγϣϯʹΑͬͯɺద੾ͳϨΠϠԽ ͸ҟͳΔ • จ຺΍ΞʔΩςΫνϟʹΑͬͯɺ໊শ͕ඃͬ ͨΓҟͳͬͨΓ૿͑ͨΓ͢Δͷʹ஫ҙ • ϨΠϠͷҙຯΛཧղ͠ɺద੾ͳϨΠϠΛબ୒ ͠Α͏

Slide 51

Slide 51 text

·ͱΊ

Slide 52

Slide 52 text

2ͭͷϑϨʔϜϫʔΫΛ
 ൺֱͯ͠ • Rails͸ϢʔεέʔεΛߜͬͯɺׂΓ੾ͬͨઃܭʹ͍ͯ͠Δ • ͦͷ෼ɺϚον͠ͳ͍Ϗδωεཁ݅ʹΑͬͯɺਏΈ͸౰વग़Δ • Spring Framework͸ɺ͸͡Ί͔Β޿͍ϢʔεέʔεʹରԠ͢Δ ͜ͱΛ໨ࢦ͍ͯ͠Δ • ෳࡶͳϏδωεཁ݅΍ɺ௕ظతͳ֦ுͷՄೳੑΛߟ͑Δͱɺ Spring Framework͸༏Εͨબ୒ࢶ • ҰํͰɺ͋Β͔͡Ίཧղ͓ͯ͘͠΂͖จ຺ɺ஌͕ࣝଟ͍

Slide 53

Slide 53 text

2ͭͷϑϨʔϜϫʔΫΛ
 ൺֱͯ͠ • ઃܭͷ෯Λ٘ਜ਼ʹͭͭ͠΋ɺ֮͑Δ͜ͱΛݮΒͯ͠։ ൃ଎౓Λ্͛Δ͜ͱ͕Ͱ͖ΔActiveRecord͸΍͸Γศ ར • ੹຿΍໊শɺจ຺Λཧղ্ͨ͠ͰΞʔΩςΫνϟύλʔ ϯΛ࢖͍͜ͳ͢ͷ͸େม͔ͩΒɺେ୾ʹMVCͱ͍͏෼ ྨΛͨ͠ͷͰ͸ʁ • ͦ͏ߟ͑ΔͱDHHϚδͰ͍͢͝…

Slide 54

Slide 54 text

ฏຌͳ݁࿦Ͱ͕͢ • ͲͪΒͷํ͕༏Ε͍ͯΔͱ͍͏࿩Ͱ͸ͳ͘ɺ ϑϨʔϜϫʔΫ΍ΞʔΩςΫνϟͷࢥ૝ͱ
 ϢʔεέʔεΛཧղ͠ɺద੾ͳٕज़બఆΛͯ͠ ͍͖·͠ΐ͏

Slide 55

Slide 55 text

ҟͳΔݴޠͷϑϨʔϜϫʔΫ΍ ઃܭࢥ૝ʹ৮ΕΔ͜ͱ͸ɺ ઃܭͷ෯Λ޿͛Δ͜ͱʹͭͳ͕Δ