94
(C) CASAREAL, Inc. All rights reserved. #jjug #ccc_ef3 1

Spring Bootの本当の理解ポイント #jjug

Embed Size (px)

Citation preview

Page 1: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3 1

Page 2: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

2

Page 3: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

3

基礎を固めよ!

Page 4: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

4

Page 5: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

5

Page 6: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

6

Page 7: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸7

Page 8: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

8

Page 9: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

9

Page 10: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

10

Spring Web 4 Spring MVC

Spring Boot Developer 2 Spring Boot

Spring Cloud Services3

( )

Spring Cloud Microservices

Page 12: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

12

Page 13: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

13

Spring Framework

Spring Boot

Spring Cloud

Data, Security, Batch, …

Page 14: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

14

Page 15: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

15

※CoC : Convention over Configuration ( )

Seasar2 Ruby on Rails

Page 16: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

16

Page 17: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

17

Page 18: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

18

Page 19: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

19

Page 20: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

20

Page 21: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Component

21

packagehoge.service.impl;

@ComponentpublicclassFooServiceImplimplementsFooService{// }※ ( FooService)

Page 22: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Configuration @ComponentScan

22

packagehoge.config;

@Configuration@ComponentScan(basePackages={“hoge.service.impl”})publicclassAppConfig{// OK}

Page 23: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ basePackages

@Component

23

hoge

config

service

impl

bar

AppConfig

FooServiceImpl

Bar

FooService

Page 24: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ AnnotationConfigApplicationContext

▸ ApplicationContext

24

// // ApplicationContextcontext=newAnnotationConfigApplicationContext(AppConfig.class);※ Java Config

Page 25: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ getBean()

25

ApplicationContextcontext=…;FooServicefs=context.getBean(FooService.class);

Page 26: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

26

@Component// publicclassFooController{privatefinalFooServicefs;// @Autowired// publicFooController(FooServicefs){this.fs=fs;}}

Page 27: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Bean

27

@Configuration//@ComponentScan publicclassAppConfig2{@BeanpublicBarServicebarService(){//

returnnewBarServiceImpl();}}

Page 28: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Bean

28

@ConfigurationpublicclassAppConfig3{@BeanpublicBarServicebarService(BarRepositorybr){returnnewBarServiceImpl(br);}}

Bean

Page 29: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Component

29

ApplicationContextcontext=newAnnotationConfigApplicationContext(AppConfig2.class);BarServicebs=context.getBean(BarService.class);

