MVC(Model-View-Controller)パターン

MVCパターンとは?

モデル-ビュー-コントローラー(model-view-controller、MVC)は、ソフトウェア工学で使われるソフトウェアデザインパターンである。このMVCパターンは、プログラムの処理を役割ごとに分けて開発するという考え方で、Webシステム開発でよく使われる。
MVCパターンは、システム処理の中核となるModel、画面表示や入出力を行うView、ユーザーからの入力情報を受け取り、その内容に応じてModelとViewを制御するControllerのそれぞれの頭文字を組み合わせたものである。
Model”、"View"、"Controller"に分けるとシステム開発が整理され、開発効率を高められる。そのため、効率を最優先する場合や、開発スタッフの負担を軽減したい場合に適した開発方法と言える。

MVC
画像出典: https://developer.mozilla.org/ko/docs/Glossary/MVC

データベースとデータをやり取りするModel(モデル)

Modelはシステムのビジネスロジックを担当する部分であり、いわばシステムの本体、根幹にあたる部分である。データベースとのデータ交換を処理する部分で、具体的にはシステム内部のデータ処理やデータベースへの保存なども行うため、非常に重要な部分になる。

特に、クライアントからリクエストを受けたControllerは、Modelにデータを検索するよう指示する。指示を受けたModelはデータベースからデータを検索し、Controllerへデータを送る。
Modelはデータベースからデータを検索するだけでなく、検索されたデータをデータベースに保存、更新、削除することもできる。
また、データベースから受け取ったデータをControllerが扱いやすい形に変換して送信することもある。例えば、データベースでは日付を保存するときに"2022-12-03"のように保存することが多いが、ここで"2022年12月03日"のように読みやすい形に変換してControllerへ送ることで、その後の作業でも理解しやすくなる。

動的に生成されたHTMLを基に画面表示を行うView(ビュー)

Viewは、ユーザーがPCやスマートフォンなどで見る画面にあたるユーザーインターフェース部分の処理を行っている。また、画面表示だけでなく、レイアウトやメニュー、ボタンの操作性など、デザイン面や操作性もViewの役割である。

具体的には、ControllerがModelから受け取ったデータを制御した後、Viewへデータを送信する。このとき、そのままWebブラウザに表示されるのではなく、HTMLやCSS、JavaScriptなどの処理を行って画面表示するようになっている。

ViewとModelを制御するController(コントローラー)

ControllerはViewとModelの動作を制御する。Controller自体は画面表示やロジックの実行を行わず、クライアントからの入力に応じて必要なロジックの実行をModelに指示し、その結果の表示をViewに指示するなど、仲介的な役割を持つ重要なポジションである。

具体的には、クライアントから受け取った要求をあらかじめ定められた方法で処理し(ルーティング)、Modelにデータの照会などを指示して、照会したデータを受け取る。そして、そのデータをViewへ送る。

Flow

  1. クライアントが送ったリクエストをControllerが受け取る。(Request)
  2. ControllerがModelに処理の実行を指示する。
  3. 指示を受けたModelが処理結果をControllerへ送信する。
  4. ControllerがViewに表示の実行を指示する。
  5. Viewで画面表示する。(Response)

このようにMVCパターンは、ビジネスロジックとなるModel、画面表示や入出力を担当するView、ModelとViewを仲介するControllerに役割を分けて開発を進める方法であり、この方式を採用したフレームワークは多く存在する。その中でもJavaフレームワークのSpring、RubyフレームワークのRuby on Rails、PythonフレームワークのDjangoなどが代表的である。

MVCパターンの歴史

MVCパターンは、1979年にXerox Palo Alto Research CenterでTrygve Reenskaugによって考案されたことが始まりである。もともとはオブジェクト指向のプログラミング言語および統合開発環境であるSmalltalkのウィンドウプログラム開発における設計指針として誕生したが、その後GUI仕様のソフトウェア構造が複雑化するという課題からMVCパターンの汎用性が注目され、一気に広がった。Webシステムで広く利用されるようになったのは、JavaServer Pages(JSP)で採用されたことがきっかけだと言われている。

MVCパターンのメリット

MVCパターンは役割ごとに独立しているため、作業の切り分けが明確になり、並行開発が可能になって開発効率が向上するだけでなく、保守性も高められる。例えば、UI部分に問題が発生した場合、クライアントへの画面表示を担当するView部分に原因があると推測できる。このような課題解決の工数も最小限に抑えられる。また、ControllerやModelへの影響を抑えられる利点もある。このようにMVCパターンではコンポーネント間の依存性が最小化されるため、コードの再利用性も高い。

MVCパターンのデメリット

開発効率の向上を期待できるMVCパターンだが、開発効率が落ちる恐れのあるデメリットも存在する。
MVCパターンは機能ごとに開発を切り分けるため、各機能を分けなければならない。しかし、これはコード記述に制約が増えることにもつながり、場合によってはかえって時間がかかってしまうこともある。また、このような特徴により、小規模開発には適していない場合もある。
さらに、機能が高度になると、データベースとの相互作用やデータ変換を行うModel部分と、その仲介を担うController部分に負荷がかかり、処理速度が遅くなる可能性がある。そして、ControllerからModelへの支援が大きくなりすぎると、ModelのControllerに対する依存度が高まり、MVCパターンの利点である機能別の独立性を維持できなくなる恐れがある。そのため、システム開発を行う場合は、あらかじめ開発規模を把握しておく必要がある。

デメリットの回避

システム開発における機能拡大によるデメリットを避けるには、ControllerとModel部分を無理に拡張しないことが求められる。
Controller部分とModel部分への負荷を減らすことで、円滑にシステム開発を進められる。
モデルが適切な内容か確認し、必要な処理を厳選して負荷をできるだけ減らすことができる。

より作業効率を高めるために

MVCパターンは機能別に分業できるため、各分野に専門家を配置することで、より作業効率を高められる。MVCパターンはシステム開発の概念だが、開発以外でも会社の構造や組織を表す場合に使われることがある。仕事を円滑に進めるためにも覚えておいて損はないだろう。

参考文書