Submit Search
Upload
これからSpringを使う開発者が知っておくべきこと
•
16 likes
•
23,004 views
土岐 孝平
Follow
Springの初心者が疑問に思ったり、おかしな使い方をしてしまいがちなところをピックアップして説明します。
Read less
Read more
Software
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 32
Download now
Download to read offline
Recommended
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント
土岐 孝平
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
土岐 孝平
今さら聞けないDiとspring
今さら聞けないDiとspring
土岐 孝平
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
例外設計における大罪
例外設計における大罪
Takuto Wada
Recommended
Springを何となく使ってる人が抑えるべきポイント
Springを何となく使ってる人が抑えるべきポイント
土岐 孝平
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
土岐 孝平
今さら聞けないDiとspring
今さら聞けないDiとspring
土岐 孝平
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
例外設計における大罪
例外設計における大罪
Takuto Wada
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門
Satoshi Kubo
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NTT DATA Technology & Innovation
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
ssuser070fa9
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
心 谷本
「JJUG運営の戦略と戦術」 JJUG CCC 2016 Spring 基調講演
「JJUG運営の戦略と戦術」 JJUG CCC 2016 Spring 基調講演
Yusuke Suzuki
エッセンシャルCore springハンズオン
エッセンシャルCore springハンズオン
土岐 孝平
More Related Content
What's hot
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
kwatch
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門
Satoshi Kubo
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
Docker Compose 徹底解説
Docker Compose 徹底解説
Masahito Zembutsu
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
NTT DATA Technology & Innovation
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
ssuser070fa9
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
Takahiro Inoue
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
心 谷本
What's hot
(20)
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
O/Rマッパーによるトラブルを未然に防ぐ
O/Rマッパーによるトラブルを未然に防ぐ
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Docker Compose 徹底解説
Docker Compose 徹底解説
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
【Spring fest 2019】徹底解剖Spring MVCアーキテクチャー
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
「GraphDB徹底入門」〜構造や仕組み理解から使いどころ・種々のGraphDBの比較まで幅広く〜
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Spring Bootをはじめる時にやるべき10のこと
Spring Bootをはじめる時にやるべき10のこと
Similar to これからSpringを使う開発者が知っておくべきこと
「JJUG運営の戦略と戦術」 JJUG CCC 2016 Spring 基調講演
「JJUG運営の戦略と戦術」 JJUG CCC 2016 Spring 基調講演
Yusuke Suzuki
エッセンシャルCore springハンズオン
エッセンシャルCore springハンズオン
土岐 孝平
「Agileごっこ」で終わらせないために(仮)
「Agileごっこ」で終わらせないために(仮)
Taku Yajima
概念モデルって難しいですよね
概念モデルって難しいですよね
Takuya Kawabe
Spring4-DevLove発表資料
Spring4-DevLove発表資料
Yuichi Hasegawa
CodeGrid2周年記念パーティ_ライトニングトーク_アジャイル開発
CodeGrid2周年記念パーティ_ライトニングトーク_アジャイル開発
Yasuyuki Fujikawa
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
Hisao Soyama
プログラミングのお勉強としてscratchをさわってみた
プログラミングのお勉強としてscratchをさわってみた
HirokiIwanaga
Spring知っておきたい
Spring知っておきたい
Yuichi Hasegawa
「本を書くプロジェクトマネジメントはWbsかアジャイルか」 XP祭り2015
「本を書くプロジェクトマネジメントはWbsかアジャイルか」 XP祭り2015
Fumitaka Inayama
MicroserviceでのNoOps戦略 - NoOps Meetup Tokyo #2 #NoOpsJP
MicroserviceでのNoOps戦略 - NoOps Meetup Tokyo #2 #NoOpsJP
Yusuke Suzuki
JANOG32 - 運用チームの作り方
JANOG32 - 運用チームの作り方
Chika Yoshimura
アジャイル開発やってみた
アジャイル開発やってみた
Arata Fujimura
リーンスタートアップ、アジャイル開発導入事例
リーンスタートアップ、アジャイル開発導入事例
Arata Fujimura
はじめてのスクラム開発
はじめてのスクラム開発
ai oshiumi
ペーパークラフトで学ぶフィードバックと改善(鬼)
ペーパークラフトで学ぶフィードバックと改善(鬼)
You&I
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
InnovationSprint2011
アジャイルの本質 - Agile Japan 2019サテライト名古屋
アジャイルの本質 - Agile Japan 2019サテライト名古屋
hiroyuki Yamamoto
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
LINE Corporation
アジャイルによくきく?モデリング
アジャイルによくきく?モデリング
Iwao Harada
Similar to これからSpringを使う開発者が知っておくべきこと
(20)
「JJUG運営の戦略と戦術」 JJUG CCC 2016 Spring 基調講演
「JJUG運営の戦略と戦術」 JJUG CCC 2016 Spring 基調講演
エッセンシャルCore springハンズオン
エッセンシャルCore springハンズオン
「Agileごっこ」で終わらせないために(仮)
「Agileごっこ」で終わらせないために(仮)
概念モデルって難しいですよね
概念モデルって難しいですよね
Spring4-DevLove発表資料
Spring4-DevLove発表資料
CodeGrid2周年記念パーティ_ライトニングトーク_アジャイル開発
CodeGrid2周年記念パーティ_ライトニングトーク_アジャイル開発
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
プログラミングのお勉強としてscratchをさわってみた
プログラミングのお勉強としてscratchをさわってみた
Spring知っておきたい
Spring知っておきたい
「本を書くプロジェクトマネジメントはWbsかアジャイルか」 XP祭り2015
「本を書くプロジェクトマネジメントはWbsかアジャイルか」 XP祭り2015
MicroserviceでのNoOps戦略 - NoOps Meetup Tokyo #2 #NoOpsJP
MicroserviceでのNoOps戦略 - NoOps Meetup Tokyo #2 #NoOpsJP
JANOG32 - 運用チームの作り方
JANOG32 - 運用チームの作り方
アジャイル開発やってみた
アジャイル開発やってみた
リーンスタートアップ、アジャイル開発導入事例
リーンスタートアップ、アジャイル開発導入事例
はじめてのスクラム開発
はじめてのスクラム開発
ペーパークラフトで学ぶフィードバックと改善(鬼)
ペーパークラフトで学ぶフィードバックと改善(鬼)
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
アジャイルの本質 - Agile Japan 2019サテライト名古屋
アジャイルの本質 - Agile Japan 2019サテライト名古屋
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
アジャイルによくきく?モデリング
アジャイルによくきく?モデリング
More from 土岐 孝平
What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
土岐 孝平
SpringベースのCloud Native Application
SpringベースのCloud Native Application
土岐 孝平
Spring fest2020 spring-security
Spring fest2020 spring-security
土岐 孝平
Microserviceの今どきのインフラを探る
Microserviceの今どきのインフラを探る
土岐 孝平
OpenID Connect入門
OpenID Connect入門
土岐 孝平
Springを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしよう
土岐 孝平
業務システムとマイクロサービス
業務システムとマイクロサービス
土岐 孝平
試験にでるSpring
試験にでるSpring
土岐 孝平
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
土岐 孝平
vFabricを触ろう
vFabricを触ろう
土岐 孝平
More from 土岐 孝平
(10)
What's new in Spring Boot 2.6 ?
What's new in Spring Boot 2.6 ?
SpringベースのCloud Native Application
SpringベースのCloud Native Application
Spring fest2020 spring-security
Spring fest2020 spring-security
Microserviceの今どきのインフラを探る
Microserviceの今どきのインフラを探る
OpenID Connect入門
OpenID Connect入門
Springを使ったwebアプリにリファクタリングしよう
Springを使ったwebアプリにリファクタリングしよう
業務システムとマイクロサービス
業務システムとマイクロサービス
試験にでるSpring
試験にでるSpring
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
vFabricを触ろう
vFabricを触ろう
これからSpringを使う開発者が知っておくべきこと
1.
1 これからSpringを使う開発者が 知っておくべきこと 2018/10/31 日本Springユーザ会 土岐 孝平 ハッシュタグ: #sf_11
2.
自己紹介 • 土岐 孝平 •
Springを使用したシステム開発の支援 • JavaやSpringの研修の講師 • 書籍の執筆 2 [改訂新版]Spring入門
3.
はじめに • 想定する聴講者 – Springを使ったプロジェクトに参加しているけれど、 Springの「おまじない」が何のためなのか分かっていない •
@Serviceって何?@Autowiredって何? • 一応動いているけど、おかしな使い方になってないだ ろうか? • 発表の趣旨 – Springの初心者が疑問に思ったり、おかしな使い方をし てしまいがちなところをピックアップして説明。 – 実プロジェクトで活かしてほしい。 – Springを学習するとっかかりになってほしい。 3
4.
アジェンダ • 「おまじない」がやっていること – @Serviceや@Autowiredがやっていること –
@Transactionalの裏側 • おかしな作りになっていませんか? – スレッドセーフになっていますか? – トランザクションの入れ子はうまくできていますか ? – トレースログを明示的に出力していませんか? 4
5.
「おまじない」がやっているこ と 5
6.
「@Service」の意味 • 「Springにオブジェクトを作ってもらって、DIコンテナ※1で管理 してほしい」と宣言するアノテーション • DIコンテナ起動時に、DIコンテナで管理された状態になる。 •
DIコンテナで管理されたオブジェクトのことを、Beanと呼ぶ。 6 DIコンテナ FooServiceオブジェクト ※1:DIコンテナ Springが提供するオブジェクトの入れ物。DIコンテナでオブジェクトを管理す ると、DIやAOPの機能を利用することができる。 @Service FooServiceクラス Bean
7.
似たようなアノテーション 7 • @Service以外にも、Beanにしてもらえるアノテーションがあ る • これらのアノテーションのことを、「ステレオタイプアノテーショ ン」という。 •
コンポーネントスキャン※がどこかで指示されてる必要がある 種類 付加機能 使い分け @Controller Spring MVCと連携できる Controllerの役割のクラスに付 与する @Service なし Service(業務ロジック)の役割の クラスに付与 @Repository スローした例外を、Springの 例外に変換してくれる データアクセス(Daoなど)の役割 のクラスに付与 @Component なし 上記以外の役割のクラスに付与 ※コンポーネントスキャン:ステレオタイプアノテーションが付いたクラスを探すSpringの 行為。指定されたパッケージ配下を探す。
8.
≪参考≫Beanにしてもらうための手段 • ステレオタイプアノテーション • JavaConfig •
XML 8 DIコンテナ FooServiceオブジェクト 結果は同じ!!
9.
「@Autowired」の意味 • よくある「誤った」認識 – FooDaoのオブジェクト(依存するオブジェクト)を、 @Autowiredで「生成」している。 9 FooServiceオブジェクト FooDaoオブジェクトfooDao
new演算子 @Autowired
10.
「@Autowired」の「正しい」認識 • 「他のBeanをインジェクションしてほしい」と宣言す るアノテーション • インジェクション:依存するオブジェクトを、自分で作 ったり探したりせずに、誰か(Springの場合だとDIコ ンテナ)に渡してもらうこと。 10 FooServiceオブジェクト FooDaoオブジェクト fooDao DIコンテナ オブジェクトを生成している訳 ではない @Autowired
11.
複数のBeanにインジェクションも可能 11 BarServiceオブジェクト fooDao FooServiceオブジェクト fooDao FooDaoオブジェクトDIコンテナ @Autowired @Autowired
12.
「@Transactional」の意味 • 「このクラスの持ってるメソッド(private以外)で、DBのト ランザクション制御をしてほしい」と宣言するアノテー ション※ 12 FooServiceオブジェクト abcメソッド()FooControllerオブジェクト DB begin commit
/rollback ※個別のメソッドに@Transactionalを付けることも可能
13.
トランザクション制御の仕組み • SpringのAOPによってトランザクション制御を行う「Proxy」が自動生成されている • 「Proxy」は、Serviceと同じメソッドを持っている。 •
Controllerにインジェクションされてるオブジェクトは、Proxyである。 13 abc Controller Proxy Service Dao データアクセ ス機能 abc SQL ThreadLocal Connection connect、begin commit/rollback、close SQL
14.
ここまでのまとめ • @Service – 「オブジェクトを作ってDIコンテナで管理してほしい」とお 願いするアノテーション –
「ステレオタイプアノテーション」の1つ • @Autowired – 「依存するオブジェクトをインジェクションしてほしい」とお 願いするするアノテーション • @Transactional – 「DBのトランザクション制御をしてほしい」と宣言するアノ テーション – 内部では「Proxy」が生成されている。 14
15.
おかしな作りになっていません か? 15
16.
スレッドセーフになっていますか? • スレッドセーフとは? – 複数のスレッドで同時に処理されても安全なこと。 •
Bean(Springが管理するオブジェクト)は原則シングルトン※1 なので、複数のスレッドが1つのオブジェクトのメソッドを呼び 出す。 16 スレッドB オブジェクト abcメソッド ※1:シングルトン 1つのオブジェクトを使いまわすこと 複数のスレッドが1つのオ ブジェクトのメソッドを呼び 出す
17.
Webアプリケーションの場合 • 1つのController・Service・Daoのオブジェクトが複数のリク エストの処理を同時に行う。 • リクエストごとに別のオブジェクトが使われる訳ではない 17 FooController
FooService FooDaoリクエストB リクエストA リクエストB リクエストC FooController FooService FooDao FooController FooService FooDao FooController FooService FooDao
18.
スレッドセーフではないアプリ • スレッド個別のデータをフィールド(インスタンス変数) で保持している 18 スレッドB FooService totalPrice calclateOrderPriceメソッド ? 【NGな作り】
19.
スレッドセーフなオブジェクトにするには? • スレッド個別のデータをローカル変数で保持すればよい。 – ローカル変数は、メソッドが呼び出される度に個別の変数になる 19 スレッドB FooService calclateOrderPriceメソッド 【OKな作り】
20.
≪補足≫Beanにすべきではないクラス • SpringのBeanはシングルトンが原則なので、処理 毎にフィールドの値が変わるような役割のオブジェク トはBeanにしない。 – EntityやDTOなど 20 処理の度にオブジェクトが作られて 固有のデータがフィールドに格納される
21.
トランザクションの入れ子はうまくできていますか? • トランザクションの入れ子とは? – ここでは、あるトランザクションの中で、別のトランザクショ ンを制御すること –
利用シーン • バッチ処理で、切りのいい単位でコミットする • 採番テーブルの更新 • アクセス監査テーブルの更新 21 abcメソッド { 処理A 処理B 処理C 処理D } 外側のトランザクション 内側のトランザクション
22.
やってしまいがちな誤り • メソッドを分けて@Transactionalを付与する 22 @Transactional abcメソッド { 処理A defメソッド(); 処理D } @Transactional(propagation =Propagation.REQUIRES_NEW) defメソッド{ 処理B 処理C } しかし、defメソッドを呼び出しても、 別のトランザクションは開始されない。 (外側のトランザクションに含まれてしまう) 理由は次のページ
23.
Proxyが処理を経由できない • 内部メソッドの呼び出しは、Proxyの処理を経由しな いため、新たなトランザクションは開始されない。 23 abc Controller Proxy
Service abc connect、begin commit/rollback、close Proxyを経由せずに 呼び出している def
24.
解決策(1/2) • 解決策A:クラスを分割する 24 @Transactional abcメソッド { 処理A barService.defメソッド(); 処理D } @Transactional(propagation =Propagation.REQUIRES_NEW) defメソッド{ 処理B 処理C } FooService
BarService abc Controller ProxyA FooService abc connect、begin commit/rollback、close def ProxyB BarService def connect、begin commit/rollback、close
25.
解決策(2/2) • 解決策B:TransactionTemplateクラスを利用して、 メソッドの中で明示的にトランザクションを開始・終 了する – 詳細はSpringのマニュアルを参照。 25 @Transactional abcメソッド
{ 処理A new TransactionTemplate(...).execute( new TransactionCallback(...) { 処理B 処理C } ); 処理D } プログラムのイメージ
26.
≪補足≫トランザクション制御のログを出力する方法 • トランザクションマネージャーの実装クラスのロガーをDEBUGレベルに する – トランザクションマネージャー:下位レベルのAPIを使って実際にトランザクシ ョンの指示を出すオブジェクト –
データアクセス技術によって実装クラスが異なる • DataSourceTransactionManager • JpaTransactionManager など – ログの内容 26 logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG 【SpringBootのapplication.propertiesで指定した例】
27.
トレースログを明示的に出力していませんか? • ソースコードの可読性が落ちる。 • 異常終了時のログを出力したいがためにtry・catch・ throwを記述している。 –
throwを忘れて例外を握りつぶすバグの可能性もでてくる 27
28.
• SpringのAOPを利用する 解決策 28 abc Controller Proxy
Service abc ログ出力 ログ出力 ワイルドカードを使って 複数のメソッドに適用 可読性が上がり、 バグも潜みにくい ControllerやDaoに 適用することも可能
29.
ここまでのまとめ • Beanはスレッドセーフにする – フィールドにスレッド個別のデータを保持しない •
トランザクションの入れ子に注意 – 内部メソッドを呼び出してもトランザクションは開始されな い • クラスを分ける or TransactionTemplateを利用 • トレースログを個別のクラスで出力しない – AOPを利用する。 29
30.
おすすめの資料 • SlideShare「今さら聞けないDIとSpring」 – https://www.slideshare.net/KouheiToki/dispring •
SlideShare「これから始めるSpringのwebアプリケーション」 – https://www.slideshare.net/KouheiToki/springweb-82685380 • SlideShare「Springを何となく使ってる人が抑えるべきポイント」 – https://www.slideshare.net/KouheiToki/spring-66768974 30
31.
31 ご清聴ありがとうございました
32.
32 ライセンスについて • JSUGマスコットアイコン(本スライド左下)が残されている場合に限り、本作品(またそれを元にした派生 作品)の複製・頒布・表示・上演を認めます。 • 非商用目的に限り、本作品(またそれを元にした派生作品)の複製・頒布・表示・上演を認めます。 •
本作品のライセンスを遵守する限り、派生作品を頒布することを許可します。
Download now