Slide 1

Slide 1 text

SpringBootͱMyBatisͰ σʔλϕʔεΛՄࢹԽ͢Δ 2017/11/18 JJUG CCC 2017 Fall #ccc_l1 1

Slide 2

Slide 2 text

ࣗݾ঺հ @su_kun_1899 PaDDΤϯδχΞɻϞϒϓϩά ϥϚɻΤϞ࿮ɻ৺͸͍ͭͰ΋ εΫϥϜϚελʔɻ web/java/agile/scrum גࣜձࣾΤεɾΤϜɾΤεͰ հޢࣄۀॴ޲͚ͷWebαʔϏ ε։ൃͯ͠·͢ɻ 2

Slide 3

Slide 3 text

ϑΟʔυόοΫԼ͍͞ #ccc_l1 3

Slide 4

Slide 4 text

Introduction 4

Slide 5

Slide 5 text

։ൃͯ͠Δ࣌Կݟͯ·͔͢ʁ 5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

DBఆٛͬͯͲ͏΍ͬͯ֬ೝͯ͠·͔͢ʁ 7

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

shishamoͱ͍͏πʔϧΛ࡞Γ·ͨ͠ https://github.com/su-kun1899/shishamo 9

Slide 10

Slide 10 text

shishamo? • MySQLͷϝλ৘ใΛՄࢹԽ͢ΔWebΞϓϦέ ʔγϣϯ • ΦϯϥΠϯͰInformation SchemaʹΫΤϦΛ ൃߦ͢Δ • ͠͠Ό΋͸ΠϧΧͷ㕒Β͍͠ͷͰɺMySQLͷ Ϛείοτʹ͋΍໋໊͔ͬͯ 10

Slide 11

Slide 11 text

demo 11

Slide 12

Slide 12 text

ഥखͲ͏ͧ 12

Slide 13

Slide 13 text

վΊ·ͯ͠ 13

Slide 14

Slide 14 text

SpringBootͱMyBatisͰ σʔλϕʔεΛՄࢹԽ͢Δ 2017/11/18 JJUG CCC 2017 Fall #ccc_l1 14

Slide 15

Slide 15 text

ࠓ೔࿩͢͜ͱ • લ൒ • ϨΨγʔγεςϜͱσʔλߏ଄ͷՄࢹԽ • shishamoͱ͍͏WebΞϓϦͷ঺հ • ޙ൒ • shishamoΛࢧ͑Δٕज़ • Spring Boot • MyBatis • Spock ※͋·Γٕज़Λਂ۷Γͨ͠࿩͸͠·ͤΜɻԿ͔Λ࢝ΊΔ͖͔͚ͬ΍ώϯτͱ͠ ͯॿ͚ʹͳΕ͹ɻ 15

Slide 16

Slide 16 text

shishamo͸ϨΨγʔγεςϜͱઓ͏ͨΊʹੜ·Ε·ͨ͠ 16

Slide 17

Slide 17 text

ϨΨγʔγεςϜʁ • ෳࡶʹංେԽ • ෆे෼ͳߏ੒؅ཧ • ࠶ݱੑͷͳ͍؀ڥ • ੔උ͞Ε͍ͯͳ͍ςετ • ࣦΘΕͨʢαϙʔτͷ੾Εͨʣٕज़ • etc 17

Slide 18

Slide 18 text

ཁ͸ Α͘෼͔Βͳ͍͠ɺͲ͔ͬΛ͍ͬͨ͡ΒͲ͔͕ͬ յΕͦ͏ͳγεςϜ ʢ΋͔ͨ͠͠Β΋͏յΕͯΔͷ͔΋ɻɻʣ 18

Slide 19

Slide 19 text

Ͳ͏ઓ͏͔ʁ — Α͘෼͔Βͳ͍΋ͷΛ෼͔ΔΑ͏ʹ͢Δ 19

Slide 20

Slide 20 text

