웹 개발/DB | MYSQL

210504 MVC / Sequelize 시퀄라이즈 활용하기

헤일리_HJ 2021. 5. 4. 16:01

210504_class.zip
8.51MB

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부분도 동일하게 생각하면 된다.