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

TypeScriptプロジェクトにスキーマ駆動開発を持ち込み、より型安全な世界へ

SansanTech
September 12, 2023

 TypeScriptプロジェクトにスキーマ駆動開発を持ち込み、より型安全な世界へ

イベント
TypeScriptを活用した型安全なチーム開発
https://sansan.connpass.com/event/292695/

■登壇概要
タイトル:TypeScriptプロジェクトにスキーマ駆動開発を持ち込み、より型安全な世界へ
登壇者:技術本部 Digitization部 Bill One Entry グループ 秋山 雅之

■Digitization部 エンジニア 採用情報
https://media.sansan-engineering.com/digitization

SansanTech

September 12, 2023
Tweet

More Decks by SansanTech

Other Decks in Technology

Transcript

  1. 2021年中途⼊社。 請求書のデータ化システムを⽇々改善 & 運⽤。 { "📛aliases": ["@aki202", "リーダブル秋⼭"], "❤likes": ["プログラミングパラダイム",

    "アーキテクチャ"], "🧑💻roles": ["バックエンドエンジニア", "フロントエンドエンジニア"] } 秋⼭ 雅之 Sansan株式会社 Digitization部 Bill One Entryグループ 3
  2. 1. はじめに 1. スキーマ駆動開発とは 2. Testing Trophyとの関係性 2. 構成 1.

    最初の構成と課題 2. 最終的な構成 3. バックエンド 1. スキーマから型ファイルを作る 2. APIハンドラに型を与える 3. バリデーターを追加する 4. huskyでスキーマ変更を検知する 4. フロントエンド 1. スキーマからAPIクライアントを作る 5. パターンマッチングを持ち込む 6. おわりに ⽬次 4 © Sansan, Inc.
  3. 従来のTesting Pyramidに代わ り提唱されているモダンフロ ントエンドに おけるテストガイドライン。 右図の上から順番に、 - End to End:E2Eテスト

    - Integration:結合テスト - Unit:単体テスト - Static:Lintや型チェック 下のレイヤーほど低コスト。 Testing Trophyとは? 図:“Testing Javascript” より 図:Google Cloud “Continuous testing” より 8
  4. 最初の構成 Frontend - APIクライアントのパラメータは openapi.yamlを⽬視で⾒て⼿動設定 Backend - スキーマはOpenAPI 3.0で記述 -

    APIハンドラはany型でデータを受信 - データのバリデーションはAPIハン ドラやその先の処理で個別に実⾏ 11
  5. 課題1: 信頼境界の不在 クライアント APIハンドラ アプリケーション サービス ドメイン サービス ⼀連のリクエスト・レスポンスのフロ ーは直列の関数実⾏と⾒做せる。

    “ここ以降の処理に渡るデータは安全” と⾔えるボーダーが信頼境界。 信頼境界がない場合、各関数で引数が 予期されたデータかチェックする必要 がある。→ 重複やヌケモレのリスク があるアンチパターン エンティティ ルーティング 引数チェック 引数チェック 引数チェック 引数チェック 信頼境界が無い状態 12
  6. スキーマ定義からTypeScriptの型を作っておらず、次の状態だった。 Backend - 受信するデータがany型 - レスポンスデータがany型 Frontend - クライアントから送信するデータがany型 -

    クライアントが受け取るデータがany型 何が問題か - 例えばAPIリクエストやレスポンスのenumの列挙⼦を⼀つ変更した場合、 影響範囲を全て⽬視チェックする必要がある 課題2: 静的解析の範囲が⼩さい 13
  7. - ルーティングにはbeforeの構成から引き続き swagger-routes-express を採⽤しているが、 リクエストに対するバリデーションは⾏ってくれ ず、リクエストパラメータはany型でAPIハンド ラに渡される。 - スキーマを元にバリデーションを⾏ってくれる express-openapi-validator

    を新たに導⼊した。 - これによりOpenAPI 3.0で記述できる範囲での 信頼境界を設定できた。 - つまりリクエストがスキーマ通りのリクエ ストであるかどうかを、APIハンドラは 気にしなくて良い状態 バリデーターを追加する 18
  8. - 次の状態になった。 - (1) リクエストに対してバリデーションを早い段階で掛けることで、 信頼境界を設定できた。 - (2) APIハンドラを型安全な関数に変えることができた。 -

    これらは型ファイルが最新の状態であることを前提にしている。 ➛ 型ファイルか現在のスキーマと⼀致しているかどうかを検知する必要がある。 - huskyを⽤いて、“現在の型ファイル” と “スキーマから⼀時的に作った型ファイ ル” のハッシュが⼀致しているかをgit push前に検証する。 huskyでスキーマ変更を検知する 19
  9. - 次の施策を通して、プロジェクト全体に型制約を与え、より安全な開発をで きるようになりました。 - APIリクエストとレスポンスに型制約を与えた - リクエストに対し早期にバリデーションをかけ信頼境界を作った - パターンマッチで網羅的な分岐処理を静的に保証できるようになった -

    システムは⽣まれた瞬間から複雑化します。複雑化の中で堅牢性を担保する のはこの仕事の最も⾯⽩い所の⼀つだと思いますし、⾃分もやっていて楽し いです。 Digitization部はSansanの主要なプロダクトのプラットフォームに位置する 重要部署です。是⾮カジュアル⾯談しましょう。気軽にご連絡ください。 まとめ 31