Slide 1

Slide 1 text

"おまじない"はもう卒業! デバッガで探るSpring Bootの裏側と「学び方」の学び方 2025/11/15 JJUG CCC 2025 Fall #jjug_ccc_i 竹内 雅和 (@tm0920.bsky.social)

Slide 2

Slide 2 text

自己紹介 ・竹内 雅和 ・入社6年目 ・主にバックエンド担当 ・フロント/クラウドもちょっと触る ・Springの経験は3年くらい ・Bluesky:@tm0920.bsky.social ■ 今回の資料 ↓

Slide 3

Slide 3 text

目次 ● 学びの停滞感について ● ググっても解決しない問題との遭遇 ● Springの基礎 ● デバッグのコツ ● まとめ

Slide 4

Slide 4 text

学びの停滞感について ● ”おまじない” ● 「中級者への壁」

Slide 5

Slide 5 text

”おまじない” ● @Autowired をつけると DIされる ● @Transactional をつけるとトランザクションできる ● @Controller, @Service … ● Service 層を実装するときは必ず IF を定義する

Slide 6

Slide 6 text

「中級者への壁」 ● なぜ動くのか、説明できない ● チュートリアル レベルの学習は終えた。 ● 応用的な実装や、原因不明のエラーに遭遇すると手が止まる。 ● ググっても、自分のケースに合う答えがなかなか見つからない…。 次に何をどう学べば良いの?

Slide 7

Slide 7 text

ググっても解決しない問題との遭遇 ● 一般的に想定されるアプリとDB ● 今回のPJのアプリとDB ● ググってみても…。 ● Mapperから先の処理が全く分からない…。 ● 挫折ポイント

Slide 8

Slide 8 text

一般的に想定されるアプリとDB 接続先のDBは固定

Slide 9

Slide 9 text

今回のPJのアプリとDB ユーザー毎に接続先のDBが違う

Slide 10

Slide 10 text

ググってみても…。 ● AbstractRoutingDataSource というクラスを使うらしい…。 ● 自分の環境では上手く動かない…。 ● 記事に書いてある説明の内容が全く分からない…。 Datasource、SpringManagedTransaction …???

Slide 11

Slide 11 text

Mapper から先の処理が全く分からなかった

Slide 12

Slide 12 text

背後に何かいる

Slide 13

Slide 13 text

ここを調べるには?

Slide 14

Slide 14 text

挫折ポイント(普通にデバッグしても追えない) MapperはInterfaceで定義 このメソッドを実装しているクラス?

Slide 15

Slide 15 text

挫折ポイント(普通にデバッグしても追えない) @Autowired で DIされて Mapperの実装クラスが入っているは ず。 ここにブレークポイント & ステップイン すれば良いのでは?

Slide 16

Slide 16 text

挫折ポイント(普通にデバッグしても追えない) UserMapperは…? updateOne() は…? invoke() なんて呼んでませ んけど…?

Slide 17

Slide 17 text

挫折ポイント(普通にデバッグしても追えない) UserMapperは…? updateOne() は…? invoke() なんて呼んでませ んけど…? 普通にデバッグしても追えない…

Slide 18

Slide 18 text

Springの基礎を知る ● IoCとは ● AOPとは ● AOPを実現する仕組み

Slide 19

Slide 19 text

IoC とは ※ 参考:『Spring 徹底入門』(株式会社NTTデータ 著)

Slide 20

Slide 20 text

IoC とは ※ 参考:『Spring 徹底入門』(株式会社NTTデータ 著)

Slide 21

Slide 21 text

IoC とは ※ 参考:『Spring 徹底入門』(株式会社NTTデータ 著)

Slide 22

Slide 22 text

AOP とは ※ 参考:Spring AOP Tutorial for Beginners - Step by Step with Example https://www.javaguides.net/2019/05/understanding-spring-aop-concepts-and-terminology-with-example.html

Slide 23

Slide 23 text

AOP とは ※ 参考:Spring AOP Tutorial for Beginners - Step by Step with Example https://www.javaguides.net/2019/05/understanding-spring-aop-concepts-and-terminology-with-example.html

Slide 24

Slide 24 text

AOP とは ※ 参考:Spring AOP Tutorial for Beginners - Step by Step with Example https://www.javaguides.net/2019/05/understanding-spring-aop-concepts-and-terminology-with-example.html

Slide 25

Slide 25 text

AOP とは ※ 参考:Spring AOP Tutorial for Beginners - Step by Step with Example https://www.javaguides.net/2019/05/understanding-spring-aop-concepts-and-terminology-with-example.html

Slide 26

Slide 26 text

AOP とは

Slide 27

Slide 27 text

AOPとは ※ 参考:『Spring 徹底入門』(株式会社NTTデータ 著)

