Slide 1

Slide 1 text

uroboroSQLをきっかけに、 責務の在り方を考えてみた Sudo Mayu

Slide 2

Slide 2 text

自己紹介 須藤 真由(Sudo Mayu) 普段はJavaDoのスタッフ、山川研究室の研究員 学生時代はドメイン駆動設計を研究にしたくらいモデリングが好き 内定先のFuture株式会社でシステム開発アルバイト中 最近、SQLを読むときに参考にしてるもの →postgreSQLユーザー会のドキュメント

Slide 3

Slide 3 text

uroboroSQLとは 2Way-SQLが利用可能なJava製のシンプルなSQL実行ライブラリ フューチャーアーキテクト社内にて、2006-2007年頃に開発 S2Daoを参考にしている 【設計思想】 SQLに足りないところをJavaで補う

Slide 4

Slide 4 text

2WaySQLってほんとに便利 インピーダンスミスマッチ: DBとアプリケーションはレイヤーが異なる データモデルとドメインモデル間には不整合が発生

Slide 5

Slide 5 text

2WaySQLってほんとに便利 インピーダンスミスマッチの解決策 : O/Rマッピング周辺の手法 ・Dynamic SQL ・Query Builder(jOOQ、Querydslなど) ・Specificationパターン/Criteriaスタイル ・一般的なSQL Template ・2WaySQL(uroboroSQL、Domaなど)

Slide 6

Slide 6 text

それぞれの責務の在処を比べてみたい

Slide 7

Slide 7 text

6パターン作ってみた

Slide 8

Slide 8 text

題材 登録されているメンバーから絞り込む アプリケーションはJavaで構築 対象テーブル

Slide 9

Slide 9 text

JDBCのDynamic SQL SQL文字列そのものをJavaコード内で少 しずつ組み立て SQL実行、ResultSetからMemberへの 変換までがJava側に集まっている

Slide 10

Slide 10 text

JDBCのSQLを極力ファイルに切り分け SQLファイルはある 任意条件の有無、IN句の ? 生成、 LIKE値加工、バインド値の順番管理は Java側に残っている

Slide 11

Slide 11 text

Query Builder SQL断片とバインド値の対応を SqlQueryBuilderに寄せて、 Repository側は 「条件があれば追加する」という呼び出しに集中

Slide 12

Slide 12 text

Specificationパターン/Criteriaスタイル 検索条件や業務条件をJavaの 部品として表現 SQLへの反映は Repository側に 寄せる

Slide 13

Slide 13 text

SQL Template Java側は「使うSQLファイ ル」と「渡すパラメータ」を指 定するだけ、 条件分岐やIN句は SQLテンプレート側に寄る。 LIKE用の値加工は 実装方式によってJava側に 残ることもある

Slide 14

Slide 14 text

2WaySQL バインドコメントと ダミー値 (バインドパラメーター) により、 SQLクライアントに 貼り付けて通常のSQL として試しやすい

Slide 15

Slide 15 text

色んな方法があることが 分かりました (勉強になりました。使い方間違ってるとかあったら教えていただきたいです)

Slide 16

Slide 16 text

使い比べてみた感想 ・皆さんどう使い分けてるのか気になる! ・アプリケーション側とデータベース側、 どっちにどんなドメイン知識を置いてどんな責務を担わせるのか プロジェクトやシステムの規模によって様々で答えはないと思うけど、 2WaySQLでその選択肢が増えている!

Slide 17

Slide 17 text

uroboroSQL使ってみた感想 最初にアルバイトのプロジェクトのSQLに触れた時 SQL長い!読むの大変(でも今考えるとuroboroSQLのせいじゃない) グレーアウトしてるのに実行に影響するの不思議 数ヶ月経った後… 3ヶ月くらいから読み慣れてきた感覚 4ヶ月目の今、一番見やすくなってる(最近も500行くらいの書けた) 「書けてもJava」みたいな状態からスタートした私、とてもびっくり

Slide 18

Slide 18 text

増田亨さん:ソフトウェア設計の実践的な考え方 - Speaker Deck

Slide 19

Slide 19 text

それぞれどの領域に合う? Specification/ Criteria SQLTemplate(2WaySQL) 処理を細分化して ドメインモデルを表現可能 複雑な検索・一覧などを、 既存の型やSQLで堅実に表現 JDBC Dynamic SQL、 QueryBuilder 凝った設計よりも 小さく早く済ませることが可能

Slide 20

Slide 20 text

uroboroSQLには便利機能が

Slide 21

Slide 21 text

REPL(Read-Eval-Print Loop) CLIで対話しながらSQLを実行できる 確認できる項目 ・実行するSQL ・バインドパラメータ ・SQL文の中の評価式とその評価結果 ・検索結果 ・実行時間

Slide 22

Slide 22 text

SQLカバレッジ 条件分岐がアプリケーション側にある →アプリケーションのテストで カバレッジ計測 条件分岐がSQLにある →uroboroSQLで測れる! 2WaySQLならではの困りごとに対応

Slide 23

Slide 23 text

uroboroSQL-fmt

Slide 24

Slide 24 text

uroboroSQL-fmt VSCodeの拡張機能

Slide 25

Slide 25 text

uroboroSQL-fmt Web上でデモれる インストール不要

Slide 26

Slide 26 text

モデリングによっても変わるのでは? アプリケーション側のドメインモデリング インピーダンスミスマッチにも程度がありそう DB側のデータモデリング

Slide 27

Slide 27 text

8月29日(土)、JavaDoやります! テーマ:バックエンドのモデリング手法 ゲスト会

Slide 28

Slide 28 text

ありがとうございました アンカンファレンスでもお話しましょう