バックエンドの開発を始めるときに「どのフォルダーに何を入れればいいの?」と迷うことはありませんか?
本記事では、初心者の方でも理解しやすいように、バックエンドのプロジェクトでよく使われるフォルダー構成を解説します!💡
📂 バックエンドのフォルダー構成(基本)
以下のようなフォルダーを作成すると、コードが整理されて管理しやすくなります。
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キー、環境変数を管理する。
- 設定を一元管理し、環境ごとに設定を切り替えられるようにする。
✅ 例:
// database.js
module.exports = {
mongoURI: process.env.MONGO_URI || 'mongodb://localhost:27017/mydb'
};
controllers/
(コントローラー)
✅ 用途:
- API のリクエストを受け取り、適切なサービスを呼び出す。
- フロントエンド(またはクライアント)とデータベースの間の橋渡しを行う。
✅ 例:
// 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 など)を使用して、データの型を管理する。
✅ 例:
// User.js
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
name: String,
email: String,
});
module.exports = mongoose.model('User', UserSchema);
routes/
(ルート)
✅ 用途:
- API のエンドポイントを定義する。
- どの URL でどのコントローラーを実行するかを指定する。
✅ 例:
// 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との連携を行う。
✅ 例:
// userService.js
const userRepository = require('../repositories/userRepository');
exports.getUserById = async (id) => {
return await userRepository.findById(id);
};
repositories/
(リポジトリ)
✅ 用途:
- データベースとやり取りを行う処理をまとめる。
-
services/
から呼び出され、データの取得や更新を担当する。
✅ 例:
// 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/
(ミドルウェア)
✅ 用途:
- リクエストの前後で実行される処理をまとめる。
- 認証、ログ記録、エラーハンドリングなどを実装する。
✅ 例:
// authMiddleware.js
module.exports = (req, res, next) => {
if (!req.user) {
return res.status(401).json({ message: 'Unauthorized' });
}
next();
};
utils/
(ユーティリティ)
✅ 用途:
- どの機能でも使える共通の便利な関数を定義する。
✅ 例:
// formatDate.js
exports.formatDate = (date) => {
return new Date(date).toLocaleDateString();
};
public/
(静的ファイル)
✅ 用途:
- 画像、CSS、JavaScript など、クライアントが直接アクセスできるファイルを格納する。
views/
(テンプレート)
✅ 用途:
- サーバーサイドレンダリング(SSR)をする場合、HTMLテンプレートを管理する。
- 例:
EJS
,Pug
,Handlebars
など。
index.js
(または server.js
)
✅ 用途:
- アプリケーションのエントリーポイント。
- Express などのフレームワークでサーバーを起動する。
✅ 例:
// 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/
から作ってみると良いでしょう!💡
🔰 「こんなフォルダーも知りたい!」というリクエストがあれば、ぜひコメントください! 🚀