2.

djangoにおけるMVC(MVT)の使い方と説明

編集
この記事の要点
  • MVC / MVT は Web アプリケーションの3 層構造設計パターン
  • MVC: Model (データ) / View (表示) / Controller (制御)
  • MVT (Django 特有): Model / Template (View 相当) / View (Controller 相当)
  • 主要フレームワーク: Spring MVC / Laravel / Rails (MVC) / Django (MVT)
  • 責務分離でテスト容易・保守性向上・並行開発しやすくなる

 

MVC とは

MVC (Model-View-Controller) は Web アプリケーションを 3 つの責務に分けて設計する古典的なパターンです。

役割
ModelデータとビジネスロジックDB 接続、エンティティ、サービスクラス
View表示(プレゼンテーション)HTML テンプレート、JSP、Blade、Twig
Controllerリクエスト処理と View 選択URL ハンドラ、@Controller クラス

MVC のフロー

  1. ユーザがブラウザでリクエスト送信
  2. Controller がリクエストを受信
  3. Controller が Model を呼び出してデータ取得
  4. Controller が View にデータを渡す
  5. View が HTML を生成してレスポンス

主要フレームワーク別の実装

Spring MVC (Java)

// Controller
@Controller
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;  // ← Model 層

    @GetMapping("/{id}")
    public String show(@PathVariable Long id, Model model) {
        User user = userService.findById(id);  // Model 呼び出し
        model.addAttribute("user", user);
        return "users/show";  // ← View 名(Thymeleaf テンプレート)
    }
}

// Model (Entity + Service)
@Entity
public class User {
    @Id private Long id;
    private String name;
}

@Service
public class UserService {
    @Autowired private UserRepository userRepository;

    public User findById(Long id) {
        return userRepository.findById(id).orElseThrow();
    }
}

名前

メール

Laravel (PHP)

// Controller: app/Http/Controllers/UserController.php
class UserController extends Controller {
    public function show($id) {
        $user = User::findOrFail($id);  // Model (Eloquent)
        return view("users.show", compact("user"));  // View 呼び出し
    }
}

// Model: app/Models/User.php
class User extends Model {
    protected $fillable = ["name", "email"];
}

{{ $user->name }}

{{ $user->email }}

Rails (Ruby)

# Controller: app/controllers/users_controller.rb
class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])  # Model
    # 自動的に app/views/users/show.html.erb をレンダリング
  end
end

# Model: app/models/user.rb
class User < ApplicationRecord
end

<%= @user.name %>

<%= @user.email %>

MVT とは (Django)

Django は MVC のうち「View」と「Controller」の役割が逆転した独自命名を採用しています。

標準 MVCDjango (MVT)説明
ModelModel同じ
View (HTML)TemplateHTML テンプレート
ControllerViewリクエスト処理(紛らわしい)

Django (Python) の例

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("users//", views.user_detail, name="user_detail"),
]

# views.py (役割は MVC の Controller)
from django.shortcuts import render, get_object_or_404
from .models import User

def user_detail(request, id):
    user = get_object_or_404(User, pk=id)  # Model 呼び出し
    return render(request, "users/detail.html", {"user": user})  # Template

# models.py (Model)
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()

{% extends "base.html" %}
{% block content %}
    

{{ user.name }}

{{ user.email }}

{% endblock %}

MVC のメリット

  • 責務分離: 各層が独立してテスト可能
  • 並行開発: フロント (View) とバック (Controller/Model) を別チームで開発可能
  • 保守性: View 変更がロジックに影響しない
  • 再利用: 同じ Model を複数 View で使い回せる
  • テスト容易: Model / Controller を独立して単体テスト可能

MVC の限界とモダンアーキテクチャ

純粋 MVC では Controller がビジネスロジックを抱え込む「Fat Controller」問題が起きがち。モダンな対策:

  • Service 層追加: Controller → Service → Model の 4 層
  • Repository 層: DB アクセスを抽象化(Model から分離)
  • DTO: Controller ↔ View 間のデータ転送オブジェクト
  • Form Request / DTO 検証: バリデーション層の分離

モダンな層構成例 (Spring Boot)

  • Controller: HTTP 受付、リクエスト → DTO 変換
  • Service: ビジネスロジック、トランザクション境界
  • Repository: DB アクセス (JPA / MyBatis)
  • Entity: DB マッピング
  • DTO: API レスポンス / リクエスト型

SPA + API での MVC

React/Vue + REST API の構成では、View が完全にフロント側に移動:

  • サーバ側: Model + Controller (Service 含む)。REST API で JSON 返却
  • クライアント側: View (React/Vue コンポーネント) + 状態管理

関連記事

編集
Post Share
子ページ
  1. ビュー(View)
  2. テンプレート(Template)
  3. モデル(Model)
  4. ルーティングの作成
  5. viewからtemplateへの遷移方法
同階層のページ
  1. 環境構築とプロジェクト/アプリの作成
  2. MVC(MVT)のそれぞれの使い方と説明
  3. データベースへの接続と操作
  4. Django Administration
  5. git管理
  6. エラー一覧
  7. バージョンの確認方法
  8. ログ出力方法
  9. SQLのログ出力方法
  10. ログのローテート設定
  11. settings.pyの定数にアクセスする方法
  12. 本番環境へのインストールとアプリのデプロイ(apache編)
  13. 本番環境へのインストールとアプリのデプロイ(nginx編)
  14. djangoアプリの本番の開始URLを変更する
  15. 静的(static)ファイルの置き場所と読み込み(画像、css、js )
  16. CSRFトークンをAjaxで使用する方法
  17. ajaxの使用例(POST編)
  18. ファイルのアップロードとファイルの名前
  19. クイックスタート/チュートリアル
  20. ログイン機能
  21. テンプレート側のログイン判定
  22. ビュー側のログイン判定
  23. 管理者ユーザーの作成/判定と管理画面
  24. モデルのjson化とレスポンス
  25. runserverでポートを指定する方法
  26. cronによるバッチ実行
  27. テンプレートで利用する共通のcontextを定義する方法
  28. プログラムが本番サーバーで反映されない場合の対処法
  29. APIの作成
  30. cron用コマンド・ファイルの作成

最近更新/作成されたページ