@ComponentpublicclassBarController{privatefinalBarServicebs;@Autowired// publicBarController(BarServicebs){this.bs=bs;}}

Page 30: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Bean

▸ basePackages @Component

30

@Configuration@ComponentScan(basePackages=“hoge.service.impl”)publicclassAppConfig4{@BeanpublicBarServicebarService(){returnnewBarServiceImpl();}}

Page 31: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Component

▸ @Bean

31

Page 32: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

32

Page 33: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

33

Page 34: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

34

ViewResolver ※

Spring Spring

DispatcherServlet

Page 35: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

DispatcherServlet

▸WebApplicationInitialzer

▸35

DispatcherServlet

Page 36: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ DispatcherServlet

36

Page 37: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

ViewResolver▸

▸ ”employee/index””/WEB-INF/views/employee/index.jsp”

▸ InternalResourceViewResolver

▸ ThymeleafViewReseolver

▸ FreeMarkerViewResolver

37

Page 38: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

ViewResolver

38

@ConfigurationpublicclassMvcConfig…{@BeanpublicInternalResourceViewResolverviewResolver(){InternalResourceViewResolvervr=newInternalResourceViewResolver();vr.setPrefix("/WEB-INF/views/");vr.setSuffix(".jsp");returnvr;}}

Page 39: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

ViewResolver▸ DispatcherServlet ViewResolver

39

https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/DispatcherServlet.java#L733

Page 40: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ ViewResolver

40

Page 41: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ ViewResolver

41

@EnableW

ebMvc

Page 42: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

@EnableWebMvc▸ @Import

▸ @EnableXxx

42

https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/java/org/springframework/web/servlet/config/annotation/EnableWebMvc.java#L101

Page 43: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Controller

▸ @Component

43

packagehoge.controller

@Controller@RequestMapping(“/employee”)publicclassEmployeeController{@GetMapping(“/index”)publicStringindex(){return“employee/index”;}

Page 44: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @Component

▸ @Controller

▸ @RestController

▸ @Configuration👈

▸ @Service

▸ @Repository

44

Page 45: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

45

@ComponentScan(basePackages=“hoge.controller”)@ConfigurationpublicclassMvcConfig{…}

Page 46: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

46

@EnableWebMvc@ComponentScan(basePackages=“hoge.controller”)@ConfigurationpublicclassMvcConfig…{@BeanpublicInternalResourceViewResolverviewResolver(){…}}

Page 47: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

47

DispatcherServlet

ViewResolverBean

Bean

Bean

Bean

Page 48: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ DispatcherServlet

▸ @EnableWebMvc

▸ @Controller @ComponentScan

48

Page 49: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸49

https://www.casareal.co.jp/recruit/jobs/ls_teacher.php

Page 50: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ ✕ ✕

50

https://www.casareal.co.jp/ls/service/shinjinseminar/course01

Page 51: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

51

Page 52: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

52

ViewResolverBean

Bean

DataSourceBean

Bean

Bean

Bean

Bean

Bean

Page 53: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

53

ViewResolverBean

Bean

DataSourceBean

Bean

Bean

Bean

Bean

Bean

Bean

Bean

Page 54: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

54

Page 55: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

55

@ConfigurationpublicclassThymeleafAutoConfiguration{…@ConfigurationpublicstaticclassXxxConfiguration{@BeanpublicThymeleafViewResolverthymeleafViewResolver(){…}…

※static Java Config

ViewResolver

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java#L183

Page 56: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸56

Page 57: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

57

Page 58: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

@ConfigurationProperties

58

@ConfigurationProperties(prefix=“spring.thymeleaf”)publicclassThymeleafProperties{…privateCharsetencoding=DEFAULT_ENCODING;privatebooleancache=true;// }

spring.thymeleaf.encoding=Shift_JISspring.thymeleaf.cache=falsehttps://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafProperties.java

Page 59: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

@EnableConfigurationProperties

▸ @ConfigurationProperties

▸ @Component/@Bean

59https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java#L74

@EnableConfigurationProperties(ThymeleafProperties.class)@ConfigurationpublicclassThymeleafAutoConfiguration{…

Page 60: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @ConfigurationProperties

60

Page 61: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

61

Page 62: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

62

Page 63: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

63

@SpringBootApplicationpublicclassSampleApplication{publicstaticvoidmain(String[]args){SpringApplication.run(SampleApplication.class);}}

@EnableAutoConfiguration@Configuration@ComponentScanpublic@interfaceSpringBootApplication{…

Page 64: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

64

@EnableAutoConfiguration

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\…

AutoConfiguration

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

Page 65: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

65

Page 66: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

66

Page 67: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

@ConditionalOnXxx

▸ @Bean

67

Page 68: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

ThymeleafAutoConfiguration

68

@Configuration@ConditionalOnClass(TemplateMode.class) @AutoConfigureAfter({WebMvcAutoConfiguration.class,…})publicclassThymeleafAutoConfiguration{…@Configuration@ConditionalOnWebApplication(…)publicstaticclassXxxConfiguration{@Bean@ConditionalOnMissingBean(name=“thymeleafViewResolver”)publicThymeleafViewResolverthymeleafViewResolver(){…https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java#L183

Page 69: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

@ConditionalOnClass

@ConditionalOnBean

@ConditionalOnMissingBean

▸69

Page 70: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

@ConditionalOnProperty

@ConditionalOnWebApplication

@AutoConfigureAfter/@AutoConfigureBefore

▸70

Page 71: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @EnableAutoConfiguration

▸ @ConditionalOnXxx

71

Page 72: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

72

Page 73: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

😭

@ConditionalOnMissingBean(Bean_1.class)

@ConditionalOnBean(Bean_2.class)

73

Page 74: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

Spring Bootのべからず集

一.フレームワークを動かすBeanは、なるべく自前で定義するべからず

二.@EnableXxxはなるべく付けるべからず

74

Page 75: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ @EnableXxx

75

Page 76: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

76

Page 77: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

77https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

Page 78: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

78

@ConfigurationpublicclassSomeConfiguration{privatefinalSomeBeansb;

@Autowired// publicSomeConfiguration(SomeBeansb){this.sb=sb;}

@PostConstruct// publicvoidinit(){sb.setXxx(…);//SomeBean }}

Page 79: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

79

@ConfigurationpublicclassMyThymeleafConfiguration{@BeanpublicFooDialectfooDialect(){returnnewFooDialect();}@BeanpublicBarDialectbarDialect(){returnnewBarDialect();}}

Page 80: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ ThymeleafAutoConfiguration Dialect

TemplateEngine Dialect

80

FooDialectBean

BarDialectBean

&TemplateEngine

Bean &

Page 81: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

81

@ConfigurationprotectedstaticclassThymeleafDefaultConfiguration{//Dialect Bean DI publicThymeleafDefaultConfiguration(...,ObjectProvider<Collection<IDialect>>dProvider){…}@BeanpublicSpringTemplateEnginetemplateEngine(){SpringTemplateEngineengine=newSpringTemplateEngine();//Dialect this.dialects.forEach(engine::addDialect);returnengine;https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java#L140

Page 82: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ XxxCustomizer

82

@FunctionalInterfacepublicinterfaceJackson2ObjectMapperBuilderCustomizer{

voidcustomize(Jackson2ObjectMapperBuilderbuilder);}https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/Jackson2ObjectMapperBuilderCustomizer.java

Page 83: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

83

@ConfigurationpublicclassMyJacksonConfiguration{@BeanpublicJackson2ObjectMapperBuilderCustomizerjackson2ObjectMapperBuilderCustomizer(){// OKreturnbuilder->{// builder.modules(…).locale(…).indentOutput(…);};}}

Page 84: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

84

@ConfigurationstaticclassJacksonObjectMapperBuilderConfiguration{@BeanpublicJackson2ObjectMapperBuilder…(List<Jackson2ObjectMapperBuilderCustomizer>customizers){Jackson2ObjectMapperBuilderbuilder=newJackson2ObjectMapperBuilder();for(Jackson2ObjectMapperBuilderCustomizercustomizer:customizers){customizer.customize(builder);}returnbuilder;}}https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java#L172

Page 85: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ FilterRegistrationBean

85

@BeanpublicFilterRegistrationBeanmyFilter(){MyFilterfilter=newMyFilter();FilterRegistrationBeanfrb=newFilterRegistrationBean(filter);// url-patternfrb.addUrlPatterns(“/*”);//

frb.setOrder(Ordered.HIGHEST_PRECEDENCE+10);returnfrb;}

Page 86: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

86

Page 87: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

87

Page 88: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

88

Page 90: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

90

Page 91: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ 91

Page 92: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

▸ 😡

92

Page 93: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

93

Page 94: Spring Bootの本当の理解ポイント #jjug

(C) CASAREAL, Inc. All rights reserved.

#jjug #ccc_ef3

94