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

アプリケーションの拡大に伴う開発者体験の悪化をなんとかする

 アプリケーションの拡大に伴う開発者体験の悪化をなんとかする

Avatar for Tetsuya Fukuda

Tetsuya Fukuda

November 22, 2025
Tweet

More Decks by Tetsuya Fukuda

Other Decks in Programming

Transcript

  1. 自己紹介  福田 哲也 (@gendaihyousyou)  株式会社 RIT CTO/CHRO 

    京都在住  Web技術と入力デバイスが好きです
  2. ベンチマーク結果 前提条件  同一コミット・同一tsconfigで計測  キャッシュクリア後に3回実行の平均値  対象プロジェクト: Hono +

    Drizzle ORM + zod、100+テーブルの大 規模アプリ 結果(ビルド/型チェック時間) 動的型推論: 2.37秒 事前生成: 0.45秒 約5.3倍高速化
  3. ベンチマーク結果 前提条件  同一コミット・同一tsconfigで計測  キャッシュクリア後に3回実行の平均値  対象プロジェクト: Hono +

    Drizzle ORM + zod、100+テーブルの大 規模アプリ 結果(ビルド/型チェック時間) 動的型推論: 2.37秒 tsgo: 0.92秒 約2.6倍高速化
  4. 課題2: テスト実行速度の低下  テスト件数に比例して実行時間が増加  100+テーブルの全クリアが毎回実行  テスト間のTRUNCATE&シードが重い beforeEach(async ()

    => { // 外部キー無効化 await db.execute(...); // 100+テーブル全クリア for (... i <= 100; ...) { await db.execute(`TRUNCATE ...`); } });
  5. 改善1: TRUNCATE → DELETE + tmpfs DELETE への変更 テーブル全体のリセットではなく行単位の削除で効率化 tmpfs

    導入 ディスクI/OをメモリアクセスOに置換えて高速化 結果(50テストケース) 通常DELETE: 7.84秒 tmpfs: 3.00秒 約2.6倍高速化
  6. Honoのテストで使うなら ハンドラ内で context からDBを取得する実装パターン withTransaction ヘルパーでテストをラップ testFailure変数 でテスト失敗を保存し、例外を適切に再 スロー 

    tx.rollback() を明示的に呼び出して確実にロールバ ック // withTransactionヘルパー関数 function withTransaction(fn) { return async () => { let testFailure; try { await db.transaction(async (tx) => { const request = async (path, init) => { return await app.request(path, init, { db: tx }); }; try { await fn(tx, request); } catch (e) { testFailure = e; } // 明示的にロールバック tx.rollback(); }); } catch (e) { if (testFailure) throw testFailure; if (e instanceof DrizzleError) { return; } throw e;