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")
})
여기서 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!