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
3.2k
1
Share
DBFlute bridges between DB and App
at JPOUG> SET EVENTS 20151017
jflute
October 17, 2015
More Decks by jflute
See All by jflute
How Unext took in Eclipse Collections in FW
jflute
0
780
How to fork Seasar (LastaFlute)
jflute
0
220
LastaFlute First Impact
jflute
7
7.5k
Other Decks in Programming
See All in Programming
AI活用のコスパを最大化する方法
ochtum
0
370
PHPで TLSのプロトコルを実装してみるをもう一度しゃべりたい
higaki_program
0
170
AIと共にエンジニアとPMの “二刀流”を実現する
naruogram
0
120
モダンOBSプラグイン開発
umireon
0
200
20260320登壇資料
pharct
0
160
GoのDB アクセスにおける 「型安全」と「柔軟性」の両立 - Bob という選択肢
tak848
0
300
Redox OS でのネームスペース管理と chroot の実現
isanethen
0
520
Everything Claude Code OSS詳細 — 5層構造の中身と導入方法
targe
0
160
The Monolith Strikes Back: Why AI Agents ❤️ Rails Monoliths
serradura
0
100
煩雑なSkills管理をSoC(関心の分離)により解決する――関心を分離し、プロンプトを部品として育てるためのOSSを作った話 / Solving Complex Skills Management Through SoC (Separation of Concerns)
nrslib
3
360
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
190
仕様漏れ実装漏れをなくすトレーサビリティAI基盤のご紹介
orgachem
PRO
8
4.4k
Featured
See All Featured
Marketing to machines
jonoalderson
1
5.1k
The Curious Case for Waylosing
cassininazir
0
290
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
10k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
110
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
980
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
A better future with KSS
kneath
240
18k
Facilitating Awesome Meetings
lara
57
6.8k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
860
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
170
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
230
Utilizing Notion as your number one productivity tool
mfonobong
4
280
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 まとめ