TypeScript中級

中級 TypeScriptで学ぶマイクロサービス|練習問題編

導入

マイクロサービスアーキテクチャは、現代のソフトウェア開発において重要な役割を果たしています。特に、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}`);
});

コードの行ごとの解説

  1. import express from ‘express’; – Expressフレームワークをインポートします。これにより、HTTPサーバーを簡単に構築できます。
  2. const app = express(); – Expressアプリケーションのインスタンスを作成します。
  3. app.use(express.json()); – JSON形式のリクエストボディを解析するミドルウェアを追加します。
  4. interface User { … } – ユーザーオブジェクトの型を定義します。TypeScriptの型定義により、データの整合性が保証されます。
  5. app.post(‘/users’, …); – 新しいユーザーを追加するためのPOSTエンドポイントを定義します。
  6. app.get(‘/users’, …); – 登録されたユーザーのリストを取得するためのGETエンドポイントを定義します。
  7. app.listen(PORT, …); – 指定したポートでサーバーを起動します。

練習問題編

以下の練習問題に取り組んで、マイクロサービスにおけるTypeScriptの理解を深めてください。

  1. 問題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. 問題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. 問題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を用いたマイクロサービスの実装により、型安全性が向上し、エラーを早期に発見しやすくなります。
  • サービス間の通信やデータ整合性の管理は、マイクロサービスの設計において重要な要素です。