본문 바로가기

블록체인 기반 핀테크 및 응용 SW개발자 양성과정 일기

[38일차 복습 및 정리] sequelize, 시퀄라이즈 세팅하기, 사용법 / Router 이용해서 server 만들 때 파일 쪼개기, 나누는 방법

반응형

 

 

1. Visual Studio Terminal 세팅 

1-1 . 아래 명령어 실행하기 

npm init 

npm install express nunjucks sequelize sequelize-cli mysql2 

npx sequelize init 

 

모두 성공적으로 다운, 설치하면 config, migrations, models, node_modules, seeders, package-lock.json, padkage.jon 파일이 생긴다. -> 필요하지 않은 migrations, seeders 삭제 ! 

 

 

1-2.  models - index.js 에서 필요없는 부분 삭제하고 아래만 남겨둔다. 

'use strict';

const fs = require('fs');
// const path = require('path');
const Sequelize = require('sequelize');     // =======> 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;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}          

db.sequelize = sequelize;  // = >  객체가 담겨 있다. 
db.Sequelize = Sequelize;  // = >  CLASS가 담겨 있다. 

module.exports = db;

module.exports = db

의 뜻은 해당 models - index.js 파일이 어떤 파일에 의해 불려가면 불려간 값은 db 이다. 라고 이해하면 좋을 것 같다. 

현재 db에는 sequelize (객체 ) & Sequelize(CLASS) 가 담겨있다. 

 

 

1-3. config - config.json 의 development 부분 나의 정보에 맞게 username, password, database name 등 변경 

