MVCモード
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]이고
// 엘리먼트에 여러값이 들어가는 경우에는 엘리먼트 하나 자체를 배열로 감싸주는거 같고
// 엘리먼트에 값이 하나만 들어가는 경우 배열로 감쌀 필요없는 것 같습니다.
// 그래서 결론은 물음표 하나당 배열에서 엘리먼트 "하나"다
Reference
この問題について(MVCモード), 我々は、より多くの情報をここで見つけました
https://velog.io/@jjabsu/MVC패턴
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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;
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.');
}
})
}
},
},
}
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]이고
// 엘리먼트에 여러값이 들어가는 경우에는 엘리먼트 하나 자체를 배열로 감싸주는거 같고
// 엘리먼트에 값이 하나만 들어가는 경우 배열로 감쌀 필요없는 것 같습니다.
// 그래서 결론은 물음표 하나당 배열에서 엘리먼트 "하나"다
Reference
この問題について(MVCモード), 我々は、より多くの情報をここで見つけました https://velog.io/@jjabsu/MVC패턴テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol