Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
安定した基盤システムのためのライブラリ選定
Search
KAKEHASHI
PRO
July 14, 2025
Technology
3
94
安定した基盤システムのためのライブラリ選定
実践!バックエンドTypeScript〜現場から学ぶtsの可能性〜
https://findy.connpass.com/event/360678/
での登壇資料です
KAKEHASHI
PRO
July 14, 2025
Tweet
Share
More Decks by KAKEHASHI
See All by KAKEHASHI
"SaaS is Dead" は本当か!? 生成AI時代の医療 Vertical SaaS のリアル
kakehashi
PRO
4
580
堅牢な認証基盤の実現 TypeScriptで代数的データ型を活用する
kakehashi
PRO
2
330
時間がないなら、つくればいい 〜数十人規模のチームが自律性を発揮するために試しているいくつかのこと〜
kakehashi
PRO
25
7.5k
続・やっぱり余白が大切だった話
kakehashi
PRO
4
640
AIでめっちゃ便利になったけど、結局みんなで学ぶよねっていう話
kakehashi
PRO
2
740
システムとの会話から生まれる先手のDevOps
kakehashi
PRO
2
490
やっぱり余白が大切だった話
kakehashi
PRO
10
3.7k
貧民的プログラミングのすすめ
kakehashi
PRO
2
740
目標と時間軸 〜ベイビーステップでケイパビリティを高めよう〜
kakehashi
PRO
9
2.4k
Other Decks in Technology
See All in Technology
大量配信システムにおけるSLOの実践:「見えない」信頼性をSLOで可視化
plaidtech
PRO
0
290
american aa airlines®️ USA Contact Numbers: Complete 2025 Support Guide
aaguide
0
500
衛星運用をソフトウェアエンジニアに依頼したときにできあがるもの
sankichi92
1
230
スタートアップに選択肢を 〜生成AIを活用したセカンダリー事業への挑戦〜
nstock
0
290
AIエージェントが書くのなら直接CloudFormationを書かせればいいじゃないですか何故AWS CDKを使う必要があるのさ
watany
18
7k
サイバーエージェントグループのSRE10年の歩みとAI時代の生存戦略
shotatsuge
4
830
Four Keysから始める信頼性の改善 - SRE NEXT 2025
ozakikota
0
210
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
3
980
Lufthansa ®️ USA Contact Numbers: Complete 2025 Support Guide
lufthanahelpsupport
0
240
データ基盤からデータベースまで?広がるユースケースのDatabricksについて教えるよ!
akuwano
3
160
How to Quickly Call American Airlines®️ U.S. Customer Care : Full Guide
flyaahelpguide
0
240
Zero Data Loss Autonomous Recovery Service サービス概要
oracle4engineer
PRO
2
7.8k
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
462
33k
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
5.9k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
The Invisible Side of Design
smashingmag
301
51k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
8
700
Speed Design
sergeychernyshev
32
1k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
The World Runs on Bad Software
bkeepers
PRO
69
11k
4 Signs Your Business is Dying
shpigford
184
22k
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Transcript
©KAKEHASHI inc. 安定した基盤システムのための ライブラリ選定 2025/07/15 実践!バックエンドTypeScript〜現場から学ぶTSの可能性〜 株式会社カケハシ 岩佐 幸翠 (@kosui_me)
©KAKEHASHI inc. カケハシについて
©KAKEHASHI inc. #1 医療プロダクトを支える 基盤システム
©KAKEHASHI inc. 機能要求 #1 医療プロダクトを支える基盤システム • 認証・認可 複雑な状態遷移を伴う • ディレクトリサービス
ユーザー・店舗・テナント・グループ・組織階層... 複雑なリレーションシップが絡み合う • ライセンス 契約とコンプライアンスに直結する
©KAKEHASHI inc. 非機能要求 #1 医療プロダクトを支える基盤システム • セキュリティ 患者の薬歴などの要配慮個人情報を取り扱う • 可用性
医療の現場の業務を止めてはいけない • 移植性 基盤システムとして永く運用し続ける必要がある • 性能・拡張性 日本の薬局は約60,000店舗 薬局は常に一定の時間に開局・閉局する データ量やトラフィックはある程度上限が推定できる
©KAKEHASHI inc. #2 TypeScriptで 基盤システムを構築する
©KAKEHASHI inc. 基盤システムを構築するなら #2 TypeScriptで基盤システムを構築する 静的型付け言語で堅牢かつ効率的な基盤システムを構築したいなら 選択肢は数多くある • Java パターンマッチ・仮想スレッド・レコードパターン...
今なお進化し続ける言語 • Go ゴルーチンで高パフォーマンスなアプリケーションを容易に構築できる • Rust メモリ安全で表現力の高い言語
©KAKEHASHI inc. なぜTypeScript? #2 TypeScriptで基盤システムを構築する 基盤システムでは複雑な機能要件を表現したい 認証・認可、ディレクトリサービス、ライセンスなど 複雑な状態遷移とリレーションシップがコード上で表現されてほしい TypeScriptの型の表現力でモデリングする 値やエンティティ、そして状態を型で表現する
コードや仕様の誤りを型検査時に発見できる • 「関数型ドメインモデリング」 (アスキードワンゴ社) • TypeScript 関数型スタイルでバックエンド開発のリアル - Speaker Deck • TypeScript開発にRailway Orientedを持ち込み、より型安全なエラーハンドリングへ - Sansan Tech Blog
©KAKEHASHI inc. 例) ディレクトリサービス #2 TypeScriptで基盤システムを構築する OrgRoot OrgGroup OrgGroup OrgGroup
OrgStore OrgGroup OrgGroup OrgStore OrgStore 店舗の親は グループのみ グループの親は グループかルート ルートは親を 持たない 親子関係の正確な表現
©KAKEHASHI inc. 例) ディレクトリサービス #2 TypeScriptで基盤システムを構築する OrgRoot OrgGroup OrgGroup OrgGroup
OrgStore OrgGroup OrgGroup OrgStore OrgStore シグニチャを 見れば発生する エラーがわかる 振る舞いの事後条件を型で示す
©KAKEHASHI inc. TypeScriptを採用する場合の注意点 #2 TypeScriptで基盤システムを構築する • クラスや例外機構における型推論 😭 過去のJavaScriptコードへ漸近的に型付けできるように クラスに対する型推論はゆるめなことも多い
例) メソッド記法は双変になってしまう 😭 try-catch文ではすべての例外がunknown型になるため ランタイムでの型の検証が必須 • CPU boundな処理が苦手 Node.jsはシングルスレッド ✅ I/O boundな処理 (非同期処理) をイベントループで高速に捌ける ❌ CPU boundな処理 (同期処理) を掴まされると他イベントの処理が詰まる
©KAKEHASHI inc. 指針 #2 TypeScriptで基盤システムを構築する 設計方針 • 型とスキーマを活用し、自己文書化されたコードを目指す • 移植性を高く保つ
• クラスや例外機構に頼らない ライブラリ選定方針 • スキーマ駆動である • 標準に基づいている • クラスや例外機構への依存度が低い
©KAKEHASHI inc. #3 型とスキーマを活用した 基盤システム
©KAKEHASHI inc. スキーマ検証ライブラリ #3 型とスキーマを活用した基盤システム TypeScriptにおけるスキーマ検証ライブラリは 単なる外界とのI/Fの文書化以上の意味を持つ 例: 値オブジェクトの定義 UserId型は必ずzodによる
UUID v4の検証を通してのみ インスタンス化される badUserIdは 型検査でエラーとなる
©KAKEHASHI inc. スキーマ検証ライブラリの選び方 #3 型とスキーマを活用した基盤システム - JSON Schemaベース Ajvなど 移植性を重視した選択肢
- Standard Schema準拠 Zod、Valibot、Arktype、Effect Schemaなど 多くのスキーマ検証ライブラリがサポートする標準インタフェース エンティティ、値オブジェクト、状態などの定義にもスキーマ検証ライブラリを使うなら TypeScriptでスキーマを定義できるZodがおすすめ ただしメールアドレスの検証ルールはライブラリによって細かく異なる場合がある 既存データを弾いてしまう / 不正データを許してしまうことがないようによく検証する
©KAKEHASHI inc. Webフレームワーク #3 型とスキーマを活用した基盤システム Hono 段階的に採用を進行中 • 様々なJSランタイムで実行可能 •
Web標準に基づいたデザイン fetch、Requests、Responses、URL、URLSearchParamなど • Standard Schemaをサポート リクエストやレスポンスをStandard Schemaで検証できる NestJS 新規では採用しない予定 Spring BootのようなリッチなDIコンテナを提供する • 型検査時ではなくランタイム時まで依存性の検証ができない • 明らかに型と一致しないサービスを注入できてしまう
©KAKEHASHI inc. データベースとの接続 #3 型とスキーマを活用した基盤システム Kysely 継続利用中 事前に用意した型定義に従ってクエリ結果に型を付けてくれるクエリビルダー Drizzle 注視
同じくクエリ結果に型を付けてくれるクエリビルダー Kyselyよりもリッチなマイグレーション機能を有する Prisma ORM 弊チームでは撤退済み (2023年頃) 様々なデータベースをサポートするType-safeを謳うORM 発行されるクエリが予想しづらく断念 • Prisma ORMを2年運用して培ったノウハウを共有する - Speaker Deck
©KAKEHASHI inc. #4 TypeScriptの 注意点を乗り越える
©KAKEHASHI inc. CPU boundな処理との向き合い方 #4 TypeScriptの注意点を乗り越える コンピューティングリソースを分離する 最もシンプルな解決策 • 他のAWS
ECSサービス/Cloud Runへ • 他のAWS Lambda/Cloud Run functionsへ Worker threadsを利用する CPU Boundな処理を他のスレッドへ逃がす方法 適切にWorker threadをハンドリングする能力と気合が必要
©KAKEHASHI inc. 仲間を探しています 数多くの医療プロダクトを支えるプラットフォームシステムを作るのは楽しい - 難易度の高い非機能要求を達成する - 複雑な医療業界をモデリングしてシステムに落とし込む - システムの正しさを仕組みで担保する
型システム、関数型ドメインモデリング、Effect System... テナント分離、Row Level Security... https://recruit.kakehashi.life/ お待ちしております!