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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

Avatar for Tetsuya Fukuda

Tetsuya Fukuda

November 22, 2025

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;