ORMに感じるもやっと感

SpringBootでWebアプリを作るとき、いつもDBアクセスに何を使うか悩む。Doma?Mybatis?JPA?
個人的にはどれもしっくり来ていなくて、なんだかんだでDomaを使っている。何にもやっとを感じているのか考えてみた。

ドメインモデルへのマッピング

ほとんどのWebアプリのドメインモデルは1:*のようなマッピングが存在していて、SQLの結果を親子関係を持った構造にマッピングしたい。
SQLはjoinなどで持ってくるとflatな構造なので頑張ってドメインモデルに詰め替える必要がある。これがとても面倒くさい。
Mybatisを使う場合、resultMapで関連のマッピングを定義する方法が用意されている。とはいえSQLXMLに書きたくないので、SQLの置き場としてはやっぱりDomaが好きだなーというお気持ち。
JPAはORMの都合をあまりドメイン層に持ち込みたくないのでなんだかなーということであまり使ってない。あと複雑なクエリは多かれ少なかれなんだかんだ書くことになるので、SQLを自分で書くタイプのほうがいいよなーって感じがする。

仮説:リレーションのマッピングができれば嬉しい?

基本的にDomaで事足りていて、あとはリレーションのマッピングをいい感じにしたいだけなのでは?ということはマッピングをするところだけライブラリにしてしまえば良さそう!
ということでKtMapperというライブラリを書いてみた。

github.com

レコードのオブジェクトをドメインモデルに変換するMapperをKotlinでDSLっぽく書けたら便利かもねという思想。

サンプルで書くとこんな感じ。

10連休終わるまでにもうちょっと素振りして検証してみよ〜