dukDukz

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

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

 

 

'웹 개발 > 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