dukDukz
210504 MVC / Sequelize 시퀄라이즈 활용하기 본문
MVC
Model | db 불러오는 영역 - models 폴더 안에 있는게 다 model 내가 사용할 데이터를 객체로 저장하는 공간을 Model |
View | UI 부분 -views 안에 있는게 다 view 실질적으로 눈에 보이는 부분이 view |
Controller | 모델에서 바로 뷰로 보여줄 수 없어서 중간에서 조작해주는것 : 기능들 -sql구문같은거 model과 view를 연결해주는 부분이 Controller 데이터를 조작해야지 결과물을 얻을 수 있는 부분 예) 페이징 - Controller 에서 조작한다고 보면 됨 |
1. app.js
초기 작업 app.js = server.js 에서 가장 초기 작업으로 생각하면 된다.
//서버를 실행할때 이거로쓰겠다
const express = require('express');
const app = express();
const {sequelize} = require('./models'); //index.js 는 생략가능
const {User} = require('./models');
const nunjucks = require('nunjucks');
const indexRouter = require('./routers');
app.set('view engine', 'html');
nunjucks.configure('views',{
express:app,
});
app.use('/',indexRouter);
app.listen(3000,()=>{
console.log('server 3000');
});
이렇게 설정해주자
2. config/confing.json
우리는 여기서 development 부분만 사용할 것이기 때문에
{
"development": {
"username": "root",
"password": "root",
"database": "board",
"host": "127.0.0.1",
"dialect": "mysql"
},
...
}
이 부분만 password와 database를 내가 사용하는 것으로 수정한다.
나머지 test는 테스트 용도, production은 배포 용도 이므로 지금 사용하지는 않는다.
M : models
3. models/user.js
const Sequelize = require('sequelize');
module.exports = class User extends Sequelize.Model {
static init(sequelize) { // 객체 생성없이 바로 실행 - constructor 같은 느낌
return super.init({ // super: 부모(Sequelize.Model)에 있는 init이라는 매서드를 가져오기 위해서 사용함 , 여기서 두가지 객체를 받는다 1.필드내용 2.테이블에 대한 설정값
//1. 필드내용
name: { // name VARCHAR(20) NO NULL UNIQUE
type: Sequelize.STRING(20), // 부모(Sequelize.)에서 나오는 걸로 써줘야함 - Varchar (20) 이 된다는 뜻
allowNull: false, // NOT NULL
unique: true, // UNIQUE
},
age: { // age INT UNSIGNED NOT NULL
type: Sequelize.INTEGER.UNSIGNED, // 숫자만 사용할건데 양수만 사용할거다.
allowNull: false, // NOT NULL
},
married: { //married TINYINT(1) NOT NULL - 0 OR 1 로 받겠다
type: Sequelize.BOOLEAN, // TINYINT : mysql은 boolean 값이 없음
allowNull: false,
},
comment: { // comment TEXT NOT NULL
type: Sequelize.TEXT,
allowNull: true,
},
created_at: { // created_at DATAEIME NOT NULL default NOW()
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
//2. 테이블에 대한 설정값 p.322
sequelize,
timestamps: false,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: false,
charset: 'utf8',
collate: 'utf8_general_ci',
});
}
static associate(db) {}
};
먼저 sequelize를 사용하겠다고 선언하고 그걸 Sequelize에 담는다.
그 다음 User 모델은 Sequelize.Model 을 확장한 클래스로 선언한다.(부모에게서 상속받음)
필드 내용과 테이블에 대한 설정값을 써준다.
4. models / index.js
'use strict';
const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize'); //패키지에서 받았던 내용 실행
const User = require('./user'); //전체적인 내용을 User에 담은 class
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};
let sequelize; // db정보담기
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
//접속 정보를 담은 객체 sequelize
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.User = User; //app.js에서 사용하기 위해 db객체에 user 프로퍼티를 만들어서 넣는다 (User라는 class를 넣는다.)
User.init(sequelize); //User를 객체 생성하지 않고 바로 init으로 호출
User.associate(db);
module.exports = db;
db를 불러오는 영역이라고 생각하면 된다.
V : views
html 부분 눈에 보이는 UI 부분
views 폴더안에 있는 모든 html이다.
C : Controller
model과 view를 연결하는 부분
중간에서 조작하는 부분 - sql구문 같은 것들
routers 폴더 안에 @.controller.js 부분을 보면 된다.
1) routers/index.js
main 과 board안에 있는 index.js를 가기 전에 거쳐가는 부분 (연결부분이라고 생각)
2) routers/main/index.js
맨처음에 https://localhost:3000 쳤을 때 나오는 부분을 받아주기 위해서 index.js와 main.controller.s를 연결해줌
const express = require('express');
const router = express.Router();
const controller = require('./main.controller');
router.get('/',controller.main);
module.exports = router;
3) routers/main/main.controller.js
① model을 안쓰는 경우(db 사용 필요 없는 경우)
const {User} = require('../../models');
let main = async (req,res)=>{
res.render('index.html');
}
exports.main = main;
② model을 쓰는 경우(db 사용하는 경우)
async 와 await을 왜 controller부분에서 써줄까?
- db불러올때 이걸 쓰는데 db를 불러오는 시간이 있기때문이다. db를 먼저 다 불러오고 그 다음에 sql 구문을 쓴다고 생각하면 된다.
const {User} = require('../../models');
let main = async (req,res)=>{
let user = await User.findAll({});
console.log(user);
res.render('index.html');
}
exports.main = main; //export.보낼이름 = 보낼함수
board부분도 동일하게 생각하면 된다.
'웹 개발 > DB | MYSQL' 카테고리의 다른 글
2021.06.03 DB - LEFT JOIN (4) | 2021.06.03 |
---|---|
210506 Sequelize 상세 설명 (0) | 2021.05.06 |
210503 테이블 여러개 JOIN ON (0) | 2021.05.03 |
21.04.28 DB Connection pool (0) | 2021.04.30 |
21.04.25 게시판 페이지 write, read, update, delete (2) | 2021.04.25 |