MVCモード


MVCモード

  • モデル、ビュー、およびコントローラの役割を理解できます.
  • MVC設計モードのように,コードを異なる部分に分けて記述する理由が理解できる.
  • Node
  • SQL.jsアプリケーションでクエリーできます.
  • クライアントのHTTP要求に従ってCRUD APIを実装することができる.(CRUD: Create, Read, Update, Delete)

  • ビジネスロジック

  • ユーザーがWebサイトにログインします.
  • コントローラは、ユーザが要求したウェブページにサービスを提供するためにモデルを呼び出す.
  • モデルは、データベースやファイルなどのデータソースを制御し、結果を返します.
  • コントローラは、モデルが返した結果をビューに反映します.
  • データを表示するVIEWがユーザに表示されます.
  • モデル#モデル#

  • DATA、情報を加工するコンポーネントを担当します.
  • モデル(Model)は、アプリケーションの情報とデータを表します.データベース、初期定義の定数、初期化値、変数.ビジネスロジックを処理した後、モデルの変更をコントローラとビューに渡します.

    表示

  • ユーザが見た部分、すなわちユーザインタフェース.
  • MVCアレイは、複数のビューを有し、モデルを照会することによってデータを受信することができる.ビューには、受信したデータを画面に表示する役割があります.受信したデータをモデルとして保存する必要はありません.ユーザーが画面に表示される内容を変更した場合は、モデルに渡して変更する必要があります.

    せいぎょそうち

  • モデルとビューのブリッジを接続します.
  • モデルやビューはお互いの存在を知らない.外部からの通知と変更の受信方法のみです.ユーザーは、発生した変更イベントを処理するためにアプリケーションを操作します.

    どうしてMVCモードを使うのですか?


    初歩的な設計を行ったシステムでも,メンテナンスが開始されると,各機能間の結合性が増加する.統合の度合いが高いシステムは、メンテナンス操作で他のビジネスロジックに影響を与えるため、わずかなコード変更で予期せぬエラーが発生する可能性があります.
    MVCモードを持つシステム内の各構成部品は、独自の役割を果たし、結果を他の構成部品に渡すだけで、システム結合度を低下させることができる.メンテナンス時にコンポーネントを変更するだけで済むため、システムの変更が容易になります.
    *結合度<>凝集度

    MVC制限


    MVCでは、ビューはコントローラに接続されて画面を構成するユニットであるため、複数のビューを持つことができる.モデルはコントローラを介してビューに接続されますが、コントローラを介して複数のモデルが1つのビューに接続されている場合もあります.
    ビューとモデルは互いに依存します.
    これは、画面上で複雑な画面とデータを構成する必要がある場合、コントローラが複数のモデルとビュー間の複雑な接続に遭遇する可能性があることを意味します.
    複雑なスクリーンは、大規模なMVCアプリケーションとして実装されます.
    コントローラはビューとライフサイクルに密接に接続されており、分離できず、コード分析/修正、テストが困難です.また,複雑なモデルやビューに複数のSide-Effectが導入され,プログラムの実行が困難になる.
    だから以上の質問を補足するのはいろいろ!!アレイが派生しました.
    MVP, MVVM, Viper, Clean Architecture, Flux, Redux, RxMVVM….

    Cmarket Database


    node.jsでmysqlを使用する

    const mysql = require('mysql');
    const dotenv = require('dotenv');
    const config = require('../config/config');
    dotenv.config();
    
    const con = mysql.createConnection(
      config[process.env.NODE_ENV || 'development']
    );
    
    con.connect((err) => {
      if (err) throw err;
    });
    
    module.exports = con;
     

    controller

    const models = require('../models');
    //요청에 대한 응답 + model
    module.exports = {
      orders: {
        post: (req, res) => {
          const userId = req.params.userId;
          // req바디에 있는 값
          const { orders, totalPrice } = req.body;
    
    
          // 잘못된 요청이 오는 경우 400
          if (!orders || !totalPrice) {
            return res.status(400).send('Bad Request');
    
            // 올바른 요청이 왔을 경우 models.orders.post 실행
          } else {
            models.orders.post(userId, orders, totalPrice, (err, result) => {
              if (err) {
                return res.status(500).send('Internal Server Error');
                // Status Code: 201 (성공적으로 생성했을 시)
                // 이 메시지만 응답으로 보내주면 됨
              } else {
                return res.status(201).send('Order has been placed.');
              }
            })
          }
        },
      },
    }

    model

    const db = require('../db');
    
    module.exports = {
      
      orders: {
        post: (userId, orders, totalPrice, callback) => {
          // TODO: 해당 유저의 주문 요청을 데이터베이스에 생성하는 함수를 작성하세요
          const queryString = `INSERT INTO orders (user_id, total_price) VALUES (?,?)`;
    
          const params = [userId, totalPrice];
          // 데이터 베이스에 쿼리를 보내서 저장해야 하기 때문에 콜백함수를 사용해서 "비동기"로 작성 한다 
          db.query(queryString, params, (err, result) => {
            // err나 result 조건에 따라 callback함수 호출
            if (err) { 
              return callback(err); // err인자로 받아서 callback함수 실행
            }
            // 여기서 방금 넣어준 레코드의 id를 가져오기 위해 
            // result를 콘솔에 찍어보자 ! 
            const orderId = result.insertId;
    
            // 유저가 주문하는 갯수가 지정되어 있지 않기 때문에 한번의 쿼리로 여러개의 레코드를 생성 할 때 ? 하나를 이용한다 
            const queryString = `INSERT INTO order_items (order_id, item_id, order_quantity) VALUES ?`;
            //const params = [[orderId, itemId, order_quantity], [], []] 
            const params = [orders.map((order) => {
              return [orderId, order.itemId, order.quantity];
            })];
    
            db.query(queryString, params, (err, result) => {
              if (err) {
                return callback(err)
              }
              return callback(null, result);
            })
          })
        }
      },
    };
    
    // (?,?)일 경우 params가
    // [userId, totalPrice] 
    
    // ?일 경우 멀티플쿼리니까 params가
    // [[orderId, itemId, order_quantity], [orderId, itemId, order_quantity], [orderId, itemId, order_quantity]] 
    
    // -------------
    
    // 멀티플쿼리에서 params배열에서 엘리먼트 하나하나가  [orderId, itemId, order_quantity]이고 
    
    // 엘리먼트에 여러값이 들어가는 경우에는 엘리먼트 하나 자체를  배열로 감싸주는거 같고
    
    // 엘리먼트에 값이 하나만 들어가는 경우 배열로 감쌀 필요없는 것 같습니다.
    
    // 그래서 결론은 물음표 하나당 배열에서 엘리먼트 "하나"다