JavaにおけるMVCモデルとは?MVCモデルの3つの役割を紹介

MVCとは?
MVC(MVCモデル)とは、ユーザーインターフェースを持つアプリケーションを構築する際に用いられる、コーディングのデザインパターンのことです。MVCに従ってコーディングをすることで、管理しやすく見通しの良いアプリケーションを構築することができます。特に、構造が複雑なグラフィカルユーザーインターフェースにおいて非常に有用とされ、現在においてもそのデザインパターンは広く認知されています。
MVCを構築する3つの要素
MVCとは、model view controllerの英単語の頭文字を取ったものです。MVCでは、アプリケーションにおける機能やデータの保存、その他のロジックなどを、model・view・controllerの3つに分けて考えます。3つの要素の役割を理解し、しっかりと役割分担をさせることが重要です。ここでは、家計簿を記録するアプリケーションを例に、model・view・controllerそれぞれの役割について説明します。
model
modelは主に、アプリケーションで取り扱うデータの格納、データの処理や計算、その他のロジックなど、データの保存と計算を担当します。今回の例では、家計簿に記録する金額の一時的な保存や、税金の計算、1日の支出計算などが該当します。また、新たな支出を記録した際にその日の合計金額が増える場合には、合計金額の変更を見た目に反映させるため、後述するviewに通知するという役割も担います。
view
viewはその名のとおり、UIへの出力を担当します。ウェブアプリケーションではHTMLやCSSなどを指し、一般的なGUIではウィジェットの階層構造を指します。modelに保存されている情報は、viewに渡されることで初めてユーザーが確認できます。今回の例では、支出をただ数値で表示するだけでなく、グラフや図などを利用してより視覚的に表示したり、配置や配色などを工夫することで、ユーザーエクスペリエンスの高いアプリケーションを構築することに繋がります。
controller
controllerは、UIからの入力に対する処理を担当します。ユーザーによるテキストボックスへの入力や、ボタン押下などのイベントに対するハンドラとなり、該当するモデルのメソッドを呼び出すのが主な役割です。modelのデータを直接書き換えたり、viewの描画を変更したりはしません。今回の例では、テキストボックスに新たな支出を登録した際に、model内にある合計金額を再計算するメソッドを呼び出す、が該当します。
JavaのGUIフレームワーク
JavaにおいてGUI(グラフィカルユーザーインターフェース)を構築する際には、MVCのデザインパターンがとても役に立ちます。一般的に、JavaでGUIを構築する際には、SwingやjavaFXなどのフレームワークを用いることがほとんどです。フレームワークが提供するAPIを利用することで、とても効率的に開発ができます。
JavaでMVCモデルを実装してみよう
ここではJavaでSwingを利用し、支出を登録して合計金額を計算するGUIアプリケーションを、MVCモデルに従って構築する例をご紹介します。イメージを理解することが目的なので、記載するソースコードが確実に動作することは保証しておりません。今回は説明を簡単にするため、支出を登録する機能、登録した支出の一覧を表示する機能、合計支出を計算して表示する機能の3つを実装します。
MVCそれぞれの役割
上記の3つの機能が、それぞれMVCモデルのどれに該当するかを考えましょう。まずmodelは、支出の保存、合計支出の計算を担当します。次にviewは、支出一覧と合計支出の表示を行います。最後にcontrollerは、新しく入力した支出のハンドラとして機能します。MVCモデルの考え方は理解できたでしょうか。それでは、実際のコーディングに入りましょう。
modelの実装
public class Model { private int totalSpending = 0; private ArrayList spendings = new ArrayList(); public void addSpending(int spending) { this.spendings.add(spending); this.totalSpending += spending; } public int getTotalSpending() { return this.totalSpending; } public ArrayList getSpendings() { return this.spendings; }}
最初にモデルです。メンバとして、支出の合計を保存するtotalSpendingと、支出一覧を保存するspendingsを持ちます。また、これらのメンバにアクセスするためのゲッターを定義しています。支出を新たに追加する処理を担うのがaddSpendingメソッドです。支出を保存し、合計金額を更新します。modelが担う処理は、これですべてです。
viewの実装
import javax.swing.*;import java.awt.*;public class View extends JPanel { Model model = new Model(); public View() { setBackground(Color.white); setPreferredSize(new Dimension(800, 800)); } public void paintComponent(Graphics g) { super.paintComponent(g); int y = 0; model.getSpendings().forEach(spending -> { g.drawString(spending.toString(), 0, y * 10); y++; }); g.drawString(model.getTotalSpending(), 0, y * 10); }}
viewのメンバで、先程のmodelをインスタンス化します。コンストラクタでは、背景色とウィンドウを定義しています。paintComponentメソッドは、画面上にお絵かきをしたり文字を表示するための2Dコンテキストである、Graphicsクラスを引数として受け取ることができます。この関数内でmodelのゲッターにアクセスし、modelに保存されている値をviewで表示します。
controllerの実装
import javax.swing.*;import java.awt.*;import java.awt.event.*; // 追加public class View extends JPanel implements ActionListener { // 追加 (略) // 追加 public void actionPerformed(ActionEvent e){ model.addSpending(テキストボックスに入力された値); }}
今回の例ではcontrollerの処理が少ないため、viewクラスの中に記述します。上記のソースコードはあくまでイメージです。テキストボックスを用意し、ボタン押下などでactionPerformedメソッドがハンドラとして動くことを想定しています。actionPerformedメソッドでは、テキストボックスに入力された数値を、modelのaddSpendingメソッドに渡します。そうすることでmodelに支出が記録され、合計支出も更新されるという流れです。JavaにおけるMVCの簡単な例でしたが、イメージできたでしょうか。
MVCモデルを理解して綺麗なコーディングをしよう
MVCモデルについて理解できたでしょうか。なんとなくでも理解することで、圧倒的にコーディングが綺麗になり、良いアプリケーションを構築する土台となります。MVCモデルを意識して、最高のアプリケーションを構築しましょう。
FEnetを運営しているネプラス株式会社はサービス開始から10年以上
『エンジニアの生涯価値の向上』をミッションに掲げ、
多くのインフラエンジニア・ネットワークエンジニアの就業を支援してきました。
ネプラス株式会社はこんな会社です
秋葉原オフィスにはネプラス株式会社をはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
インフラ業界に特化
ネットワーク・サーバー・データベース等、ITインフラ業界に特化。Cisco Systemsプレミアパートナーをはじめ各種ベンダーのパートナー企業です。
業界を知り尽くしているからこそ大手の取引先企業、経験豊富なエンジニアに選ばれています。
-
正社員なのにフリーランスのような働き方
正社員の方でも希望を聞いたうえでプロジェクトをアサインさせていただいており、フリーランスのような働き方が可能。帰社日もありません。
プロジェクト終了後もすぐに次の案件をご紹介させていただきますのでご安心ください。
-
大手直取引の高額案件
案件のほとんどが大手SIerやエンドユーザーからの直取引のためエンジニアの皆様へに高く還元できています。
Ciscoをはじめ、Juniper、Azure、Linux、AWS等インフラに特化した常時300件以上の案件があります。
-
スキルアップ支援
不要なコストを削減し、その分エンジニアの方へのスキルアップ支援(ネットワーク機器貸出、合格時の受験費用支給など)や給与で還元しています。
受験費用例)CCNP,CCIE:6-20万円、JNCIS:3-4万円、AWS:1-3万円など
※業務に関連する一定の資格のみ。各種条件がありますので詳しくは担当者へにお尋ねください。
-
現給与を保証します!※
前職の給与保証しており、昨年度は100%の方が給与アップを実現。収入面の不安がある方でも安心して入社していただけます。
※適用にはインフラエンジニアの業務経験1年以上、等一定の条件がございます。
-
インセンティブ制度
ネットワーク機器の販売・レンタル事業等、売上に貢献いただいた方にはインセンティブをお支払いしています。
取引先企業とエンジニア側、双方にメリットがあり大変好評をいただいています。
-
社会保険・福利厚生
社員の方は、社会保険を完備。健康保険は業界内で最も評価の高い「関東ITソフトウェア健康保険組合」です。
さらに様々なサービスをお得に利用できるベネフィットステーションにも加入いただきます。
-
東証プライム上場企業グループ
ネプラスは東証プライム上場「株式会社夢真ビーネックスグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
ネプラス株式会社に興味を持った方へ
ネプラス株式会社では、インフラエンジニアを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
オンライン面接も随時受付中。ぜひお気軽にご応募ください。


Java新着案件New Job
-
【高額年収】/【CCNA取得者歓迎】/ネットワークの構築/BIG-IP/東京都千代田区/【WEB面談可】/在宅ワーク/20代~30代の方活躍中
年収540万~540万円東京都千代田区(神保町駅) -
東京都中央区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅ワーク
年収600万~600万円東京都中央区(小伝馬町駅) -
【高額年収】/インフラ構築支援/東京都港区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/在宅ワーク
年収960万~960万円東京都港区(新橋駅) -
ガバナンス推進、セキュリティ基盤支援/東京都港区/【WEB面談可】/在宅ワーク/20代~40代の方活躍中
年収780万~780万円東京都港区(新橋駅) -
カー用品販売会社の情報システム運用/東京都千代田区/【WEB面談可/インフラサーバ経験者/20~40代の方活躍中】/テレワーク
年収576万~576万円東京都千代田区(水道橋駅) -
ネットワーク構築、検証/東京都渋谷区/【WEB面談可】/テレワーク/20代~40代の方活躍中
年収540万~540万円東京都渋谷区(渋谷駅)