mcpField
B
backend-development

backend-development

github.com/moizibnyousaf開発1.2k869 回インストール5 週間前に更新
リポジトリ

backend-development について

Backend Developmentは、REST API、データベース、認証、キャッシュ、レート制限、可観測性など、一般的なバックエンド設計パターンを扱うスキルです。バックエンドサービスを設計・実装する開発者向けの参考資料です。

主な機能

  1. 01REST APIの規約を適用
  2. 02レスポンスとエラー形式を設計
  3. 03データベーススキーマとクエリパターンを活用
  4. 04JWT認証ミドルウェアを実装
  5. 05キャッシュアサイドとレート制限を適用
  6. 06ログ、メトリクス、トレース、ヘルスチェックを計画

活用シーン

  1. 01RESTエンドポイントとレスポンス形式を設計
  2. 02データベーススキーマとページネーションクエリを計画
  3. 03認証、キャッシュ、レート制限を追加
  4. 04サービスのログとヘルスチェックを定義

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/moizibnyousaf/ai-agent-skills --skill backend-development

インストール後、Claude Code で/backend-developmentを入力して読み込まれたか確認します。

詳細

バックエンド開発

API 設計

RESTful の規約
GET    /users          # List users
POST   /users          # Create user
GET    /users/:id      # Get user
PUT    /users/:id      # Update user (full)
PATCH  /users/:id      # Update user (partial)
DELETE /users/:id      # Delete user

GET    /users/:id/posts  # List user's posts
POST   /users/:id/posts  # Create post for user
レスポンス形式
{
  "data": { ... },
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 100
  }
}
エラー形式
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid input",
    "details": [
      { "field": "email", "message": "Invalid format" }
    ]
  }
}

データベースのパターン

スキーマ設計
-- Use UUIDs for public IDs
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  public_id UUID DEFAULT gen_random_uuid() UNIQUE,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW(),
  updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Soft deletes
ALTER TABLE users ADD COLUMN deleted_at TIMESTAMPTZ;

-- Indexes
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_created ON users(created_at DESC);
クエリのパターン
-- Pagination with cursor
SELECT * FROM posts
WHERE created_at < $cursor
ORDER BY created_at DESC
LIMIT 20;

-- Efficient counting
SELECT reltuples::bigint AS estimate
FROM pg_class WHERE relname = 'users';

認証

JWT パターン
interface TokenPayload {
  sub: string;      // User ID
  iat: number;      // Issued at
  exp: number;      // Expiration
  scope: string[];  // Permissions
}

function verifyToken(token: string): TokenPayload {
  return jwt.verify(token, SECRET) as TokenPayload;
}
ミドルウェア
async function authenticate(req: Request, res: Response, next: Next) {
  const token = req.headers.authorization?.replace('Bearer ', '');
  if (!token) {
    return res.status(401).json({ error: 'Unauthorized' });
  }

  try {
    req.user = verifyToken(token);
    next();
  } catch {
    res.status(401).json({ error: 'Invalid token' });
  }
}

キャッシュ戦略

// Cache-aside pattern
async function getUser(id: string): Promise<User> {
  const cached = await redis.get(`user:${id}`);
  if (cached) return JSON.parse(cached);

  const user = await db.users.findById(id);
  await redis.setex(`user:${id}`, 3600, JSON.stringify(user));
  return user;
}

// Cache invalidation
async function updateUser(id: string, data: Partial<User>) {
  await db.users.update(id, data);
  await redis.del(`user:${id}`);
}

レート制限

const limiter = rateLimit({
  windowMs: 60 * 1000,  // 1 minute
  max: 100,             // 100 requests per window
  keyGenerator: (req) => req.ip,
  handler: (req, res) => {
    res.status(429).json({ error: 'Too many requests' });
  }
});

オブザーバビリティ

  • ロギング:リクエスト ID を含む構造化 JSON ログ
  • メトリクス:リクエストのレイテンシ、エラー率、キューの深さ
  • トレーシング:相関 ID を使用した分散トレーシング
  • ヘルスチェック:/health および /ready エンドポイント

コメント