{
  "development": {            //  <------------------요 부분 본인의 정보에 맞게 변경 
    "username": "root",
    "password": "d",
    "database": "joinn",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

 

 

 

 

2. server.js 파일 만들기 및 코드 작성 + server 접속 test 

const express = require('express');
const app = express();
const {sequelize} = require('./models'); 
// 객체 sequelize가져옴 

sequelize.sync({force:true})
.then(()=>{
    console.log('접속 성공')
})
.catch(()=>{
    console.log('접속 실패')
})

app.get('/',(req,res)=>{
    res.send('I am server.js')
})

app.listen(3000,()=>{
    console.log('server start port : 3000')
})

 

 

 

 

 

3. table만들기, model - user.js 파일 생성 및 작성

 

3-1. models - index.js 추가  

const User = require('./user')

db.User=User;
User.init(sequelize);

 

User라는 변수에 models - user 파일 가져옴 

db객체에 User property추가 

-> db.User=User;를 하지 않으면 에러 메세지 : can't read 'create' of undefined 이 뜬다 

 

 

3-2. models - user.js 파일 생성 및 작성 (table 만들기) 

const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model{
    static init(sequelize){
        return super.init({
            userid:{
                type:Sequelize.STRING(20),
                allowNull:false,
                unique:true,
            },
            userpw:{
                type:Sequelize.STRING(20),
                allowNull:false,
            },
            username:{
                type:Sequelize.STRING(20),
                allowNull:false,
            },
            gender:{
                type:Sequelize.BOOLEAN,
                allowNull:false,
            },
            userimage:{
                type:Sequelize.STRING(100),
                allowNull:true,
            },
            userdt:{
                type:Sequelize.DATE,
                allowNull:false,
                defaultValue:Sequelize.NOW,
            }
        },{
            sequelize,
            timestamps:false,
            underscored:false,
            paranoid:false,
            modelName:"User",
            tableName:"users10",
            charset:"utf8",
            collate:"utf8_general_ci",
        })
    }
    static associate(db){}
}

3-3. server.js 추가 (User 가져오기 from models - index.js) 

const {User} = require('./models')

 

 

 

4. insert, select, update, delete 문 Sequelize 사용해서 만들기

 

 insert  

server.js 

app.get('/',(req,res)=>{
    User.create({
        userid:"아이디",
        userpw:"1234",
        username:"이름",
        gender:false,
        userimage:"no image",
        // userdt://default값 있어서 생량 
    })
    res.send('I am server.js')
})

User 객체의 property create을 사용하여 객체 형식으로 값을 넣어 준다. 

 

넣어지면 

sequelize.sync({force:false})

요 값을 false로 만들어줘야한다. true일 경우 계속 덮어쓰기가 되어서 계속 create(insert) 해도 데이터가 쌓이지 않고 replace만 된다. 

 

* userid 값을 unique (TEXT의 PK) 로 만들어주었기 때문에 같은 아이디로 insert 해도 값이 추가되지 않는다. 

 

 

 select  

async + await 사용, 

let 변수 = User.findAll({ attributes: [ 'userid' , 'userpw'] })

select 하기 전 먼저 아래 console.log 분석해보기

app.get('/', (req,res)=>{
    
    let userlist = User.findAll({})
    .then((result)=>{
        console.log(result);
    }).catch((error)=>{
        console.log(error);
    })

    res.send("I am server.js")
})

 

User.findAll({}) -> Promise 객체 값으로 돌려준다. 

 

 

async + await 비동기 방식을 써서 select 해오자

app.get('/', async (req,res)=>{
    
    let userlist = await User.findAll({
        attributes:['userid','username','gender']
    })
    res.send("I am server.js")
})

 

 

 

console.log 결과 값 

 

 

 

 

 

 

 

 update  

User.update({ id : "new", ps: "new-pw" } , { where : { userid : "sth" } })

 

app.get('/', (req,res)=>{
    User.update({
        username:'변경된이름',
        userpw:"4321",
    },{
        where:{userid:"아이디"}
    })
    res.send("I am server.js")
})

update된 결과 

여기서 User.update를 result 변수에 담고 async + await 을 써서 console.log 찍어보면 

updated 된 값이 있으면 [1] 없으면 false [0]으로 나온다. 

app.get('/', async (req,res)=>{
    let result = await User.update({
        username:'변경된이름',
        userpw:"4321",
    },{
        where:{userid:"아이디"}
    })
    res.send("I am server.js")
    console.log(result);   
})

-> async + await 를 빼고 해보면 Promise { <pending> } 으로 나온다. 비동기 때문에 saync, await을 씀 

 

 

 

 

 

 delete  

 User.destroy({ where { field-name : "sth" } }) 

app.get('/',  (req,res)=>{
    User.destroy({
        where: {userid:"아이디2"}
    })
    res.send("I am server.js")
})

 

 

 

 

 

 

 

 

--------------------------------------------Sequelize 세팅 & CRUD 사용법 끝 ------------------------------------------------

 

 

 

 

 

Router 이용해서 파일 나누기 

 

 

 

 

 

 

 

 <- 이렇게 파일 분배(?) 를 함 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

server.js

 

const express = require('express');
const app = express();
const {sequelize} = require('./models')  // get index.js from models 
const {User} = require('./models')
const router = require('./routers')

const nunjucks = require('nunjucks');
nunjucks.configure('views',{
    express:app,
})
app.set('view engine','html');

sequelize.sync({force:false})
.then(()=>{
    console.log("접속 완료")
})
.catch(()=>{
    console.log("접속 실패")
})

app.use('/', router)

app.listen(3000,()=>{
    console.log("server start port : 3000")
})

 

routers - index.js 

const express = require('express');
const router = express.Router(); 
const main = require('./main/index')
const user = require('./user')

router.use('/user', user)
router.use('/', main)

module.exports=router;

routers - main - index.js

 

const express = require('express');
const router = express.Router();
const mainController = require('./main.controller')

router.use('/', mainController.main)

module.exports = router;

routers - main - main.controller.js

let main = (req,res) =>{
    res.render('index.html')
}

module.exports.main=main;

-> 여기서 잘못 쓴 점 - const express = require('express'), const router = express.Router();  ,router.get('/') -> module.exports=routerl 이 방식으로  보내긴 했는데 교수님의 방식과 다름 

교수님은 let 변수 에 함수를 담아서 함수명을 main.controller의 속성으로 달아서 실행함 

 

 

 

user  -index.js

const express = require('express');
const router = express.Router();
const userController = require('./user.controller')

router.use('/join', userController.join)
router.use('/login', userController.login)
router.use('/info', userController.info)


module.exports = router; 

user - user.controller.js

const { User } = require("../../models")


let join = (req,res) =>{
    res.render('join.html')
}

let login = (req,res) =>{
    res.render('login.html')
}

let info = async (req,res) =>{
    let userlist = await User.findAll({});
    res.render('info.html', {
        userlist : userlist 
    })
}



module.exports = {
    join: join,
    login:login,
    info:info,
} 

views - info.html

 

info.html


{% for item in userlist %}

{{item.userid}}
{{item.userpw}}


{% endfor %}

 

나머지 index.html, join.html, login.html 은 모두 그냥 타이핑만 한 상태  ! 

 

 

이제 내일 배울 것은 요기서 조금 더 심화 + CLASS 에 대해 배울 예쩡 ! 

 

 

 

 

 

 

===========================================================================

 

 

질문 : 1. model - user.js 에 class, init, sequelize변수 등  잘 이해가 안감

2. models - index.js에서 User.init(sequelize) 도 이해가 안감. 

3. async await 없어도 값은 같은지? 쓰는이유 - 비동기? 

insert같은 경우는 없어도 되겠지만 select 경우 반드시 써야함. 

 

app.get('/', async (req,res)=>{
    let result = await User.update({
        username:'변경된이름',
        userpw:"4321",
    },{
        where:{userid:"아이디"}
    })
    res.send("I am server.js")
    console.log(result);   
})

 

여기서도 비동기가 어떻게 작동되는지 잘 모르겟다. 

 

 

4. info.html 파일 경로 궁금  -> ok! 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형