26. Cake Pattern
ポイント
◮ trait を入れ子にしておく
◮ 使う側は自分型アノテーションで依存を明示
◮ AppRootには実装コンポーネントを結合
◮ TestRoot等を用意して別実装に入れ替えも可
◮ 単体テストでコンポーネント単位で入れ替え
◮ 全体でテスト用 DB ハンドラ実装に入れ替え
object TestRoot
extends repo.SomeMockedComponent
with app.ServiceComponent
with ...
27. N+1問題1 件の場合
val bookmark: Bookmark = ...
val locaiton: Location = bookmark.toLocation
// SELECT * FROM location WHERE ...
n 件の場合: n + 1 回のクエリが必要
val bookmarks: Seq[Bookmark] = ...
// SELECT * FROM bookmark WHERE ...
val locations: Seq[Location] = bookmarks.map(_.toLocation)
// SELECT * FROM location WHERE ...
// SELECT * FROM location WHERE ...
//
... × n
本当はせいぜい 2 回で済む
val locations: Seq[Location] =
locationLoader.findAll(bookmarks.map(_.locationId))
// SELECT * FROM location WHERE location_id IN (...)