σʔλ͔Β੾ΓࠐΉ • γεςϜ͸ଟ͘ͷ৔߹ΠϯϓοτͱΞ΢τϓο τͰ੒Γཱͭ • σʔλ͕γεςϜͷ੒Ռ෺Ͱ͋Δ͜ͱ͕ଟ͍ • ΞϓϦέʔγϣϯʹ͸ઃܭ΍ࢥ૝͕ݱΕΔ • ઃܭ͕࿪ΜͰ͍Δ৔߹ɺ͔͑ͬͯϊΠζʹ ͳΔ͜ͱ͕ଟ͍ 20

Slide 21

Slide 21 text

ʮ࠷ऴతʹ࣮ݱ͍ͨ͜͠ͱʯ͸ σʔλʹදΕ͍ͯΔ͜ͱ͕ଟ͍ 21

Slide 22

Slide 22 text

Ͳ͏ઓ͏͔ʁ — σʔλߏ଄Λ཈͑Δ 22

Slide 23

Slide 23 text

ͦ͏ͩɺERਤͩ 23

Slide 24

Slide 24 text

ΤϯςΟςΟఆٛॻ.xlsm • 1000Ҏ্ͷΦϒδΣΫτ͕ҰͭͷϒοΫ ʹɻɻ • Ұ෦࠷৽Ͱͳ͍΋ͷ͕͋Γ·͢ • Ұ෦ѻ͍ͬͯͳ͍ςʔϒϧ͕͋Γ·͢ • Ұ෦(ry 24

Slide 25

Slide 25 text

υΩϡϝϯτ͸ݹ͘ͳΔ • υΩϡϝϯτ͸ݩʑγεςϜ։ൃͷΠϯϓοτ ʢઃܭॻʣͱͯ͠ͷ໾ׂ͕େ͖͔ͬͨ • γεςϜ͸ΑΓҭͯΔ΋ͷ΁ͱγϑτ͍ͯ͠Δ • ϦϦʔεαΠΫϧ্͕͕ΔҰํͷதɺγεςϜ ʹ௥ै͍ͯ͘͜͠ͱ͸ߴίετ • ͦͯ͠ஔ͍͍͔ͯΕΔɻɻ 25

Slide 26

Slide 26 text

৴͡ΒΕΔͷ͸ ίʔυ͚ͩ — ࠓͲ͏ͳ͍ͬͯΔ͔ɺ͕།Ұͷਅ࣮ 26

Slide 27

Slide 27 text

Ͱ΋౎౓DBߏ଄Λ֬ೝ͢Δͷ͸πϥΠɻɻ show create table hoge_table; 27

Slide 28

Slide 28 text

Ͳ͏΍Β • γεςϜ։ൃͰ͸σʔλߏ଄Λ཈͑Δͷ͕ॏཁ ʢΆ͍ʣ • υΩϡϝϯτͰදݱ͢Δͷ͸ߴίετʢΆ͍ʣ • Ͳ͏΍ͬͯσʔλߏ଄Λ཈͍͑ͯ͘ͷ͕͍͍ͩ Ζ͏͔ 28

Slide 29

Slide 29 text

σʔλߏ଄Λ Ͳ͏཈͑Δ͔ — ϝλ৘ใ͔Βσʔλߏ଄ΛՄࢹԽ͢Δ 29

Slide 30

Slide 30 text

Information Schema • table, view, column, procedureͷ৘ใΛಡΈऔΓઐ ༻Viewͱͯ͠ఏڙ • ඪ४SQLͰఆٛ͞Ε͍ͯΔ SELECT column_name, data_type, column_default, is_nullable FROM information_schema.columns WHERE table_name='alpha'; column_name | data_type | column_default | is_nullable -------------+-----------+----------------+------------- foo | integer | | YES bar | character | | YES (2 rows) https://en.wikipedia.org/wiki/Information_schema 30

Slide 31

Slide 31 text

SchemaSpy • ϚΠΫϩαʔϏεΞʔΩςΫνϟຊͰ஌ͬͨ • Information SchemaΛݩʹHTMLΛੜ੒ (ࢀߟ) https://qiita.com/su-kun1899/items/b106a1a643bf49df164d 31

Slide 32

Slide 32 text

SchemaSpy ΊͬͪΌΑ͍Ͱ͢ 32

Slide 33

Slide 33 text

SchemaSpyͷ໰୊఺ • HTMLੜ੒ʹΑΔλΠϜϥά • σϓϩΠ৔ॴ • S3ʹϗεςΟϯάͯͨ͠ • ฒྻίετ͕ߴΊ • ฒߦ։ൃͬͯී௨ʹ͋ΔΑͶɻɻ • ࠷৽͚ͩͰͳ͘։ൃதͷ΋ͷ΋ݟ͍ͨ • ଞͷERٯੜ੒πʔϧ΋େ֓ಉ༷ͷ໰୊ • MySQL Workbenchͱ͔ʢ͍͢͝ΜͰ͚͢ͲͶʣ 33

Slide 34

Slide 34 text

shishamo 34

Slide 35

Slide 35 text

shishamoͷڧΈ • ϦΞϧλΠϜʹϝλ৘ใΛՄࢹԽͰ͖Δ -> λΠϜϥά͕ͳ͍ • Java͑͋͞Ε͹Ͳ͜Ͱ΋ಈ͘ʢ΍΍ތு͚ͩͲʣ -> σϓϩΠ৔ॴΛબ͹ͳ͍ • खܰʹ૿΍ͤΔ -> ϩʔΧϧɺDevɺQAɺetc... 35

Slide 36

Slide 36 text

͙͢࢖͑Δ 1. git clone 2. Ҿ਺ʹ઀ଓઌDBΛࢦఆͯ͠boot:run 3. ϒϥ΢βΞΫηε $ git clone [email protected]:su-kun1899/shishamo.git $ cd shishamo/ $ ./mvnw spring-boot:run \ -Dspring.datasource.url= \ -Dspring.datasource.schema= \ -Dspring.datasource.username= \ -Dspring.datasource.password= 36

Slide 37

Slide 37 text

Simple • TableҰཡ • Tableఆٛ • Columnఆٛ • Indexఆٛ • Relation • show create table 37

Slide 38

Slide 38 text

38

Slide 39

Slide 39 text

shishamoͷऑΈ • ΫΤϦൃߦʹΑΔDB΁ͷෛՙ • ੩తϑΝΠϧΑΓԠ౴ੑೳ͸ྼΔ • MySQLͰ͔͠࢖͑ͳ͍ʢࠓͷͱ͜Ζʣ 39

Slide 40

Slide 40 text

ʮࠓͲ͏ͳͬͯΔ͔ʯΛ ਖ਼֬ʹද͢υΩϡϝϯτ͸ ڧ͍ shishamo࢖ͬͯΈͯԼ͍͞ʂ 40

Slide 41

Slide 41 text

shishamoΛࢧ͑Δٕज़ • Spring Boot • MyBatis • Spock ͔͜͜Βޙ൒ઓɻ࢒Γ࣌ؒ͸େৎ෉͔ʁ 41

Slide 42

Slide 42 text

shishamo ࠷େͷڧΈ — Java͑͋͞Ε͹Ͳ͜Ͱ΋ಈ͘ 42

Slide 43

Slide 43 text

Spring Bootͷ͓͔͛ 43

Slide 44

Slide 44 text

Spring Boot Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. 44

Slide 45

Slide 45 text

؆୯ɾ͓खܰ && ߴػೳɾଟػೳ Springʹ৐͔͍ͬͬͯΔ 45

Slide 46

Slide 46 text

ͪΐͬͱ࡞ͬͯΈΑ͏͕ߴ඼࣭ ࡶʹ࡞ͬͨπʔϧ͕ࢥ͍ͷ֎޿·ͬͯΧΦεԽ͠ ͨ͜ͱͳ͍Ͱ͔͢ʁ 46

Slide 47

Slide 47 text

খ͘͞͸͡Ίͯେ͖͘ҭͯΔ • shishamo͸ݱ࣌఺Ͱ͸େͨ͜͠ͱ͸͍ͯ͠ͳ ͍ • ػೳ௥Ճͨ͘͠ͳͬͨ࣌ʹɺSpringͷੈք͕ॿ ͚ͯ͘ΕΔʢͱࢥ͏ʣ 47

Slide 48

Slide 48 text

Spring BootͰ ࢝ΊΑ͏ 48

Slide 49

Slide 49 text

MyBatis ΧελϜSQLɺετΞυϓϩγʔδϟɺߴ౓ͳϚ οϐϯάॲཧʹରԠͨ͠༏ΕͨӬଓԽϑϨʔϜϫ ʔΫ 49

Slide 50

Slide 50 text

Overview • ͬ͘͟Γ͍͏ͱXMLʹSQLͱϚοϐϯάఆٛΛ ॻ͖·͢ • if΍܁Γฦ͠ͷ੍ޚจ΋ॻ͚·͢ʢࠓ೔͸঺հ ͠·ͤΜʣ • MyBatisͷڧྗ͞͸Ϛοϐϯάʹ͋Δͱࢥ͏ ͷͰ 50

Slide 51

Slide 51 text

model public class User { private int id; private String name; private String sex; // ΞΫηα͸লུ } 51

Slide 52

Slide 52 text

interface @Repository @Mapper public interface UserRepository { User selectById(int id); } 52

Slide 53

Slide 53 text

Result Map 53

Slide 54

Slide 54 text

Statement select user_id, user_name, user_sex from user_table where id = #{id} 54

Slide 55

Slide 55 text

ΊΜͲͦ͘͞͏ͱײͨ͡ͳΒਖ਼ղͰ͢ 55

Slide 56

Slide 56 text

Auto MappingΛ࢖͏ • MyBatis͕ྻ໊ͱಉ໊͡લΛ࣋ͭϓϩύςΟΛ ୳͢ • ྻ໊͸ΤΠϦΞεͰἧ͑Δ͜ͱ͕Ͱ͖Δ 56

Slide 57

Slide 57 text

Result Map • autoMappingଐੑΛ͚ͭͯ΍Ε͹Α͍ • άϩʔόϧʹઃఆ͢Δ͜ͱ΋Մೳ 57

Slide 58

Slide 58 text

Statement • ΤΠϦΞεͰɺಉ໊ͰऔΕΔΑ͏ʹͯ͋͛͠Ε ͹Α͍ select user_id as id, user_name as name, sex as sex from user_table where id = #{id} 58

Slide 59

Slide 59 text

ศརͦ͏ͳงғؾ͕ग़͖ͯ·ͨ͠ʂ 59

Slide 60

Slide 60 text

ωετͨ͠ΦϒδΣΫτ • 1 ର 1 60

Slide 61

Slide 61 text

Address address_id address_city 11 tokyo 12 osaka User user_id user_name user_sex address_id Tokyo Kantō Tokyo 11 Kanagawa Kantō Yokohama 12 61

Slide 62

Slide 62 text

͜Μͳײ͡ͰऔΔ user id user name user sex address id address city 1 yamada male 11 tokyo 2 sato female 12 osaka 62

Slide 63

Slide 63 text

model public class User { private Address address; private int id; private String name; private String sex; // ΞΫηα͸লུ } public class Address { private int id; private String city; // ΞΫηα͸লུ } 63

Slide 64

Slide 64 text

Result Map • ΦϒδΣΫτΛҰҙʹ͢ΔΧϥϜΛidͰఆٛ • resultMap͸ݸผʹఆٛ͢Δʢ࠶ར༻΋Մೳʣ • associationͰඥ͖ͮΛఆٛ • columnPrefixΛ࢖͏ͱSQLͰ໊લॏෳΛճආͰ ͖Δ 64

Slide 65

Slide 65 text

Result Map 65

Slide 66

Slide 66 text

Statement • ΤΠϦΞεͰɺಉ໊ͰऔΕΔΑ͏ʹͯ͋͛͠Ε ͹Α͍ • columnPrefix͕ର৅ͷΦϒδΣΫτʹඥ෇͚ͯ ͘ΕΔ 66

Slide 67

Slide 67 text

Statement select some_table.user_id as user_id, some_table.user_name as user_name, some_table.sex as user_sex, address.address_id as address_id, address.address_city as address_city from some_table inner join address on some_table.address_id = address.address_id where some_table.user_id = #{id} 67

Slide 68

Slide 68 text

ωετͨ͠ΦϒδΣΫτ • 1 ର ଟ 68

Slide 69

Slide 69 text

User user_id user_name user_sex address_id 1 yamada male 11 2 sato female 12 Hobby hobby_id hobby_name 21 football 22 running 23 video game 24 programming 69

Slide 70

Slide 70 text

User_Hobby user_id hobby_id 1 21 1 23 1 24 2 22 2 24 70

Slide 71

Slide 71 text

͜Μͳײ͡ͰऔΔ user_id user_name user_sex hobby_id hobby_nam e 1 yamada male 21 football 1 yamada male 23 video game 1 yamada male 24 programmin g 2 sato female 22 runnning 2 sato female 24 programmin g 71

Slide 72

Slide 72 text

model public class User { private Address address; private int id; private String name; private String sex; private List hobbies; // ΞΫηα͸লུ } public class Hobby { private int id; private String name; // ΞΫηα͸লུ } 72

Slide 73

Slide 73 text

Result Map • collectionλάͰඥ෇͚Δ • idλάͷఆ͕ٛ֊૚Λಛఆ͢Δ 73

Slide 74

Slide 74 text

Result Map 74

Slide 75

Slide 75 text

Statement select some_table.user_id as user_id, some_table.user_name as user_name, some_table.sex as user_sex, hobby.hobby_id as hobby_id, hobby.hobby_name as hobby_name from some_table inner join user_hobby on some_table.user_id = user_hobby.user_id inner join hobby on user_hobby.hobby_id = hobby.hobby_id where some_table.id = #{id} 75

Slide 76

Slide 76 text

ͲΜͳͱ͖ʹMyBatisʁ • SQLϕʔεͷϚοϐϯά͕ڧྗ • Ϛοϐϯάఆٛͷهड़ίετΛԼ͛Δ޻෉͕͞ Ε͍ͯΔ • ͭ·ΓɺSQLΛॻ͖͍ͨ࣌ʹ޲͍͍ͯΔ 76

Slide 77

Slide 77 text

SQLΛॻ͖͍ͨ࣌ʁ • σʔλϞσϧ͕Ұఆͷن໛Ҏ্ʹͳΓɺυϝΠ ϯϞσϧͱͷࠩ෼͕େ͖͘ͳ͍ͬͯΔ • σʔλϕʔεͷมߋίετ͕ߴ͍ 77

Slide 78

Slide 78 text

shishamoͷ৔߹ • Information Schemaʹର͢ΔΫΤϦ • ΞϓϦέʔγϣϯͷ౎߹ͰσʔλϞσϧΛมߋ Ͱ͖ͳ͍ 78

Slide 79

Slide 79 text

σʔλϞσϧͱυϝΠϯϞσϧ͸ ຊདྷผ෺ • σʔλϞσϧͱυϝΠϯϞσϧͷϛεϚονղ ফʹMyBatisΛબ୒͢ΔՁ஋͸͋Δ • ΞϓϦέʔγϣϯϨΠϠͰѻ͏ΦϒδΣΫτ͕ DBߏ଄ͱҰக͢ΔʢΑ͏ʹ͢ΔʣͷͰ͋Ε͹ ผͷબ୒ࢶͷํ͕͍͍ 79

Slide 80

Slide 80 text

MyBatis͸ͦΕͳΓʹίετ͕͔͔Δ • SQLΛॻ͔ͳͯ͘͸͍͚ͳ͍ • ֶशίετ • Mapper XMLͰͷΧελϜSQL • SQLʹ੍ޚߏ଄ΛຒΊࠐΉ 80

Slide 81

Slide 81 text

ͦΕͰ΋ • σʔλߏ଄ʹҾ͖ͣΒΕͳͯ͘ࡁΉͷ͸େ͖ͳར఺ • DBఆٛมߋͷͨΊʹυϝΠϯϞσϧʹखΛೖΕͨ ΓɺDTO΍EntityͷΑ͏ͳҰ࣌ड͚Ϋϥε͕ෆཁʹ ͳΔ • (༨ஊͰ͕͢)ͦ͏ͳ͖ͬͯͨΒORϚούʔͷࡌ ͤସ͑Λݕ౼ͨ͠ํ͕͍͍ͱࢥ͏ • σʔλϞσϧʹυϝΠϯϞσϧ͕Ҿ͖ͣΒΕΔͷ͸ ຊ຤స౗ͳؾ͕͢Δ 81

Slide 82

Slide 82 text

MyBatisͱ͍͏ બ୒ࢶΛ खʹೖΕΑ͏ 82

Slide 83

Slide 83 text

Spock • Java/GroovyΞϓϦέʔγϣϯͷͨΊͷςες ΟϯάϑϨʔϜϫʔΫ • GroovyͰॻ͖·͢ʢJavaͰ΋ॻ͚Δ͚Ͳʣ 83

Slide 84

Slide 84 text

Spock͸࠷ߴͰ͢ • ࠓ೔Ұ൪ݴ͍͍ͨ͜ͱͱ͍ͬͯ΋աݴͰ͸ͳ͍ • shishamo͸GitHubͰ͸GroovyϓϩδΣΫτ 84

Slide 85

Slide 85 text

Spockͷ͍͍ͱ͜Ζ • given/when/then౳ͷϒϩοΫ • ڧྗͳMockػߏ • Data TablesʹΑΔύϥϝʔλϥΠζυςετ • ௿ֶ͍शίετ • and more 85

Slide 86

Slide 86 text

given/when/then౳ͷϒϩοΫ • setup • given • when • then • expect • cleanup • where 86

Slide 87

Slide 87 text

ςετͷҙਤ͕໌ന def "HashMap accepts null key"() { given: def map = new HashMap() when: map.put(null, "elem") then: notThrown(NullPointerException) } 87

Slide 88

Slide 88 text

ڧྗͳMockػߏ given: def subscriber = Mock(Subscriber) subscriber.receive("message1") >> "ok" and: def publisher = new Publisher(); when: publisher.send("message1") then: 1 * subscriber.receive("message1") 88

Slide 89

Slide 89 text

͜Μͳ͜ͱ΋ // Ҿ਺͕helloͷͱ͖͚ͩ 1 * subscriber.receive("hello") // Ҿ਺͕helloͰ͸ͳ͍ͱ͖͚ͩ 1 * subscriber.receive(!"hello") // Ҿ਺ͻͱͭͳΒͳΜͰ΋ 1 * subscriber.receive(_) // Ҿ਺͍ͭ͘Ͱ΋ͳΜͰ΋ 1 * subscriber.receive(*_) // StringͷҾ਺ͻͱͭͳΒͳΜͰ΋ 1 * subscriber.receive(_ as String) // predicate΋࢖͑ΔʢҾ਺ͷsize͕ 3 ΑΓେ͖͍ʣ 1 * subscriber.receive({ it.size() > 3 }) 89

Slide 90

Slide 90 text

Data Tables def "maximum of two numbers"() { expect: Math.max(a, b) == c where: a | b || c 1 | 3 || 3 7 | 4 || 7 0 | 0 || 0 } 90

Slide 91

Slide 91 text

Groovyͷॊೈੑ • Javaʹൺ΂ΔͱʮԿͰ΋͋Γʯͳײ֮ʹؕΔ • privateίϯετϥΫλ΋ಛʹMockingͳ͠ʹ ݺͼग़ͤΔఔ • ※ྫͳͷͰɺͦΕΛݺͼग़͢ͷ͕Α͍ͱ͍͏ Θ͚Ͱ͸ͳ͍ 91

Slide 92

Slide 92 text

Πϯελϯεੜ੒ public class Foo { private long id; private String name; // ΞΫηαলུ } 92

Slide 93

Slide 93 text

Πϯελϯεੜ੒ • ಛʹίϯετϥΫλ͕ͳͯ͘΋஋ηοτͰੜ੒ Ͱ͖Δ def foo = new Foo(id: 1, name: "sample") 93

Slide 94

Slide 94 text

JUnitʁ • JUnit͸Ғେ • ςετͰ΍Γ͍ͨ͜ͱ͸ JUnit/Mockito/ PowerMock ͕͋Ε͹΄΅࣮ݱͰ͖Δ 94

Slide 95

Slide 95 text

ͳͥSpockͳͷ͔ʁ 95

Slide 96

Slide 96 text

MockitoͰͷMocking LinkedList mockedList = mock(LinkedList.class); when(mockedList.get(0)).thenReturn("first"); 96

Slide 97

Slide 97 text

SpockͰͷMocking def mockedList = Mock(LinkedList); mockedList.get(0) >> "first"; 97

Slide 98

Slide 98 text

JUnitͰͷύϥϝʔλϥΠζυςετ @ParameterizedTest @ValueSource(strings = { "Hello", "World" }) void testWithStringParameter(String argument) { assertNotNull(argument); } • JUnit5Ͱ͍ͩͿָʹͳͬͨ໛༷ • JUnit4ͩͱTheoriesΛ࢖ͬͯ΋ͬͱେม 98

Slide 99

Slide 99 text

SpockͷData Tables def "with string parameter"() { expect: argument != null where: argument | _ "Hello" | _ "World" | _ } 99

Slide 100

Slide 100 text

JUnit • ΍Γ͍ͨ͜ͱ͸Ͱ͖Δ͚Ͳɺ֮͑Δ͜ͱ͕ଟ͍ • ςετΛॻ͍͍ͯΔͱ͖ʹɺԿ͔Λௐ΂͍ͯΔ͜ͱ ͕ଟ͍ • voidϝιουͷMockͲ͏΍ͬͯॻ͘Μͩͬ ͚ɻɻ • ύϥϝʔλϥΠζυςετͷΞϊςʔγϣϯͳΜ ͚ͩͬɻɻ • etc 100

Slide 101

Slide 101 text

Spock • ه๏͕γϯϓϧ • ຊ࣭తͳʮͲ͏΍ͬͯԿΛςετ͢ΔʯΛߟ͑ Δ͕࣌ؒ૿͑Δ • ͍͍ҙຯͰࡶʹॻ͚Δ • ςετΛॻ͘ͷ͕େมͩͱɺॻ͘ؾ͕ͳ͘ ͳΔ 101

Slide 102

Slide 102 text

Spockʹ৮ͬͯΈΑ͏ 102

Slide 103

Slide 103 text

ςετର৅Ϋϥε @Service public class UserService { private UserRepository userRepository; // ίϯετϥΫλ public UserService(UserRepository userRepository) { this.userRepository = userRepository; } // ςετର৅ϝιου @Transactional(readOnly = true) public List findBy(Sex sex) { return userRepository.selectBySex(sex); } } 103

Slide 104

Slide 104 text

ςετΫϥε class UserServiceSpec extends Specification { UserService userService UserRepository userRepository; def 'Get users by sex'() { given: 'Mocking repository' def userRepository = Mock(UserRepository) userRepository.selectBySex(Sex.MALE) >> {[ new User(name: 'Taro', sex: Sex.MALE), new User(name: 'Jiro', sex: Sex.MALE), ]} and: def userService = new UserRepository(userRepository) when: def actual = userService.get(Sex.MALE) then: actual.size() == 2 actual.collect { it.name } == ['Taro', 'Jiro'] } } 104

Slide 105

Slide 105 text

given given: 'Mocking repository' def userRepository = Mock(UserRepository) userRepository.selectBySex(Sex.MALE) >> {[ new User(name: 'Taro', sex: Sex.MALE), new User(name: 'Jiro', sex: Sex.MALE), ]} and: 'ίϯετϥΫλΠϯδΣΫγϣϯ࠷ߴ' def userService = new UserRepository(userRepository) 105

Slide 106

Slide 106 text

when-then when: def actual = userService.get(Sex.MALE) then: actual.size() == 2 actual.collect { it.name } == ['Taro', 'Jiro'] 106

Slide 107

Slide 107 text

͍Ζ͍Ζݴ͍·͕ͨ͠ • ৮ͬͯΈͯ͸͡Ίͯྑ͕͞෼͔Δͱࢥ͍·͢ • Ҏલಋೖʹ൓ରͨ͜͠ͱ͕͋Γ·͢ • ผݴޠͰ৽͍͠ϑϨʔϜϫʔΫಋೖා͔ͬ ͨ • ͦͷͱ͖͸JUnitʹ͠·ͨ͠ • ࠓͰ΋৑ஊͰ͍͡ΒΕ·͢ 107

Slide 108

Slide 108 text

Conclusion 108

Slide 109

Slide 109 text

ଟ͘ͷγεςϜʹ͸DB͕͋Δ 109

Slide 110

Slide 110 text

DB͸γεςϜશମΛࢧ͍͑ͯΔ 110

Slide 111

Slide 111 text

DBͷण໋͸ΞϓϦέʔγϣϯΑΓ΋௕͍ 111

Slide 112

Slide 112 text

طଘͷDBΛ׆͔ͨ͠ ΞϓϦέʔγϣϯΛ ࡞Γ͍ͨ 112

Slide 113

Slide 113 text

DBͷ௚઀ૢ࡞Λ ΍Ί͍ͨ ڞ༗σʔλϕʔεΛ ΍Ί͍ͨ 113

Slide 114

Slide 114 text

࡞Δͷେมͦ͏ͩͳɻɻ ؀ڥͷ४උͰ͖Δ͔ͳɻɻ 114

Slide 115

Slide 115 text

Spring Boot! 115

Slide 116

Slide 116 text

ઃܭ࣮ͯ͠૷͠Α͏ɻɻ ςʔϒϧఆٛͲ͏ͳ͚ͬͯͨͬʁ 116

Slide 117

Slide 117 text

shishamo! 117

Slide 118

Slide 118 text

σʔλߏ଄ͱϞσϧ͕ϛεϚον͔΋ʁ ࠓͷSQLࢿ࢈Λ׆͔ͤͳ͍͔ͳʁ 118

Slide 119

Slide 119 text

MyBatis!! 119

Slide 120

Slide 120 text

SQLΛॻ͜͏ɻɻ ϦϨʔγϣϯͲ͏ͳ͚ͬͯͨͬʁ ΠϯσοΫε͸ʁ 120

Slide 121

Slide 121 text

shishamo! 121

Slide 122

Slide 122 text

ςετ͠ͳͬͪ͘Όɻɻ ָ͘͠ςετΛॻ͘ํ๏͸ͳ͍͔ͳʁ 122

Slide 123

Slide 123 text

Spock!!! 123

Slide 124

Slide 124 text

ςετσʔλ͕ඞཁͩͳɻɻ ͲͷςʔϒϧʹͲΜͳσʔλ͕ඞཁͩΖ͏ʁ 124

Slide 125

Slide 125 text

shishamo! 125

Slide 126

Slide 126 text

ͦΖͦΖϦϦʔεͰ͖ͦ͏͔ɻɻʁ 126

Slide 127

Slide 127 text

“just run” 127

Slide 128

Slide 128 text

ࠓ೔ݴ͍͔ͨͬͨ͜ͱ • SpringBoot + MyBatis + Spock ͱ͍͏։ൃύοΫ • SpringBoot͸؆୯Ͱߴػೳ • MyBatisͷϚοϐϯά͸ڧྗ • Spock࠷ߴͳͷͰࢼͯ͠Լ͍͞ • طଘࢿ࢈Λվળ͢Δʹ͸ՄࢹԽ͕େࣄ • ʮݱঢ়ʯΛਖ਼֬ʹද͢ • υΩϡϝϯτʹ΋ίʔυʹ΋པΓ͗͢ͳ͍ • DBʹݶͬͨ࿩Ͱ͸ͳ͍ 128

Slide 129

Slide 129 text

༨ஊ ಉ྅ʹshishamoΛ঺հͨ͠Β͢΂ͯKotlinͰॻ͖ ׵͑ΔϓϧϦΫΤετ͕ૹΒΕ͖ͯͨ͜ͱΛ͜͜ ʹ͝ใࠂ͠·͢ɻ 129

Slide 130

Slide 130 text

͓͠·͍ Spring Boot makes it easy to create stand-alone, production- grade Spring based Applications that you can “just run”. 130