【初心者向け】バックエンドのフォルダー構成をわかりやすく解説！

バックエンドの開発を始めるときに「どのフォルダーに何を入れればいいの？」と迷うことはありませんか？

本記事では、初心者の方でも理解しやすいように、バックエンドのプロジェクトでよく使われるフォルダー構成を解説します！💡

## 📂 バックエンドのフォルダー構成（基本）

以下のようなフォルダーを作成すると、コードが整理されて管理しやすくなります。

```
my-backend/
├── config/  ← 環境設定ファイル（データベースやAPIキーなど）
├── public/  ← 画像やCSSなどの静的ファイル
│   ├── images/
│   ├── styles/
│   ├── scripts/
│   └── index.html
├── src/  ← バックエンドのメインコード
│   ├── controllers/  ← APIの処理（リクエストの受け取り）
│   ├── models/  ← データベースのモデル（テーブル定義）
│   ├── routes/  ← APIのルート設定
│   ├── services/  ← ビジネスロジック（データ処理）
│   ├── middlewares/  ← 認証やログ管理などの処理
│   ├── repositories/  ← データベースとのやり取りを整理
│   ├── utils/  ← 便利な関数（共通処理）
│   ├── views/  ← テンプレートエンジン用のHTML
│   └── index.js (or server.js)  ← サーバーの起点
├── .env  ← 環境変数ファイル
├── package.json  ← プロジェクトの設定
└── README.md  ← 説明書
```

## 📌 各フォルダーの詳細な説明

### `config/`（設定ファイル）
✅ **用途**:
- データベース接続情報やAPIキー、環境変数を管理する。
- 設定を一元管理し、環境ごとに設定を切り替えられるようにする。

✅ **例:**
```js
// database.js
module.exports = {
  mongoURI: process.env.MONGO_URI || 'mongodb://localhost:27017/mydb'
};
```

### `controllers/`（コントローラー）
✅ **用途**:
- API のリクエストを受け取り、適切なサービスを呼び出す。
- フロントエンド（またはクライアント）とデータベースの間の橋渡しを行う。

✅ **例:**
```js
// userController.js
const userService = require('../services/userService');
exports.getUser = async (req, res) => {
  const user = await userService.getUserById(req.params.id);
  res.json(user);
};
```

### `models/`（データモデル）
✅ **用途**:
- データベースのテーブルやスキーマを定義する。
- ORMs（Mongoose, Sequelize, Prisma など）を使用して、データの型を管理する。

✅ **例:**
```js
// User.js
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
  name: String,
  email: String,
});
module.exports = mongoose.model('User', UserSchema);
```

### `routes/`（ルート）
✅ **用途**:
- API のエンドポイントを定義する。
- どの URL でどのコントローラーを実行するかを指定する。

✅ **例:**
```js
// userRoutes.js
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');
const authMiddleware = require('../middlewares/authMiddleware');

router.get('/users/:id', authMiddleware, userController.getUser);
module.exports = router;
```

### `services/`（サービス）
✅ **用途**:
- ビジネスロジックを処理する。
- データの加工や外部APIとの連携を行う。

✅ **例:**
```js
// userService.js
const userRepository = require('../repositories/userRepository');
exports.getUserById = async (id) => {
  return await userRepository.findById(id);
};
```

### `repositories/`（リポジトリ）
✅ **用途**:
- データベースとやり取りを行う処理をまとめる。
- `services/` から呼び出され、データの取得や更新を担当する。

✅ **例:**
```js
// userRepository.js
const User = require('../models/User');
exports.findById = async (id) => {
  return await User.findById(id);
};
exports.createUser = async (userData) => {
  return await User.create(userData);
};
```

### `middlewares/`（ミドルウェア）
✅ **用途**:
- リクエストの前後で実行される処理をまとめる。
- 認証、ログ記録、エラーハンドリングなどを実装する。

✅ **例:**
```js
// authMiddleware.js
module.exports = (req, res, next) => {
  if (!req.user) {
    return res.status(401).json({ message: 'Unauthorized' });
  }
  next();
};
```

### `utils/`（ユーティリティ）
✅ **用途**:
- どの機能でも使える共通の便利な関数を定義する。

✅ **例:**
```js
// formatDate.js
exports.formatDate = (date) => {
  return new Date(date).toLocaleDateString();
};
```

### `public/`（静的ファイル）
✅ **用途**:
- 画像、CSS、JavaScript など、クライアントが直接アクセスできるファイルを格納する。

### `views/`（テンプレート）
✅ **用途**:
- サーバーサイドレンダリング（SSR）をする場合、HTMLテンプレートを管理する。
- 例: `EJS`, `Pug`, `Handlebars` など。

### `index.js`（または `server.js`）
✅ **用途**:
- アプリケーションのエントリーポイント。
- Express などのフレームワークでサーバーを起動する。

✅ **例:**
```js
// index.js
const express = require('express');
const app = express();
const userRoutes = require('./src/routes/userRoutes');

app.use('/api', userRoutes);
app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});
```

## 🎯 まとめ
バックエンドのフォルダー構成を整理すると、
✅ **コードがスッキリする！**
✅ **開発がしやすくなる！**
✅ **チーム開発でも迷わない！**

初心者の方は、まず `controllers/`, `models/`, `routes/` から作ってみると良いでしょう！💡

🔰 **「こんなフォルダーも知りたい！」というリクエストがあれば、ぜひコメントください！** 🚀