1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-03-01

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

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

📂 バックエンドのフォルダー構成(基本)

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

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/ から作ってみると良いでしょう!💡

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?