SeasarCon2009Autumnにいってきた

今回は、まじめにメモをとったのはDomaだけ。
いやーDomaすごいっす。よく分からないままふらっと入ったけど、非常に面白い。
というわけで、メモを貼り付けておきます。

次世代DaoフレームワークDoma

Domain指向
    "Domain"=値の定義域(DB的なドメイン)
    引数全部Stringとか、型で情報を表せてないよね
        String orderNo, String customerName, ...
            ↓
        OrderNumber orderNo, CustomerName customerName, .....
    「振る舞いはエンティティに持たせればよい」というが、エンティティよりもプロパティに持たせた方が、よりDRYにできる!
    StringDomain<T>を継承して独自ドメインクラスを定義する
        public class OrderNumber extends StringDomain<OrderNumber>
        #Generics使いまくり。コード読んだら勉強になりそう。後で読む。
    エンティティはインタフェースで!挑戦的。
    Daoは @Daoをクラスにつけて、メソッドには@Select, @Insertなどをつける
        命名規約という暗黙の了解を避けて、アノテーションによる明示を行う
    aptで自動生成されるインタフェース名にひげを生やした(接尾辞"_")クラス名をnewするだけでOK.
    Daoが作るSQLは、変更されたプロパティだけが含まれる

旧世代
    黒魔術師が支配する暗黒の世界
        AOP(バイトコードエンジニアリング)
        命名規約
            簡単なモノなら良いが、覚えきれないほどの量になると・・・
次世代
    脱黒魔術
        ソースコードの通りに動く
            自動生成のメリットは享受する
            デバッグしやすい
        エラーが起きてもわかりやすい

    白魔術=apt
        Jav6から導入されたアノテーション処理のためのAPI
        コンパイル時に、↓が実現できる
            ソースの生成・検証
            リソースの参照・生成
        魅力
            コンパイル時に自動的に実行される
                JavaのSDK標準のため、EclipseでもjavacでもOK
            エラーはコンパイル時に検出できる
                どうさせる前に気づける
            実行時の負荷が軽減できる
                動的にメタ情報解析する旧来の黒魔術ではパフォーマンスが不利

デモ
    #すごすぎる・・・
    Domaが求める規約違反をコンパイル時に検出できる
    コンパイル時にSQLファイルの有無や、パラメタ名の名前誤りがすぐに検出できる
    検出されたエラーは、Eclipseのマーカが設定される

    #emp.name()などのエンティティ命名規約の場合、既存のJavaBeanフレームワークでプロパティとしてアクセスできなくて不便だったりしそう。getName()と書くことはできる?
        →と思ったら、後述のようにDTO変換で対策済み。

戦略
    依存ライブラリなし!!!
        Domaだけあればよい
        newするだけでOK。DI不要
    Daoパターン
        S2JDBCはDaoパターンを捨てたけども、やはりDaoはわかりやすい
        メソッドとSQLが1対1
        メンテしやすい
        テストしやすい
            Mockが作りやすい
    SQLファイル
        検索SQLの自動生成はない。意図的。自分でSQLファイルに書く。
        更新SQLは自動生成。SQLファイルで書いても良い。
    キャッシュ
        メモリ圧迫可能性があるのでキャッシュは避けるべき
        デフォルトでキャッシュするのはSQLの解析結果のみ
    プラガブルな構成
        ネーミング規約
        データベース方言
        JavaBeansへのアクセス方法
            POJOじゃないのでJavaBeanフレームワークで使えない
            JvaBeans(DTO)へ変換する方法を提供している
                DTOの自動生成と、ConvertのためのUtilがある
        ドメインとDB型のマッピング
        SQLのログ出力とフォーマット方法

まとめ
    値型よりもリッチなクラス(Domain)にメリットがある
    aptで脱黒魔術
    Doma=aptを活用したDaoフレームワーク

Q&A
    トランザクションは?
        Domaでは対応しない。外側で。
        Seasarと連携しているDomaのサンプルがあるので、参考までに。
    実績は?
        全くないです。
    SpringでDomaのDaoを使うには?
        アンスコ付きのクラスがImpl相当。生成されたクラスをDIコンテナに登録すればOK
        アンスコを"Impl"に変更することもできる
    SQLの解析レベルは?
        厳密にはやっていない。標準準拠などはしてない。
    関連のサポートは?
        していない。S2Daoのように一発でフラットにとるように考えている。
        SQLでJOINしてフラットに取得する。
        Domaとしては、テーブルに対応しててもしていなくても全部@Entityをつける前提で考えている。
    誤ったデータに対するチェックはどのタイミングで?
        DBからデータをとるときも、サービスで設定するときも、setterが使われる。
        そこでバリデーションすればOK
    共通要素はどこで定義する?エンティティは継承できる?
        継承ではなく、マップドスーパークラスというのが使える。