Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlinで型安全にバイテンポラルデータを扱いたい! ReladomoラッパーをAIと実装し...

Avatar for Hiroshi Ito Hiroshi Ito
November 01, 2025

Kotlinで型安全にバイテンポラルデータを扱いたい! ReladomoラッパーをAIと実装してみた話

Avatar for Hiroshi Ito

Hiroshi Ito

November 01, 2025
Tweet

More Decks by Hiroshi Ito

Other Decks in Technology

Transcript

  1. #KotlinFest ⾃⼰紹介 2 ゴールドマン・サックスのテクノロジー部に新卒入社後、同社の機関システム開発に 従事。その後、VP/Senior Engineerとしてプラットフォーム開発に携わり、同社 発のJavaのOSSであるEclipse Collectionsのコミッター兼プロジェクトリード やOpenJDKへのコントリビュートを行うなど、OSS戦略を牽引。 スタートアップ2社を経て、READYFORに入社し執行役員VPoEに就任。

    同社のエンジニア組織の10名から30名規模への成長、決済基盤の刷新や、技術的 負債の返済、新規プロダクト開発を牽引。 2022年10月に株式会社ログラスの開発部へエンジニアとして入社。 エンジニアリングマネージャー、事業執行役員VPoEを経て、現職。 株式会社ログラス 執行役員 CTO 伊藤 博志 (いとひろ @itohiro73) Hiroshi Ito
  2. #KotlinFest 本⽇のアジェンダ 3 1. はじめに: RDBでの履歴管理‧時点情報管理の難しさ 2. テンポラルデータモデルとは 3. Reladomoの紹介

    4. ReladomoをKotlin/Spring Bootで使う際の課題 5. reladomo-kotlinをClaude Codeと協働開発 6. reladomo-kotlinの機能紹介 7. デモ:Chronostaff 8. 得られた知⾒とまとめ
  3. #KotlinFest RDB上で履歴情報‧時点情報を管理するのがむずかしい... 例えばこんな解決法があるか...? 1. updated_atだけで管理 a. 過去の状態が追跡できない b. 「いつの時点で何を知っていたか」が不明 2.

    履歴テーブルの活⽤ a. employees, employees_history, employees_log… b. 複雑なJOIN、パフォーマンス問題 c. 整合性の維持が困難 3. JSON/Blobに履歴を詰め込む a. クエリ不可 b. 型安全性の喪失 みなさん、こんなご経験はありませんか? 6
  4. #KotlinFest リアルライフシナリオで理解する、データの時点管理 📦 商品価格管理システム あるECサイトの商品「ノートPC」の価格変更履歴: テンポラルデータモデル 9 日付 出来事 1月1日

    商品登録、価格10万円でスタート 2月1日 キャンペーンで8万円に値下げ 3月1日 キャンペーン終了、10万円に戻す 3月5日 「2月1日の値下げ、実は7万円だっ た」と気づいて訂正 🤔 よくある質問 1. 「今の価格は?」→ 10万円 2. 「2月15日時点の価格は?」 → 8万円?7万円? 3. 「3月4日時点では2月15日の価格は何だと思ってい た?」→ 8万円 4. 「3月5日に訂正した履歴も残したい」 → どうする? これらを全て記録するには?
  5. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル1: スナップショットデータモデル(時点管理をしないモデル) 最もシンプル - 現在の状態だけ保持する テンポラルデータモデル 11 id

    name price updated_at 1 ノートPC 100,000 2024-01-01 10:00 id name price updated_at 1 ノートPC 100,000 → 80,000 2024-01-01 → 2024-02-01 09:00 id name price updated_at 1 ノートPC 80,000 → 100,000 2024-02-01 → 2024-03-01 08:00 ✅ できること • 現在の価格を取得 • シンプルな実装 ❌ できないこと • ❌ 「2月15日の価格は?」→ わからない (既に上書き) • ❌ 「誰がいつ変更した?」 → わからない (履歴なし) • ❌ 「過去の価格推移を分析」 → 不可能 問題: 履歴が残らない → 分析・監査・復元が不可能
  6. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル2: トランザクション時間データモデル 「いつ記録したか」を記録 テンポラルデータモデル 13 id name price

    transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 10:00 9999-12-31 1月1日 10:00: 商品登録 id name price transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 10:00 2024-02-01 09:00 ⬅ 終了 1 ノートPC 80,000 2024-02-01 09:00 9999-12-31 ⬅ 新規 2月1日 09:00: 値下げ → 古いレコードを終了、新レコード追加
  7. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル2: トランザクション時間データモデル 「いつ記録したか」を記録 テンポラルデータモデル 14 id name price

    transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 10:00 2024-02-01 09:00 1 ノートPC 80,000 2024-02-01 09:00 2024-03-01 08:00 ⬅ 終了 1 ノートPC 100,000 2024-03-01 08:00 9999-12-31 ⬅ 新規 3月1日 08:00: 値上げの最新情報を登録
  8. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル2: トランザクション時間データモデル 「いつ記録したか」を記録 テンポラルデータモデル 15 3月5日 15:00: 訂正「2月の値下げ、実は

    7万円だった」 => トランザクション時間データモデル単体では表現が不可能 id name price transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 10:00 2024-02-01 09:00 1 ノートPC 80,000 2024-02-01 09:00 2024-03-01 08:00 1 ノートPC 100,000 2024-03-01 08:00 9999-12-31
  9. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル2: トランザクション時間データモデル 「いつ記録したか」を記録 テンポラルデータモデル 16 3月5日 15:00: 訂正「2月の値下げ、実は

    7万円だった」 => トランザクション時間データモデル単体では表現が不可能 id name price transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 10:00 2024-02-01 09:00 1 ノートPC 80,000 2024-02-01 09:00 2024-03-01 08:00 1 ノートPC 100,000 2024-03-01 08:00 9999-12-31 ✅ できること • ✅ 「3月4日時点では何を信じていた?」 → 8万円(transaction_to > 3/4のレコード) • ✅ 時間軸に伴った変更の監査証跡 • ✅ データ復元(タイムトラベル) ❌ できないこと • ❌ 「過去のある時点の有効情報を訂正する」 → 過去のある時点で8万円ではなく7万円だった という修正はトランザクション時間単体ではできない • ❌ 「2月15日の価格は?」→ わからない ◦ なぜ? transaction_from = 2/1、transaction_to = 3/5 ◦ これは「2/1~3/5の間、システム上は 8万円だと記録していた」という意味 ◦ 実際に2/15時点で有効だった価格かは不明 問題: 「システム上の記録」の履歴は追えるが「実際にいつ有効だったか」がわからない
  10. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル3: 有効時間データモデル 「いつ有効か」を記録 テンポラルデータモデル 18 id name price

    valid_from valid_to 1 ノートPC 100,000 2024-01-01 10:00 9999-12-31 1月1日 10:00: 商品登録「 1月1日から10万円」 id name price valid_from valid_to 1 ノートPC 100,000 2024-01-01 2024-02-01 ⬅ 期間短縮 1 ノートPC 80,000 2024-02-01 9999-12-31 ⬅ 新規 2月1日 09:00: 値下げ → 値下げ「 2月1日から8万円」→ 期間を分割
  11. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル3: 有効時間データモデル 「いつ有効か」を記録 テンポラルデータモデル 19 id name price

    valid_from valid_to 1 ノートPC 100,000 2024-01-01 2024-02-01 1 ノートPC 80,000 2024-02-01 2024-03-01 ⬅ 期間短縮 1 ノートPC 100,000 2024-03-01 9999-12-31 ⬅ 新規 3月1日 08:00: 値上げ「 3月1日から10万円」
  12. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル3: 有効時間データモデル 「いつ有効か」を記録 テンポラルデータモデル 20 id name price

    valid_from valid_to 1 ノートPC 100,000 2024-01-01 2024-02-01 1 ノートPC 80,000 → 70,000 2024-02-01 2024-03-01 ⬅ 上書き 1 ノートPC 100,000 2024-03-01 9999-12-31 3月5日 15:00: 訂正「2月の値下げ、実は 7万円だった」 → 過去を上書き 問題: 8万円という間違いの記録が消えてしまう
  13. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル3: 有効時間データモデル 「いつ有効か」を記録 テンポラルデータモデル 21 id name price

    valid_from valid_to 1 ノートPC 100,000 2024-01-01 2024-02-01 1 ノートPC 80,000 → 70,000 2024-02-01 2024-03-01 ⬅ 上書き 1 ノートPC 100,000 2024-03-01 9999-12-31 3月5日 15:00: 訂正「2月の値下げ、実は 7万円だった」 → 過去を上書き 問題: 8万円という間違いの記録が消えてしまう ✅ できること • ✅ 「2月15日の価格は?」→ 7万円(valid_from ≤ 2/15 < valid_to) • ✅ 「将来の価格変更を予約」 → valid_from = 未来の日付で登録可能 • ✅ 過去の任意時点の価格を取得 ❌ できないこと • ❌ 「3月4日時点では2月15日の価格は何だと思っていた?」 → わからない ◦ 訂正後のデータ(7万円)しか残っていない ◦ 「8万円だと思っていた」履歴は消えてしまう • ❌ 修正の履歴がない → 監査証跡不完全 問題: 訂正すると元の間違いが消える → 監査証跡が失われる
  14. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル4: バイテンポラルデータモデル 2つの時間軸を同時に記録 テンポラルデータモデル 23 id name price

    valid_from valid_to transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 9999-12-31 2024-01-01 10:00 9999-12-31 1月1日 10:00: 商品登録「 1月1日から10万円」
  15. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル4: バイテンポラルデータモデル 2つの時間軸を同時に記録 テンポラルデータモデル 24 id name price

    valid_from valid_to transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 2024-02-01 2024-01-01 10:00 2024-02-01 09:00 ⬅ 終了 1 ノートPC 100,000 2024-01-01 2024-02-01 2024-02-01 09:00 9999-12-31 ⬅ 継続 版 1 ノートPC 80,000 2024-02-01 9999-12-31 2024-02-01 09:00 9999-12-31 ⬅ 新規 2月1日 09:00: 値下げ「 2月1日から8万円」
  16. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル4: バイテンポラルデータモデル 2つの時間軸を同時に記録 テンポラルデータモデル 25 id name price

    valid_from valid_to transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 2024-02-01 2024-01-01 10:00 2024-02-01 09:00 1 ノートPC 100,000 2024-01-01 2024-02-01 2024-02-01 09:00 9999-12-31 1 ノートPC 80,000 2024-02-01 2024-03-01 2024-02-01 09:00 2024-03-01 08:00 ⬅ 終了 1 ノートPC 80,000 2024-02-01 2024-03-01 2024-03-01 08:00 9999-12-31 ⬅ 継続 版 1 ノートPC 100,000 2024-03-01 9999-12-31 2024-03-01 08:00 9999-12-31 ⬅ 新規 3月1日 08:00: 値上げ「 3月1日から10万円」
  17. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル4: バイテンポラルデータモデル 2つの時間軸を同時に記録 テンポラルデータモデル 26 id name price

    valid_from valid_to transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 2024-02-01 2024-01-01 10:00 2024-02-01 09:00 1 ノートPC 100,000 2024-01-01 2024-02-01 2024-02-01 09:00 9999-12-31 1 ノートPC 80,000 2024-02-01 2024-03-01 2024-02-01 09:00 2024-03-05 15:00 ⬅ 終 了(間違い) 1 ノートPC 80,000 2024-02-01 2024-03-01 2024-03-01 08:00 2024-03-05 15:00 ⬅ 終 了 1 ノートPC 100,000 2024-03-01 9999-12-31 2024-03-01 08:00 2024-03-05 15:00 ⬅ 終 了 1 ノートPC 70,000 2024-02-01 2024-03-01 2024-03-05 15:00 9999-12-31 ⬅ 訂正後 1 ノートPC 100,000 2024-03-01 9999-12-31 2024-03-05 15:00 9999-12-31 ⬅ 継続版 3月5日 15:00: 訂正「2月の値下げ、実は 7万円だった」 → 間違いの記録も残る
  18. #KotlinFest リアルライフシナリオで理解する、データの時点管理 データモデル4: バイテンポラルデータモデル 2つの時間軸を同時に記録 テンポラルデータモデル 27 id name price

    valid_from valid_to transaction_from transaction_to 1 ノートPC 100,000 2024-01-01 2024-02-01 2024-01-01 10:00 2024-02-01 09:00 1 ノートPC 100,000 2024-01-01 2024-02-01 2024-02-01 09:00 9999-12-31 1 ノートPC 80,000 2024-02-01 2024-03-01 2024-02-01 09:00 2024-03-05 15:00 ⬅ 終 了(間違い) 1 ノートPC 80,000 2024-02-01 2024-03-01 2024-03-01 08:00 2024-03-05 15:00 ⬅ 終 了 1 ノートPC 100,000 2024-03-01 9999-12-31 2024-03-01 08:00 2024-03-05 15:00 ⬅ 終 了 1 ノートPC 70,000 2024-02-01 2024-03-01 2024-03-05 15:00 9999-12-31 ⬅ 訂正後 1 ノートPC 100,000 2024-03-01 9999-12-31 2024-03-05 15:00 9999-12-31 ⬅ 継続版 3月5日 15:00: 訂正「2月の値下げ、実は 7万円だった」 → 間違いの記録も残る ✅ できること • ✅ 「現在の価格は?」→ 10万円 • ✅ 「2月15日の価格は?」→ 7万円(訂正後の正しい価格) • ✅ 「3月4日時点では2月15日の価格は何だと思っていた?」 → 8万円 • ✅ 「訂正履歴も残る」→ 8万円→7万円の訂正記録 • ✅ 将来の価格変更を予約 • ✅ 完全な監査証跡 • ✅ タイムトラベル(任意の時点の知識状態を復元) ❌ デメリット • ⚠ テーブル設計が複雑 • ⚠ クエリが複雑(2つの時間軸を考慮) • ⚠ データ量増加(訂正のたびにレコード追加)
  19. #KotlinFest リアルライフシナリオで理解する、データの時点管理 まとめ 時点管理を⾏わないスナップショットデータモデルと、時点管理をDB上で表現するテンポラルデータモデルとして「トラ ンザクション時間データモデル」「有効時間データモデル」「バイテンポラルデータモデル」をそれぞれ紹介 テンポラルデータモデル 32 機能 スナップショット トランザクション時間

    有効時間 バイテンポラル 現在の状態 ✅ ✅ ✅ ✅ 履歴参照 ❌ ✅ ✅ ✅ 「2月15日の価格は?」 ❌ ❌ ✅ ✅ 将来予約 ❌ ❌ ✅ ✅ 「3月4日時点で2月15日の価格は?」 ❌ ❌ ❌ ✅ 訂正履歴 ❌ ⚠ 記録としてのみ ❌ ✅ 完全な監査証跡 ❌ ⚠ 部分的 ❌ ✅ タイムトラベル ❌ ⚠ 記録時点のみ ⚠ 有効時点のみ ✅
  20. #KotlinFest エンタープライズグレードのバイテンポラルデータモデルをサポートするJava ORM https://github.com/goldmansachs/reladomo • ゴールドマン‧サックスが開発し、OSSとして公開 ‐ 複雑な業務ロジックを持つ⼤規模システム向けに設計されたJava ORM •

    バイテンポラルデータモデルを透過的にサポート ‐ 有効時間 (Business Date)とトランザクション時間 (Processing Date)をネイティブサポート • 型安全なクエリ⾔語 ‐ リフレクションを使わず、静的に型付けられたクエリを⽣成 • ⾼度な機能 ‐ トランザクション管理(変更履歴の⾃動追跡) ‐ シャーディング(複数DBへのデータ分散)を透過的にサポート Reladomoとは? 34
  21. #KotlinFest シンプル: KotlinでReladomoを扱う際の課題感をインプットしただけ ⼊⼒したプロンプト(失われてしまったのでうろ覚え再現) ReladomoをKotlin/Spring Bootで扱おうとすると、様々な課題があります - XMLで⾃動⽣成されたJavaのコードがKotlinと親和性が良くない - ボイラープレートな初期設定を⼿動で書かなければいけない

    - Spring Bootとのインテグレーションがないため、開発初期スピードが上がらない これらの課題を解決するreladomo-kotlinというライブラリを開発したいので、要件‧仕様を設計し、MVPの実 装プランを⽴ててください => ここから出てきた仕様提案にフィードバックを送りつつ、理想的な形へとガイドしながら開発。⼈間は1⾏もコードを書い ていない Claude Codeで何をしたのか? 57
  22. #KotlinFest reladomo-kotlinというラッパーライブラリを⼈間が作ろうと思ったら おそらくフルタイムで数ヶ⽉はかかるであろう分量 - Javaのコード⽣成機能をどうKotlinコードに変換するべきかを調査‧設計‧実装 - 既存のコード⽣成ロジックの精査 - Kotlinコードの理想状態を定義 -

    Gradle Pluginとしてのプラクティスを調査しつつプラグイン設計‧実装 - Spring Bootに統合するための既存Reladomoの動作理解とSpring Boot上の詳細機能調査 + 設計実装 - リリースビルドや⼿順書の作成 - テストの作成 - 等々 => Claude Codeに電⾞の中でスマホ内で数⽇で完成...! AIコーディングエージェントの強⼒さを⽬の当たりに 60
  23. #KotlinFest 課題3: ⼤量のボイラープレートコード => Gradleプラグインによるボイラープレート対応 プラグインへの依存を⾜すだけで、 以下が全て⾃動設定される: • ✅ MithraManager初期化

    • ✅ DataSource統合 • ✅ Transaction Manager設定 • ✅ GenericSequenceObjectFactory登録 Reladomoの課題に対するreladomo-kotolinの解決法 64
  24. #KotlinFest 課題4: Spring Dataパターンが適⽤しずらい => Repositoryパターンのサポート 提供される機能: • ✅ Query

    Method⾃動パース • ✅ ⾃動Bean登録 • ✅ @Transactionalサポート • ✅ 標準CRUD操作サポート Reladomoの課題に対するreladomo-kotolinの解決法 65
  25. #KotlinFest 本セッションでは、テンポラルデータモデルとReladomo、AIと⼀緒に開発した reladomo-kotlinについて紹介しました。 • バイテンポラルデータモデルとReladomoの強⼒さ • AIコーディングエージェントでライブラリ開発が簡単にできる世界観 • さらに作成したライブラリを活⽤したデモアプリさえもAIでつくりました •

    さらにいうとこのスライドも80%くらいAI作成 バイテンポラルデータモデルすごい! Reladomoすごい! AIコーディングエージェントすごい! ということがご理解いただけると幸いです。ご清聴ありがとうございました。 おわりに 79
  26. 80