Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
1. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Pivotal認定講師による
Spring Framework 5.1
& Spring Boot 2.1
ハンズオン!
(株)カサレアル 多⽥真敏
2018年12⽉15⽇
1
2. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
このセッションについて
▸ Spring 5.1・Spring Boot 2.1とはどんなものか、
基礎から分かりやすく解説します
▸ 【初級者向け】ある程度Javaの経験があり、
Springは初めての⽅が対象です
2
3. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
⾃⼰紹介
▸ 多⽥真敏(@suke_masa)
▸ 研修トレーナー@カサレアル
▸ Spring / Java EE / Microservices
/ Cloud Foundry
▸ Pivotal認定講師
▸ ⽇本Springユーザ会スタッフ
▸ ⽇本GlassFishユーザー会運営メンバー
3
4. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
株式会社カサレアル
▸ 他社には無い⾊々なプログラミング⾔語の研修
を提供しています!
4
5. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
世界⼀ハイレベルなSpring研修
▸ Pivotal認定 Core Spring (4⽇間)
▸ DI、AOP、Test、JDBC、Tx、Data、Boot、Web、
REST、Security、OAuth 2.0、Actuator、Boot Test
▸ ロジカルな講義+演習で徹底理解
▸ アーキテクトやリーダー向け
5
https://www.casareal.co.jp/ls/service/openseminar/pivotal/p016
6. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
オリジナルSpring研修
▸ はじめてのSpring MVCによる
Webアプリケーション開発 (2⽇間)
▸ エントリー向けSpringの基礎
▸Spring Security⼊⾨ (1⽇間)
▸ 認証/認可、アーキテクチャー、OAuth 2.0
▸Spring Batch⼊⾨ (1⽇間)
▸ バッチ処理
6
https://www.casareal.co.jp/ls/service/openseminar/java
7. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
コンテナはじめました
▸ Docker⼊⾨ (1⽇間)
▸ Kubernetes⼊⾨ (1⽇間)
7
https://www.casareal.co.jp/ls/service/openseminar/cloudnative
8. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
本⽇の時間割
▸ 10:00-10:20 Spring講義
▸ このスライドです
▸ 10:20-11:45 ハンズオン
▸ 休憩は⾃由です!
8
9. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
ハンズオン課題
▸ 演習1 Spring Data JDBCによるデータアクセス
▸ 演習2 トランザクション管理
▸ 演習3 Spring MVCとThymeleafによるWebアプリ開発
▸ 演習4 Spring Securityによる認証・認可(オプション)
▸ 演習5 Spring Bootによる無設定化(オプション)
▸ 演習6 Spring Boot Actuatorによる運⽤監視(オプション)
9
※演習6まで終了するには3時間くらいはかかります
10. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
⽬次
10
1. Core
3. Web
2. Data
4. Security
5. Test
6. Boot
11. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
⽬次
11
1. Core
3. Web
2. Data
4. Security
5. Test
6. Boot
12. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Springとは
▸ いろんなフレームワークの集合体
▸ DI/AOP、Web、Data、Security、Test、Boot、
Cloud、・・・
▸ 現在はPivotal社が中⼼となりオープンソースで開発
▸ 元々はRod Johnson⽒が開発したもの
▸ 最新はSpring 5.1(2018年9⽉リリース)
12
13. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Spring 5はJDK 8ベース
▸ JDK 8の機能がSpring内部でも公開APIでも
使われている
▸ Date and Time API、ラムダ式、Stream API、
Optional、インタフェースのデフォルトメソッド、
メソッド引数名による解決、など
▸ JDK 7未満では動かない!!!😖
13
14. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
JDK 11対応
▸ Spring 5.1はJDK 11上でも動作保証済み!
▸ モジュールシステムにも対応👏
▸ JDK 12はSpring 5.2で対応予定
14
※JDK 12は2019年3⽉、Spring 5.2は2019年6⽉にそれぞれリリース予定
15. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Springの根幹「DI」
▸ Dependency Injection(依存性の注⼊)
▸ 必要なインスタンス(=依存性)を外から代⼊すること
▸ テスト時のインスタンスの差し替えなどが可能になる
15
objA
objB
objA
objB代⼊
new
⭕❌
16. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
DIコンテナ
▸ Springが内部で持ってい
るインスタンス(Bean)
の格納庫
▸ すべてのBeanはDI済み
になっている※
▸ 必要に応じて取り出し可
能
16
DIコンテナ
BeanBean Bean
Bean Bean Bean
Bean Bean
DI DI
DIDI
DI
D
I
※デフォルトでは起動時に全てのBeanがインスタンス化&DIされる
17. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Beanを定義する⽅法①
▸ コンポーネントスキャン
▸ クラスに@Componentを
付加
▸ Java Configクラスに上記
クラスのパッケージ名を
指定
17
package com.service;
@Component
public class HelloService {
// omitted…
}
@Configuration
@ComponentScan(basePackages
= "com.service")
public class ServiceConfig {
// omitted…
}
18. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
正体が@Componentなアノテーション
▸ @Controller
▸ @RestController
▸ @Service
▸ @Repository
▸ @Configuration
・・・他にもいろいろ
18
19. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Beanを定義する⽅法②
▸ Java Configにメソッ
ドを作成し@Beanを
付加
▸ 戻り値がBeanにな
る
▸ メソッド引数で他の
Beanを受け取れる
▸ ①と②は併⽤可能
19
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
return new HogeDataSource();
}
@Bean
public JdbcTemplate jdbcTemplate(
DataSource ds) {
return new JdbcTemplate(ds);
}
}
20. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
DI
▸ @Autowiredで他のBeanを外から代⼊できる
▸ コンストラクタが1つのみの場合は省略可能
20
@Controller
public class HelloController {
private final HelloService service;
@Autowired // 省略可能
public HelloController(HelloService svc) {
this.service = svc;
}
// omitted...
}
@Service
public class HelloService {
// omitted...
}
21. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Webアプリケーションの3層アーキテクチャー
21
View
Controller Service Repository
DB
プレゼンテーション層
ビジネス
ロジック層
永続化層
リクエスト
レス
ポンス
22. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
⽬次
22
1. Core
3. Web
2. Data
4. Security
5. Test
6. Boot
23. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Springのデータアクセス技術
▸ Spring JDBC
▸ JDBCの単純なラッパー
▸ Spring Data
▸ 様々なデータアクセスを共通化(JPA、Redis、MongoDB等)
▸ その他、各種ORマッパーがSpring連携機能を提供
▸ MyBatis、DBFlute等
23
24. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Spring Data JDBC
▸ Spring JDBCを利⽤したSpring Data
▸ MyBatisも利⽤可能
24
// インタフェースを作るだけ!
public interface EmployeeRepository
extends CrudRepository<Employee, Long> {
// アノテーションにSQLを書ける
@Query("SELECT ... FROM employee WHERE hoge = :hoge")
List<Employee> findByHoge(String hoge);
// CrudRepositoryのメソッドは全て使える
}
パラメータ名を揃える※
※コンパイル時(javac)のオプションに「-parameters」が必要
26. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
作成したインタフェースの使い⽅
▸ 実装クラスおよびそのインスタンスは、起動時
にSpringによって作られる
▸ インスタンスはBeanとなる
→@AutowiredでDIできる
26
27. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
作成したインタフェースの使い⽅
27
@Service
public class EmployeeService {
private final EmployeeRepository repo;
@Autowired // 省略可能
public EmployeeService(EmployeeRepository repo) {
this.repo = repo;
}
public Iterable<Employee> findAll() {
// CrudRepositoryのメソッドを使える
Iterable<Employee> employees = repo.findAll();
return employees;
}
}
28. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
必要なBean定義
28
@Configuration
@EnableJdbcRepositories(basePackages =
"com.example.persistence.repository")
public class JdbcConfig extends JdbcConfiguration {
@Bean
public NamedParameterJdbcTemplate
namedParameterJdbcTemplate(DataSource ds) {
return new NamedParameterJdbcTemplate(ds);
}
}
29. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
⽬次
29
1. Core
3. Web
2. Data
4. Security
5. Test
6. Boot
30. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Spring MVCとは
▸ Webアプリケーションフレームワーク
▸ 中にDIコンテナを持っていて、
必要なインスタンスを取り出して
フレームワーク全体を動かしている
30
31. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Spring MVCのアーキテクチャー
31
Dispatcher
Servlet
View
Resolver
(Bean)
Controller
(Bean)
①リクエスト
②URLを⾒て
処理を委譲
③ビューのパスの
⼀部を返す
⑥レスポンス
④ビューのパスの⼀部⑤ビューの完全パス
…
32. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
DispatcherServlet
▸ すべてのリクエストを
受け取る唯⼀の
サーブレットクラス
▸ 中にDIコンテナを持っ
ていて、必要なBeanを
都度取り出して使う
32
Dispatcher
Servlet
DIコンテナ
Cont
roller
View
Resolver
その他の
Bean
33. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
DispatcherServletの登録
33
public class MvcInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() { ... }
@Override
protected Class<?>[] getServletConfigClasses() { ... }
@Override
protected String[] getServletMappings() {
return new String[]{ "/" };
}
}
▸ AbstractAnnotationConfigDispatcherServletInitializerのサブ
クラスを作成するだけで、サーバーにDispatcherServletが登録される
※web.xmlでも登録可能
36. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
コントローラー
36
@Controller
public class EmployeeController {
private final EmployeeService service;
@Autowired // 省略可能
public EmployeeController(EmployeeService service) {
this.service = service;
}
@GetMapping("/")
public String index(Model model) {
Iterable<Employee> employees = service.findAll();
model.addAttribute("employees", employees);
return "index";
}
}
コントローラーとしてBean定義
ビジネスロジックをDI
メソッドとURLをマッピング
値をビューに渡す
ビューのパスの⼀部を返す
37. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
必要なBean定義
37
@ComponentScan(basePackages =
"com.example.web.controller")
@EnableWebMvc
@Configuration
public class MvcConfig ... {
...
@Bean
public ThymeleafViewResolver
viewResolver(...) {
...
}
...
}
▸ ViewResolver
をBean定義する
▸ コントローラーク
ラスをコンポーネ
ントスキャン
▸ @EnableWebMvc
を付加
38. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
その他の機能
▸ ⼀通りの機能が揃っている
▸ ⼊⼒検証(Bean Validation連携)
▸ 例外処理
▸ ファイルアップロード
▸ RESTful Webサービス
・・・など
38
39. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
⽬次
39
1. Core
3. Web
2. Data
4. Security
5. Test
6. Boot
40. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Spring Securityとは
▸ 主に認証・認可の機能を提供するセキュリティ
ライブラリ
▸ 何重ものサーブレットフィルターや、
AOP(割り込み処理)を使って、
ログインや権限チェックを⾏う
40
41. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
web.xmlへのフィルター設定
41
<web-app>
...
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
これだけで⼗数個のフィルターが動く!
42. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
認証・認可の設定
42
@EnableWebSecurity
public class SecurityConfig
extends WebSecurityConfigurerAdaptor {
@Override
protected void configure(HttpSecurity http) ... {
http.formLogin() // ログイン画⾯の設定
.loginPage("/login")
.permitAll();
http.authorizeRequests() // URLごとの権限設定
.mvcMatchers("/admin*").hasRole("ADMIN")
.anyRequest().authenticated();
http.logout() // ログアウトの設定
.permitAll();
}
...
}
43. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
PasswordEncoder
▸ DB等にはパスワードをハッシュ化して保存する
▸ ⼊⼒されたパスワードは、ハッシュ化してからDBのパ
スワードと照合する
43
@EnableWebSecurity
public class SecurityConfig
extends WebSecurityConfigurerAdaptor {
...
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
44. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
thymeleaf-extras-springsecurity
▸ Thymeleafが提供している、Spring Securityと
連携するためのライブラリ
▸ 認証や権限の有無などで表⽰/⾮表⽰を切り替え
ることができる
44
<!--/* ADMINロールのみ下記のリンクを表⽰する */-->
<a th:href="@{/admin}" sec:authorize="hasRole('ADMIN')">
管理画⾯へ
</a>
45. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
⽬次
45
1. Core 2. Web
3. Data4. Security
5. Test
6. Boot
46. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Spring Testとは
▸ JUnitやTestNGと、Springを連携させるライブ
ラリ
▸ Spring 5でJUnit 5に対応!👏
▸ その他、Spring MVCやDBを利⽤したテストの
機能も提供
46
47. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
JUnit 5対応
▸ SpringExtension
▸ JUnit 5上でSpringのDI機能などを使えるようにする拡
張機能
47
@ExtendWith(SpringExtension.class)
@ContextConfiguration(
classes = HelloTestConfig.class)
public class HelloTest {
@Autowired HelloService service;
// テストを書く…
}
48. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
便利なアノテーション
▸ @SpringJUnitConfig
▸ @ExtendWith(SpringExtension.class)
+ @ContextConfiguration
▸ @SpringJUnitWebConfig
▸ @ExtendWith(SpringExtension.class)
+ @ContextConfiguration
+ @WebAppConfiguration
48
49. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
⽬次
49
1. Core
3. Web
2. Data
4. Security
5. Test
6. Boot
50. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
Spring Bootとは
① Auto Configurationクラス
▸ ⼤量のJava Configがあらかじめ提供済み!
② Starterライブラリ
▸ ⼤量の依存ライブラリが1つにまとめられている!
③ 組み込みサーバー⼊りFat JAR
▸ 単独で起動できる!
50
51. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
①Auto Configurationクラス
51
▸ Spring Boot
によって
Java Config
が
あらかじめ
⼤量に⽤意
されている
52. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
②Starterライブラリ
52
▸ Starterライブラ
リを指定すれば、
芋づる式に⼤量
のライブラリが
追加される
53. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
③組み込みサーバー⼊りFat JAR
53
$ jar -tvf target/04-boot2-answer-0.0.1-SNAPSHOT.jar
524 Thu Jun 21 13:27:06 JST 2018 META-INF/MANIFEST.MF
2688 Wed May 09 13:32:20 JST 2018 org/springframework/boot/loader
/data/RandomAccessDataFile$DataInputStream.class
...
607 Thu Jun 21 13:27:06 JST 2018 BOOT-INF/classes/com/example/web
/controller/LoginController.class
...
1650 Thu Jun 21 13:27:06 JST 2018 BOOT-INF/classes/com/example
/Application.class
604 Wed May 09 13:41:42 JST 2018 BOOT-INF/lib
/spring-boot-starter-security-2.0.2.RELEASE.jar
...
425493 Tue May 08 15:24:16 JST 2018 BOOT-INF/lib
/spring-security-core-5.0.5.RELEASE.jar
3115994 Fri Apr 27 21:24:52 JST 2018 BOOT-INF/lib
/tomcat-embed-core-8.5.31.jar
240244 Fri Apr 27 21:24:54 JST 2018 BOOT-INF/lib
/tomcat-embed-el-8.5.31.jar
256776 Fri Apr 27 21:24:54 JST 2018 BOOT-INF/lib
/tomcat-embed-websocket-8.5.31.jar
▸ ビルド成果物のJARに、作成したクラスやライブラリ、組み
込みサーバーなどが全て含まれている
54. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
つまり・・・
▸ 開発のセットアップが簡単にできる!😆
▸ Java Configの作成がほぼ不要に
▸ 追加するライブラリが少なくて済む
▸ 簡単に起動・デプロイできる!😆
▸ サーバーの設定の必要無し
▸ 特にクラウド向き
54
55. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
よくある勘違い🙅
▸ 開発を⾼速化できる❌
▸ Java Configはほぼ不要になるが、
機能開発する部分は⼀切変わらない
▸ Spring⾃体の知識は無くても良い❌
▸ 機能開発には変わらずSpringを利⽤する
▸ 設定は何も書かなくて良い❌
▸ Auto Configurationクラスが無いものは変わらず必要
55
56. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
main()メソッドからの起動
▸ あらかじめ⽤意された⼤量のJava Configを読み
込む
▸ 組み込みサーバーを起動する
56
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(
Application.class, args);
}
}
57. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
@SpringBootApplication
▸ 下記3つのアノテーションを組み合わせたもの
▸ @Configuration
▸ @CompomentScan
▸ @EnableAutoConfiguration
57
Auto Configurationを有効化する
59. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
ハンズオン開始!
▸ 準備はOKですか?
▸ ⼿順 → https://qiita.com/suke_masa/items/
44463518fdbbc13e0087
59
60. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
動作確認
① 02-spring5-answerプロジェクトの
src/main/java/com/example/Main.javaを実⾏
② 起動ログの最後に下記が出ることを確認
③ http://localhost:8080/sample/ にブラウザでアクセス
④ admin@example.com / admin でログイン
⑤ 顧客⼀覧が表⽰されれば成功
60
61. (C) CASAREAL, Inc. All rights reserved.
#jjug_ccc
動作確認できたら演習開始!
▸ 演習1の⼿順 → 01-spring5/todo-1.md
▸ 時間 → 11:45まで
61