MVC, ORM



MVC


ソフトウェア設計に関連する設計モデルは、ソフトウェアエンジニアリングでよく使われる設計モデルである.

MVC


MVCは,モデル,ビュー,コントローラを3つの役割に分けて,コードメンテナンスの開発を容易にする方法である.
MVCモードの流れは以下のように簡単に説明される.
  • ユーザが検索/クリックボタン等の操作を行うと、必要な機能を処理するためにコントローラに要求が送信される.
  • コントローラは、ビューの要求に従ってモデルに要求を送信し、モデルはビジネスロジックを実行する.
  • コントローラは、ユーザに表示するビューを選択する.
  • のビューを選択すると、コントローラからデータが受信され、画面に表示されます.
  • Model

  • データを処理し、業務ロジックを実行する
  • データベースとコントローラと対話します.
  • View

  • ユーザーが表示するUI.
  • コントローラと対話します.
  • ビューを更新する方法は、モデルを使用して直接更新するか、定期的にモデルの変更を検出するポーリングによって更新します.
  • Controller

  • モデルとビューを接続します.
  • ビューからの要求を受信し、モデルにビジネスロジックを実行し、受信したデータをビューに再送信します.
  • のビジネスロジックが格納されています.
  • 計画では、どのような問題を解決しますか?
  • どうすれば問題を解くことができますか?
  • のように書かれた各文章は機能となり、その機能はビジネスロジックとなる.
  • MVC優勢

  • MVCモードを使用すると、3つのロール割り当てに分けられ、プログラムを拡張する際に柔軟性があります.たとえば、Webにサービスを拡張する場合は、ビューとコントローラロジックを変更するだけで既存のモデルを使用できます.
  • はまた、同じコードの重複使用を回避し、重複開発を回避することができる.
  • 最後に、実行中に問題が発生した場合、3つのロールに分けることができるため、エラーを見つけて解決しやすい.
  • MVC欠点


    サービス機能が多ければ多いほど、コントローラの作業が重くなり、コントローラはビューとモデルに依存します.したがって,コードの修正が困難であり,多様な副作用が生じる可能性がある.

    ORM


    Object-Relational Mapping
    JavaScriptのオブジェクトとリレーショナル・データベースのエンティティ間の橋渡しロール

    なぜORMを書くのですか?

  • 元の言語を使うだけで、SQL
  • を再学習する必要はありません.
  • オブジェクトコード向けで、より直感的で分かりやすい

    Sequelize

  • a promise-based Node.js ORM
  • がサポートするRDBMS
  • Postgres
  • MySQL
  • MariaDB
  • SQLite
  • Microsoft SQL Server
  • ORMサンプルコード

    var Sequelize = require('sequelize');
    var db = new Sequelize('chatter','root',''); //(db이름, user, password)
    
    var User = db.define('User', { //define 메소드로 스키마를 작성하는 과정
      username: Sequelize.STRING 
      //mysql에서는 varchar(255)로 썼는데, rdbms 사이의 호환성을 유지시키기 위해 sequelize에서 타입을 만든 것
      //sequelize에서 자동으로 id(pk), created_at, update_at 등을 자동으로 생성
    });
    
    var Message = db.define('Message', {
      userid: Sequelize.INTEGER,
      text: Sequelize.STRING,
      roomname: Sequelize.STRING
    });
    
    User.sync()
      .then(function(){
        return User.create({ username : 'Jean Valjean' }); 
      //객체를 사용해 새로운 레코드 생성하는 과정. SQL에서는 INSERT INTO를 사용했었다
      })
      .then(function(){
        return User.findAll({ where : { username : 'Jean Valjean' } }); 
      })
      .then(function(users){
        users.forEach(function(user){
          console.log(user.username + ' exists');
        });
        db.close();
      })
      .catch(function(err){
        console.err(err);
        db.close();
      });

    関連付け:結合テーブルの実装


    sequelizeでは、1:1、1:N、N:Mの関係は、以下の4種類の組み合わせで表すことができる

  • The HasOne association
  • The BelongsTo association
  • The HasMany association
  • The BelongsToMany association
  • Transaction


    たとえば、「送金」のために、次の3つのプロセスが発生します.
    1.通帳の照会
    2.通帳振込
    3.他の通帳で送金する
    もし、送金したが、データベースに問題があり、他の通帳で送金できない場合は、「ロールバック」する必要があります.
    このクエリは、問題が発生した場合はロールバックされ、成功した場合はTransactionとしてコミットされます.

    reference

  • https://sequelize.org/master/manual/assocs.html
  • https://beomy.tistory.com/43