Slide 28

Slide 28 text

AOPを実現する仕組み ・IoCが管理するオブジェクト ( Bean )に対して、 AOPの実装を埋め込んでいる ・アプリからBeanを取得する時、Bean のインスタンスそのものではなく、 Proxyでラップされた状態で取得され る。 ・Beanの処理を呼ぶ時に Proxyを経由して、AOPの処理を実行 している。 ※ 参考:『Spring 徹底入門』(株式会社NTTデータ 著)

Slide 29

Slide 29 text

仕組みを踏まえた上で処理を見ていく ● Mapperから先の処理を見ていく ● デバッグのコツ ● デバッグを通して分かったこと

Slide 30

Slide 30 text

Mapperから先の処理を見ていく UserMapperは…? updateOne() は…? invoke() なんて呼んでませ んけど…?

Slide 31

Slide 31 text

Mapperから先の処理を見ていく UserMapperがラップされ たProxy Proxyのメソッドが呼ばれて る

Slide 32

Slide 32 text

デバッグのコツ ● スタックトレースを読む ● 変数を見る ● ブレークポイントを貼ってみる ● ステップ実行もしつつ繰り返して…

Slide 33

Slide 33 text

スタックトレースを読む

Slide 34

Slide 34 text

スタックトレースを読む

Slide 35

Slide 35 text

ブレークポイントを貼ってみる

Slide 36

Slide 36 text

変数を見てみる

Slide 37

Slide 37 text

ステップ実行もしつつ繰り返して…

Slide 38

Slide 38 text

BaseExecutor の update() を呼び出す

Slide 39

Slide 39 text

SimpleExecutor の doUpdate() を呼び出す

Slide 40

Slide 40 text

SimpleExecutor の prepareStatement() を呼び出す

Slide 41

Slide 41 text

BaseExecutor の getConnection() を呼び出す

Slide 42

Slide 42 text

SpringManagedTransaction の getConnection() を呼び出す

Slide 43

Slide 43 text

SpringManagedTransaction の openConnection() を呼び出す

Slide 44

Slide 44 text

DataSourceUtils の getConnection() を呼び出す

Slide 45

Slide 45 text

DataSourceUtils の doGetConnection() を呼び出す

Slide 46

Slide 46 text

DataSourceUtils の fetchConnection() を呼び出す

Slide 47

Slide 47 text

HikariDataSource の getConnection() を呼び出す

Slide 48

Slide 48 text

HikariPool の getConnection()を呼び出す

Slide 49

Slide 49 text

HikariPool の getConnection()を呼び出す

Slide 50

Slide 50 text

PoolEntry の createProxyConnection()を呼び出す

Slide 51

Slide 51 text

ProxyFactory の getProxyConnection()を呼び出す

Slide 52

Slide 52 text

HikariProxyConnectionのインスタンスを生成 ※ 一旦、呼び出し元を辿って戻ります。

Slide 53

Slide 53 text

RoutingStatementHandler の update() を呼び出す

Slide 54

Slide 54 text

PreparedStatementHandler の update() を呼び出す

Slide 55

Slide 55 text

PreparedStatementLogger の execute() を呼び出す

Slide 56

Slide 56 text

ProxyPreparedStatement の execute() を呼び出す

Slide 57

Slide 57 text

JdbcPreparedStatement の execute() を呼び出す

Slide 58

Slide 58 text

Command の executeUpdate() が呼ばれてSQLが実行される

Slide 59

Slide 59 text

デバッグを通して分かったこと ● Mapperのメソッドが呼ばれてからSQLが実行されるまでの処理の流れ。 ● DBとの接続(Connection)は DataSource の実装クラスで行われていること。 ○ AbstractRoutingDataSource は DataSource を実装した AbstractDataSourceを継承したクラス

Slide 60

Slide 60 text

【まとめ】フレームワークの裏側を探る『学び方』 ● 例外をわざと発生させて、スタックトレースを読む。 ● IDEのステップ実行と変数を参照して 内部のコードを追っていく。 ● 内部のコードを追った後だと、技術記事の理解度が格段に上がる! ● 「ステップアウト」で呼び出し元を辿って、 処理の流れを整理するのがオススメ。 ● フレームワークの基礎的な設計思想を簡単に知っておくと デバッグしやすい。 ● 「おまじないだから…」から少しずつ脱却していきましょう!

Slide 61

Slide 61 text

ご清聴ありがとうございました 質疑応答(例) ● 前提知識として読んでおくと良い Springの公式ドキュメントや書籍? ● 効率的に「当たり」をつけるためのコツ? (何でもどうぞ…!) (アンケートも書いてほしい…🙏→) 今回の資料 ↓ 全体アンケート↓ セッションアンケート↓