Start
Entdecken
Suche senden
Hochladen
Einloggen
Registrieren
Anzeige
Check these out next
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
SpringBootTest入門
Yahoo!デベロッパーネットワーク
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
Spring Fest 2018 Spring Bootで作るRESTful Web Service
WataruOhno
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo!デベロッパーネットワーク
Spring超入門-Springと出会ってから1年半-
Ryosuke Uchitate
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
1
von
32
Top clipped slide
これからSpringを使う開発者が知っておくべきこと
31. Oct 2018
•
0 gefällt mir
15 gefällt mir
×
Sei der Erste, dem dies gefällt
Mehr anzeigen
•
19,900 Aufrufe
Aufrufe
×
Aufrufe insgesamt
0
Auf Slideshare
0
Aus Einbettungen
0
Anzahl der Einbettungen
0
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Melden
Software
Springの初心者が疑問に思ったり、おかしな使い方をしてしまいがちなところをピックアップして説明します。
土岐 孝平
Folgen
Springの研修、開発支援 um 合同会社 現場指向
Anzeige
Anzeige
Anzeige
Recomendados
Springを何となく使ってる人が抑えるべきポイント
土岐 孝平
24.7K Aufrufe
•
18 Folien
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
23.3K Aufrufe
•
60 Folien
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
86.3K Aufrufe
•
66 Folien
これから始めるSpringのwebアプリケーション
土岐 孝平
19K Aufrufe
•
38 Folien
今さら聞けないDiとspring
土岐 孝平
24.6K Aufrufe
•
50 Folien
Spring fest2020 spring-security
土岐 孝平
1.3K Aufrufe
•
22 Folien
Más contenido relacionado
Presentaciones para ti
(20)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
•
7.2K Aufrufe
SpringBootTest入門
Yahoo!デベロッパーネットワーク
•
12.5K Aufrufe
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
•
16.6K Aufrufe
Spring Fest 2018 Spring Bootで作るRESTful Web Service
WataruOhno
•
9.5K Aufrufe
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo!デベロッパーネットワーク
•
11.1K Aufrufe
Spring超入門-Springと出会ってから1年半-
Ryosuke Uchitate
•
4.3K Aufrufe
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
•
39.4K Aufrufe
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
•
2K Aufrufe
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
Masatoshi Tada
•
29.6K Aufrufe
クラウド時代だからSpring-Retryフレームワーク
Y Watanabe
•
3.2K Aufrufe
Spring Boot ユーザの方のための Quarkus 入門
tsukasamannen
•
561 Aufrufe
例外設計における大罪
Takuto Wada
•
66.4K Aufrufe
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
•
82.4K Aufrufe
Spring Bootをはじめる時にやるべき10のこと
心 谷本
•
41.7K Aufrufe
SQL大量発行処理をいかにして高速化するか
Shogo Wakayama
•
56.5K Aufrufe
Redisの特徴と活用方法について
Yuji Otani
•
98.6K Aufrufe
世界一わかりやすいClean Architecture
Atsushi Nakamura
•
45.2K Aufrufe
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
JustSystems Corporation
•
22.4K Aufrufe
AWSのログ管理ベストプラクティス
Akihiro Kuwano
•
75.2K Aufrufe
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
Jun-ichi Sakamoto
•
21.2K Aufrufe
Similar a これからSpringを使う開発者が知っておくべきこと
(20)
「JJUG運営の戦略と戦術」 JJUG CCC 2016 Spring 基調講演
Yusuke Suzuki
•
10.3K Aufrufe
エッセンシャルCore springハンズオン
土岐 孝平
•
2.2K Aufrufe
「Agileごっこ」で終わらせないために(仮)
Taku Yajima
•
2.1K Aufrufe
概念モデルって難しいですよね
Takuya Kawabe
•
7K Aufrufe
Spring4-DevLove発表資料
Yuichi Hasegawa
•
3.4K Aufrufe
CodeGrid2周年記念パーティ_ライトニングトーク_アジャイル開発
Yasuyuki Fujikawa
•
809 Aufrufe
大学生のTwitter利用に関する定量分析―利用目的とサービス設計の関係―
Hisao Soyama
•
15.9K Aufrufe
プログラミングのお勉強としてscratchをさわってみた
HirokiIwanaga
•
876 Aufrufe
Spring知っておきたい
Yuichi Hasegawa
•
4K Aufrufe
「本を書くプロジェクトマネジメントはWbsかアジャイルか」 XP祭り2015
Fumitaka Inayama
•
8.6K Aufrufe
MicroserviceでのNoOps戦略 - NoOps Meetup Tokyo #2 #NoOpsJP
Yusuke Suzuki
•
8.6K Aufrufe
JANOG32 - 運用チームの作り方
Chika Yoshimura
•
861 Aufrufe
アジャイル開発やってみた
Arata Fujimura
•
2.3K Aufrufe
リーンスタートアップ、アジャイル開発導入事例
Arata Fujimura
•
3.6K Aufrufe
はじめてのスクラム開発
ai oshiumi
•
771 Aufrufe
ペーパークラフトで学ぶフィードバックと改善(鬼)
You&I
•
1.6K Aufrufe
イノベーションスプリント2011 infragisticsにおける世界分散アジャイル開発事例~ communication matters ~
InnovationSprint2011
•
1K Aufrufe
アジャイルの本質 - Agile Japan 2019サテライト名古屋
hiroyuki Yamamoto
•
718 Aufrufe
An Agile Way As an SET at LINE ~プロダクトオーナーシップ編~
LINE Corporation
•
3.7K Aufrufe
アジャイルによくきく?モデリング
Iwao Harada
•
1.8K Aufrufe
Anzeige
Más de 土岐 孝平
(8)
What's new in Spring Boot 2.6 ?
土岐 孝平
•
1.2K Aufrufe
SpringベースのCloud Native Application
土岐 孝平
•
272 Aufrufe
Microserviceの今どきのインフラを探る
土岐 孝平
•
652 Aufrufe
OpenID Connect入門
土岐 孝平
•
1.7K Aufrufe
業務システムとマイクロサービス
土岐 孝平
•
1.4K Aufrufe
試験にでるSpring
土岐 孝平
•
5K Aufrufe
Spring3.1概要 データアクセスとトランザクション処理
土岐 孝平
•
17.7K Aufrufe
vFabricを触ろう
土岐 孝平
•
1.7K Aufrufe
Último
(20)
①【利兹贝克特大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 Aufrufe
測量データ処理システム「MarineDiscoveryクラウド」の紹介
ssuserbceee8
•
56 Aufrufe
留信网认证可查【俄亥俄大学文凭证书毕业证购买】
1lkjhg
•
2 Aufrufe
留信网认证可查【艾格伍学院文凭证书毕业证购买】
32lkhng
•
2 Aufrufe
☀️【萨德伯里大学毕业证成绩单留学生首选】
15sad
•
2 Aufrufe
☀️《USD毕业证仿真》
jjkjkijk
•
2 Aufrufe
留信网认证可查【堪萨斯大学文凭证书毕业证购买】
1lkjhg
•
2 Aufrufe
留信网认证可查【萨福克大学文凭证书毕业证购买】
hh123hh1
•
3 Aufrufe
留信网认证可查【罗德岛大学文凭证书毕业证购买】
1lkjhg
•
3 Aufrufe
留信网认证可查【威得恩大学文凭证书毕业证购买】
32lkhng
•
2 Aufrufe
キレイなコードって.pdf
shumashimo1
•
12 Aufrufe
☀️【密德萨斯大学毕业证成绩单留学生首选】
25mjhd12
•
6 Aufrufe
☀️《URI毕业证仿真》
sada332
•
2 Aufrufe
①【劳里埃大学毕业证文凭学位证书|工艺完美复刻】
love445ds
•
2 Aufrufe
Jitera Inc.Company presentation_v5.pdf
SoshiSuzuki2
•
224 Aufrufe
在哪里可以做《邦德大学文凭证书|毕业证》
kjds1245
•
2 Aufrufe
留信网认证可查【马努卡理工学院文凭证书毕业证购买】
ihh14ds
•
2 Aufrufe
留信网认证可查【麻省大学洛威尔分校文凭证书毕业证购买】
hh123hh1
•
2 Aufrufe
在哪里可以做《俄克拉荷马大学文凭证书|毕业证》
lobd15
•
2 Aufrufe
測量支援ソフト「みとおしえ」「みとおしえクラウド」の紹介
ssuserbceee8
•
59 Aufrufe
Anzeige
これからSpringを使う開発者が知っておくべきこと
1 これからSpringを使う開発者が 知っておくべきこと 2018/10/31 日本Springユーザ会 土岐 孝平 ハッシュタグ: #sf_11
自己紹介 • 土岐 孝平 •
Springを使用したシステム開発の支援 • JavaやSpringの研修の講師 • 書籍の執筆 2 [改訂新版]Spring入門
はじめに • 想定する聴講者 – Springを使ったプロジェクトに参加しているけれど、 Springの「おまじない」が何のためなのか分かっていない •
@Serviceって何?@Autowiredって何? • 一応動いているけど、おかしな使い方になってないだ ろうか? • 発表の趣旨 – Springの初心者が疑問に思ったり、おかしな使い方をし てしまいがちなところをピックアップして説明。 – 実プロジェクトで活かしてほしい。 – Springを学習するとっかかりになってほしい。 3
アジェンダ • 「おまじない」がやっていること – @Serviceや@Autowiredがやっていること –
@Transactionalの裏側 • おかしな作りになっていませんか? – スレッドセーフになっていますか? – トランザクションの入れ子はうまくできていますか ? – トレースログを明示的に出力していませんか? 4
「おまじない」がやっているこ と 5
「@Service」の意味 • 「Springにオブジェクトを作ってもらって、DIコンテナ※1で管理 してほしい」と宣言するアノテーション • DIコンテナ起動時に、DIコンテナで管理された状態になる。 •
DIコンテナで管理されたオブジェクトのことを、Beanと呼ぶ。 6 DIコンテナ FooServiceオブジェクト ※1:DIコンテナ Springが提供するオブジェクトの入れ物。DIコンテナでオブジェクトを管理す ると、DIやAOPの機能を利用することができる。 @Service FooServiceクラス Bean
似たようなアノテーション 7 • @Service以外にも、Beanにしてもらえるアノテーションがあ る • これらのアノテーションのことを、「ステレオタイプアノテーショ ン」という。 •
コンポーネントスキャン※がどこかで指示されてる必要がある 種類 付加機能 使い分け @Controller Spring MVCと連携できる Controllerの役割のクラスに付 与する @Service なし Service(業務ロジック)の役割の クラスに付与 @Repository スローした例外を、Springの 例外に変換してくれる データアクセス(Daoなど)の役割 のクラスに付与 @Component なし 上記以外の役割のクラスに付与 ※コンポーネントスキャン:ステレオタイプアノテーションが付いたクラスを探すSpringの 行為。指定されたパッケージ配下を探す。
≪参考≫Beanにしてもらうための手段 • ステレオタイプアノテーション • JavaConfig •
XML 8 DIコンテナ FooServiceオブジェクト 結果は同じ!!
「@Autowired」の意味 • よくある「誤った」認識 – FooDaoのオブジェクト(依存するオブジェクト)を、 @Autowiredで「生成」している。 9 FooServiceオブジェクト FooDaoオブジェクトfooDao
new演算子 @Autowired
「@Autowired」の「正しい」認識 • 「他のBeanをインジェクションしてほしい」と宣言す るアノテーション • インジェクション:依存するオブジェクトを、自分で作 ったり探したりせずに、誰か(Springの場合だとDIコ ンテナ)に渡してもらうこと。 10 FooServiceオブジェクト FooDaoオブジェクト fooDao DIコンテナ オブジェクトを生成している訳 ではない @Autowired
複数のBeanにインジェクションも可能 11 BarServiceオブジェクト fooDao FooServiceオブジェクト fooDao FooDaoオブジェクトDIコンテナ @Autowired @Autowired
「@Transactional」の意味 • 「このクラスの持ってるメソッド(private以外)で、DBのト ランザクション制御をしてほしい」と宣言するアノテー ション※ 12 FooServiceオブジェクト abcメソッド()FooControllerオブジェクト DB begin commit
/rollback ※個別のメソッドに@Transactionalを付けることも可能
トランザクション制御の仕組み • SpringのAOPによってトランザクション制御を行う「Proxy」が自動生成されている • 「Proxy」は、Serviceと同じメソッドを持っている。 •
Controllerにインジェクションされてるオブジェクトは、Proxyである。 13 abc Controller Proxy Service Dao データアクセ ス機能 abc SQL ThreadLocal Connection connect、begin commit/rollback、close SQL
ここまでのまとめ • @Service – 「オブジェクトを作ってDIコンテナで管理してほしい」とお 願いするアノテーション –
「ステレオタイプアノテーション」の1つ • @Autowired – 「依存するオブジェクトをインジェクションしてほしい」とお 願いするするアノテーション • @Transactional – 「DBのトランザクション制御をしてほしい」と宣言するアノ テーション – 内部では「Proxy」が生成されている。 14
おかしな作りになっていません か? 15
スレッドセーフになっていますか? • スレッドセーフとは? – 複数のスレッドで同時に処理されても安全なこと。 •
Bean(Springが管理するオブジェクト)は原則シングルトン※1 なので、複数のスレッドが1つのオブジェクトのメソッドを呼び 出す。 16 スレッドB オブジェクト abcメソッド ※1:シングルトン 1つのオブジェクトを使いまわすこと 複数のスレッドが1つのオ ブジェクトのメソッドを呼び 出す
Webアプリケーションの場合 • 1つのController・Service・Daoのオブジェクトが複数のリク エストの処理を同時に行う。 • リクエストごとに別のオブジェクトが使われる訳ではない 17 FooController
FooService FooDaoリクエストB リクエストA リクエストB リクエストC FooController FooService FooDao FooController FooService FooDao FooController FooService FooDao
スレッドセーフではないアプリ • スレッド個別のデータをフィールド(インスタンス変数) で保持している 18 スレッドB FooService totalPrice calclateOrderPriceメソッド ? 【NGな作り】
スレッドセーフなオブジェクトにするには? • スレッド個別のデータをローカル変数で保持すればよい。 – ローカル変数は、メソッドが呼び出される度に個別の変数になる 19 スレッドB FooService calclateOrderPriceメソッド 【OKな作り】
≪補足≫Beanにすべきではないクラス • SpringのBeanはシングルトンが原則なので、処理 毎にフィールドの値が変わるような役割のオブジェク トはBeanにしない。 – EntityやDTOなど 20 処理の度にオブジェクトが作られて 固有のデータがフィールドに格納される
トランザクションの入れ子はうまくできていますか? • トランザクションの入れ子とは? – ここでは、あるトランザクションの中で、別のトランザクショ ンを制御すること –
利用シーン • バッチ処理で、切りのいい単位でコミットする • 採番テーブルの更新 • アクセス監査テーブルの更新 21 abcメソッド { 処理A 処理B 処理C 処理D } 外側のトランザクション 内側のトランザクション
やってしまいがちな誤り • メソッドを分けて@Transactionalを付与する 22 @Transactional abcメソッド { 処理A defメソッド(); 処理D } @Transactional(propagation =Propagation.REQUIRES_NEW) defメソッド{ 処理B 処理C } しかし、defメソッドを呼び出しても、 別のトランザクションは開始されない。 (外側のトランザクションに含まれてしまう) 理由は次のページ
Proxyが処理を経由できない • 内部メソッドの呼び出しは、Proxyの処理を経由しな いため、新たなトランザクションは開始されない。 23 abc Controller Proxy
Service abc connect、begin commit/rollback、close Proxyを経由せずに 呼び出している def
解決策(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
解決策(2/2) • 解決策B:TransactionTemplateクラスを利用して、 メソッドの中で明示的にトランザクションを開始・終 了する – 詳細はSpringのマニュアルを参照。 25 @Transactional abcメソッド
{ 処理A new TransactionTemplate(...).execute( new TransactionCallback(...) { 処理B 処理C } ); 処理D } プログラムのイメージ
≪補足≫トランザクション制御のログを出力する方法 • トランザクションマネージャーの実装クラスのロガーをDEBUGレベルに する – トランザクションマネージャー:下位レベルのAPIを使って実際にトランザクシ ョンの指示を出すオブジェクト –
データアクセス技術によって実装クラスが異なる • DataSourceTransactionManager • JpaTransactionManager など – ログの内容 26 logging.level.org.springframework.jdbc.datasource.DataSourceTransactionManager=DEBUG 【SpringBootのapplication.propertiesで指定した例】
トレースログを明示的に出力していませんか? • ソースコードの可読性が落ちる。 • 異常終了時のログを出力したいがためにtry・catch・ throwを記述している。 –
throwを忘れて例外を握りつぶすバグの可能性もでてくる 27
• SpringのAOPを利用する 解決策 28 abc Controller Proxy
Service abc ログ出力 ログ出力 ワイルドカードを使って 複数のメソッドに適用 可読性が上がり、 バグも潜みにくい ControllerやDaoに 適用することも可能
ここまでのまとめ • Beanはスレッドセーフにする – フィールドにスレッド個別のデータを保持しない •
トランザクションの入れ子に注意 – 内部メソッドを呼び出してもトランザクションは開始されな い • クラスを分ける or TransactionTemplateを利用 • トレースログを個別のクラスで出力しない – AOPを利用する。 29
おすすめの資料 • 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 ご清聴ありがとうございました
32 ライセンスについて • JSUGマスコットアイコン(本スライド左下)が残されている場合に限り、本作品(またそれを元にした派生 作品)の複製・頒布・表示・上演を認めます。 • 非商用目的に限り、本作品(またそれを元にした派生作品)の複製・頒布・表示・上演を認めます。 •
本作品のライセンスを遵守する限り、派生作品を頒布することを許可します。
Anzeige