Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DBFlute bridges between DB and App
Search
jflute
October 17, 2015
Programming
1
2.8k
DBFlute bridges between DB and App
at JPOUG> SET EVENTS 20151017
jflute
October 17, 2015
Tweet
Share
More Decks by jflute
See All by jflute
How Unext took in Eclipse Collections in FW
jflute
0
670
How to fork Seasar (LastaFlute)
jflute
0
150
LastaFlute First Impact
jflute
7
7.1k
Other Decks in Programming
See All in Programming
Beyond ORM
77web
7
960
Go の GC の不得意な部分を克服したい
taiyow
3
800
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
140
テスト自動化失敗から再挑戦しチームにオーナーシップを委譲した話/STAC2024 macho
ma_cho29
1
1.3k
[JAWS-UG横浜 #76] イケてるアップデートを宇宙いち早く紹介するよ!
maroon1st
0
480
Асинхронность неизбежна: как мы проектировали сервис уведомлений
lamodatech
0
840
ゆるやかにgolangci-lintのルールを強くする / Kyoto.go #56
utgwkk
2
400
Effective Signals in Angular 19+: Rules and Helpers
manfredsteyer
PRO
0
110
fs2-io を試してたらバグを見つけて直した話
chencmd
0
240
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
280
tidymodelsによるtidyな生存時間解析 / Japan.R2024
dropout009
1
790
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
110
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Mobile First: as difficult as doing things right
swwweet
222
9k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
YesSQL, Process and Tooling at Scale
rocio
169
14k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Making Projects Easy
brettharned
116
5.9k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
The Language of Interfaces
destraynor
154
24k
Transcript
DBをリファクタリングしよう、 DBとアプリの架け橋 DBFlute by 久保雅彦(jflute)
わたしはだれ? 久保 雅彦 (jflute) オープンソースプログラマー DBFluteの作者 jfluteの日記(http://d.hatena.ne.jp/jflute/) Twitter: @jflute / facebook:
dbflute 2 自己紹介
住んでるところ Java, JDBC, フレームワーク, DB設計, プログラマー教育 オープンソース 3 自己紹介
DBFluteとは? O/Rマッパー DB管理支援ツール 4 DBFluteとは?
DBFluteの特徴は? DB変更に強い 5 DBFluteとは?
DBFluteのターゲット BtoCなどのサービス開発 (事業会社) リーン・スタートアップ インクリメンタル開発 DB設計と実装の同時開発 ※ビジネスのための泥臭いツール 6 DBFluteとは?
… ふーん 7 DBFluteとは?
DBFluteは変えたい DBサイドとアプリサイドの 8 DBFluteとは? ギャップ
ギャップって? DBサイド:DB設計、インフラ アプリサイド:アプリ開発 互いが互いに責め合う(T∀T) 9 DBFluteとは?
DBサイドとアプリサイドの ギャップ その1 DB設計の意図が アプリ側に伝わらない 10 ギャップその1
アプリあるある どこにIndex貼ってあるのかわからない NotNull制約の外れてる理由がわからない どことどこをjoinすればいいのか… この区分値、何が入るの? 11 ギャップその1:DB設計の意図が伝わらない
アプリあるある 40.テーブル定義書フォルダに.xls発見、開く ウィルスチェック、開くまで待つ待つ 大量のシートで途方にくれる “エクセル シート移動 ショートカット”で検索 見たいテーブル見つけたー、…先輩通りすがる 「それ古いから見ない方がいいよ」 12
ギャップその1:DB設計の意図が伝わらない
というのから 卒業 13 ギャップその1:DB設計の意図が伝わらない
DBFluteはDBを伝える! テーブル定義を自動生成 (SchemaHTML) メンテナンス不要(DBコメント重視) 気楽に開けるHTML形式 DB定義をJavaDocコメントに DBコメントをJavaDocコメントに xlsは精神的距離が遠いが、JavaDocは近い 14
ギャップその1:DB設計の意図が伝わらない
SchemaHTML (テーブル一覧) 15 ギャップその1:DB設計の意図が伝わらない
SchemaHTML (テーブル詳細) 16 ギャップその1:DB設計の意図が伝わらない
DBサイドとアプリサイドの ギャップ その2 アプリ側の都合に関係なく DB変更される 17 ギャップその2
アプリあるある 気付いたらDB変わってて落ちてる 影響範囲ありすぎでデグレまくる ローカル開発用DBがめっちゃ古い 18 ギャップその2:DB変更される
DBFluteはDB変更につおい! タイプセーフAPI (ConditionBean) で DB変更の影響範囲検知 2WaySQLの外出しSQLを 一括実行で検知 最新DB構造の横展開を自動化 (ReplaceSchema) バッチ一発で、サクッとDB作り直し
テストデータの一元管理 19 ギャップその2:DB変更される
ConditionBean 20 FKラインを辿る旅 DBが綺麗であればあるほど 実装しやすくなる というインセンティブ ギャップその2:DB変更される
一括テスト実行できる 2WaySQL (OutsideSql) 21 ギャップその2:DB変更される
DBAの人も DB変更の影響規模を 探りやすい ローカルで試しに変えてみて バッチを叩けばOK 22 ギャップその2:DB変更される
DBサイドとアプリサイドの ギャップ その3 というか… DB変更の内容が アプリ側に伝わらない 23 ギャップその3
アプリあるある 何が変わったのかがわからない 直すべきところわからず放置 というかDBAも細かく伝えるの面倒 24 ギャップその3:DB変更が伝わらない
DBFluteはDB変更を伝える! HistoryHTMLで 履歴ドキュメントを自動生成 (自然と作られていくところがポイント) もちろん、 JavaDocコメントや SchemaHTMLも大活躍 25 ギャップその3:DB変更が伝わらない
HistoryHTML 26 ギャップその3:DB変更が伝わらない
プロシージャだって 27 ギャップその3:DB変更が伝わらない
DBサイドとアプリサイドの ギャップ その4 アプリが ぐるぐる回す (ぶーんぶーんばばーん!) 28 ギャップその4
チューニングあるある 一回のリクエストで300回のSQL 一個一個は速いので、頼まれても DB側の調整ではどうにもならない (jflute経験済み) 夜間バッチだと…ひぃぃぃー 29 ギャップその4:アプリがぐるぐる回す
フレームワークあるある getMemberStatus() された時に検索 List<Member> memberList = …(最初の検索) for (Member member
: memberList) { member.getMemberStatus() // ひぃぃぃー } getされた時に関連テーブルのデータを検索 いわゆる LazyLoad 機能 30 ギャップその4:アプリがぐるぐる回す
DBFluteは明文主義 データ取得したい関連テーブル明示 getメソッドでLazyLoadしない SQLの発行回数を数えるための 拡張ポイント (CallbackContext) 31 ギャップその4:アプリがぐるぐる回す
SQLの発行回数をログに …(σόοάϩάͷத) [request] lastaflute.dbflute.SQL_COUNT= {total=2, selectCB=2, entityUpdate=0 , queryUpdate=0, outsideSql=0,
procedure=0} … ※DBFluteͱ࿈ܞͨ͠WebϑϨʔϜϫʔΫ ʮLastaFluteʯʹͯ 32 ギャップその4:アプリがぐるぐる回す
発行しすぎ警告ログ …(ܯࠂϩάͷத) *Too many SQL executions: {total=81, selectCB=3, entityUpdate=78, queryUpdate=0,
outsideSql=0, procedure=0} ɹin ProductListAction.search() … ※DBFluteͱ࿈ܞͨ͠WebϑϨʔϜϫʔΫ ʮLastaFluteʯʹͯ 33 ギャップその4:アプリがぐるぐる回す
こういう視点も DBの問題はDBだけでは 解決できない ↓ Webフレームワーク との連携も大切 34 ギャップその4:アプリがぐるぐる回す
ちなみに SQLをべたっと書けばぐるぐるが消える というのはまちがい ↓↓↓ プログラム上でSQLを組み立てづらい環 境だからこそ面倒になってぐるぐるする ↓↓↓ LazyLoadしなくて、 SQLを組み立てやすいツール の方が防げきやすい
(無論100%防げるわけではないが比較的) 35 ギャップその4:アプリがぐるぐる回す
DBサイドとアプリサイドの ギャップ その5 本番と結合と開発で、 スキーマ構造が違う! 36 ギャップその5
アプリ, DBAあるある 落ちた ↓ 調べる ↓ 本番DB違う 37 Alter書いた ↓
Index書き忘れた ↓ 実行し忘れた ギャップその5:本番とスキーマちっがーう
スタートアップあるある まず、ズレる (毎週のようにDB変更しますから…) 38 ギャップその5:本番とスキーマちっがーう
DBFluteは差分大好き HistoryHTMLでDB変更の歴史 AlterCheckで Alter文の整合性チェック SchemaSyncCheckで 二つのDBの差分チェック DB差分御三家を呼ぶ 39 ギャップその5:本番とスキーマちっがーう
AlterCheckの方程式 前のDB + 差分DDL = 最新のフルDDL 40 ギャップその5:本番とスキーマちっがーう
AlterCheckの流れ 1. 前のDB (フルDDL) を保存 by DBFlute 2. 普通にDB変更 by
ERD 3. Alter文を書く by 人類 4. フルDDLを吐き出して… by ERD 5. 方程式と合わせる by DBFlute 41 ギャップその5:本番とスキーマちっがーう
AlterCheckの結果 ダメ だったら… 差分がなくなるまで差し戻し 42 ギャップその5:本番とスキーマちっがーう
DBサイドとアプリサイドの ギャップ その6 アプリ屋さんよぅ… パフォーマンス考慮お願い 43 ギャップその6
DBFluteはSQLを大切に1 発行されるSQLは徹底フォーマット (プログラマーがすぐにログ確認。実行はバインド変数) 44 ギャップその6:パフォーマンス考慮たのむよー
DBFluteはSQLを大切に2 発行されたSQLの実行時間をログに (プログラマーに普段から意識してもらう) 45 ギャップその6:パフォーマンス考慮たのむよー ※結果の件数もね
DBFluteはSQLを大切に3 どこから呼ばれたSQL?をログに (プログラマーをSQLに振り向かせる) 46 ギャップその6:パフォーマンス考慮たのむよー LastaFluteと連携でSQLにアプリクラス埋め込みも (DB側でSQLを抽出しても、どこのSQLかすぐにわかる)
DBFluteはSQLを大切に4 EntityのSetter呼び出し情報でupdate文を構築 (無駄な事前検索や問答無用全カラム更新しない) Member mb = new Member(); mb.setMemberId(3); mb.setMemberName(“jflute”);
memberBhv.update(mb); ↓↓↓ update MEMBER set MEMBER_NAME = ‘jflute’ where MEMBER_ID = 3 47 ギャップその6:パフォーマンス考慮たのむよー
DBをリファクタリングするために RDBを隠蔽するのではなく、 RDBを強く意識させる O/Rマッパー DBFlute 48 まとめ
DBサイドとアプリサイド どっちもWinWinになってこそ、 お客様も最高のシステムに 出会えるはず 49 まとめ
架け橋 そのためのツール、 選んでみませんか? 50 まとめ