導入
マイクロサービスアーキテクチャは、現代のソフトウェア開発において重要な役割を果たしています。特に、TypeScriptを用いたマイクロサービスの実装は、型安全性と開発効率を向上させるための強力な手段です。本記事では、実際の業務で遭遇する具体的なシチュエーションを通じて、マイクロサービスにおけるTypeScriptの活用方法を探ります。
教科書レベルの解説(マイクロサービス)
重要な概念の整理
マイクロサービスは、小さな独立したサービスの集まりであり、各サービスは特定の機能を提供します。これにより、開発チームは異なるサービスを並行して開発し、デプロイすることが可能になります。このアプローチは、スケーラビリティやメンテナンス性の向上に寄与します。ただし、サービス間の通信やデータの整合性を管理するための課題も伴います。
コード例(TypeScript)
import express from 'express';
import { Request, Response } from 'express';
const app = express();
const PORT = 3000;
app.use(express.json());
interface User {
id: number;
name: string;
}
let users: User[] = [];
app.post('/users', (req: Request, res: Response) => {
const newUser: User = req.body;
users.push(newUser);
res.status(201).send(newUser);
});
app.get('/users', (req: Request, res: Response) => {
res.send(users);
});
app.listen(PORT, () => {
console.log(`Server is running on http://localhost:${PORT}`);
});
コードの行ごとの解説
- import express from ‘express’; – Expressフレームワークをインポートします。これにより、HTTPサーバーを簡単に構築できます。
- const app = express(); – Expressアプリケーションのインスタンスを作成します。
- app.use(express.json()); – JSON形式のリクエストボディを解析するミドルウェアを追加します。
- interface User { … } – ユーザーオブジェクトの型を定義します。TypeScriptの型定義により、データの整合性が保証されます。
- app.post(‘/users’, …); – 新しいユーザーを追加するためのPOSTエンドポイントを定義します。
- app.get(‘/users’, …); – 登録されたユーザーのリストを取得するためのGETエンドポイントを定義します。
- app.listen(PORT, …); – 指定したポートでサーバーを起動します。
練習問題編
以下の練習問題に取り組んで、マイクロサービスにおけるTypeScriptの理解を深めてください。
-
問題1: 上記のコードにユーザーをIDで取得するGETエンドポイントを追加してください。
模範解答:
app.get('/users/:id', (req: Request, res: Response) => { const userId = parseInt(req.params.id); const user = users.find(u => u.id === userId); if (user) { res.send(user); } else { res.status(404).send({ message: 'User not found' }); } }); -
問題2: ユーザーの削除機能を実装してください。
模範解答:
app.delete('/users/:id', (req: Request, res: Response) => { const userId = parseInt(req.params.id); users = users.filter(u => u.id !== userId); res.status(204).send(); }); -
問題3: エラーハンドリングを追加して、無効なリクエストに対して適切なエラーメッセージを返すようにしてください。
模範解答:
app.post('/users', (req: Request, res: Response) => { const newUser: User = req.body; if (!newUser.id || !newUser.name) { return res.status(400).send({ message: 'Invalid user data' }); } users.push(newUser); res.status(201).send(newUser); });
まとめ
- TypeScriptを用いたマイクロサービスの実装により、型安全性が向上し、エラーを早期に発見しやすくなります。
- サービス間の通信やデータ整合性の管理は、マイクロサービスの設計において重要な要素です。