티스토리 뷰
시퀄라이즈(Sequlize)
DB 작업을 쉽게 할 수 있도록 자바스크립트 구문을 알아서 SQL 쿼리로 변환해 준다.
# 시퀄라이즈 설치
npm install sequelize sequelize-cli mysql2
npx sequelize init
시퀄라이즈를 설치하면 config, models 폴더가 새로 생성된다
시퀄라이즈 첫 번째 순서로 먼저 'config'에서 데이터베이스 연결 정보를 설정한다.
두 번째로 'models' 폴더에서 테이블에 대한 모델을 정의한다
Sequelize.define( )의 첫번째 인자 - 모델 이름 설정
Sequelize.define( ) 의 두 번째 인자 - 칼럼 정의
Sequelize.define( ) 의 세 번째 인자 - 모델 옵션 정의
# 테이블 정의 예시
const visitor = function (Sequelize, DataTypes) {
const model = Sequelize.define(
"visitor",
{
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
name: {
type: DataTypes.STRING(10),
allowNull: false,
},
comment: {
type: DataTypes.TEXT("medium"),
},
},
{
tableName: "visitor",
freezeTableName: true,
timestamps: false,
}
);
return model;
};
module.exports = visitor;
'config'에서 테이블 불러왔고
'models'에서 테이블 정의 했으므로
마지막으로 'controller'에서 필요한 데이터 가져오는 코드 작성!
이 코드에서는 'models'에서 정의한 모델을 사용하여 데이터베이스에 쿼리를 수행하고 데이터를 가져와서 뷰로 데이터를 전달한다
● 테이블의 모든 데이터 가져오기
# 시퀄라이즈 쓰기 전
exports.getVisitors = (req, res) => {
visitor.getVisitors((result) => {
console.log(result); //result가 모델에서 callback으로 넘겨준 rows(성공)값
res.render("visitor", { data: result }); //visitor.ejs에 data 이름으로 데이터 전달
});
};
# 시퀄라이즈
exports.getVisitors = (req, res) => {
models.visitor.findAll().then((result)=>{
console.log(result);
res.render('visitor',{data:result})
})
};
models.visitor.findAll( ) : visitor 테이블에서 모든 데이터 조회
*findAll( ) : 메서드는 해당 테이블의 모든 데이터를 반환, 조회된 결과는 result 변수에 할당
then((result)=>{ }) : findAll 메서드가 비동기적으로 동작하므로 조회가 완료된 이후에 실행될 콜백함수 정의
res.render('visitor',{ data:result }) : 조회된 데이터인 result를 visitor 뷰에 전달하여 뷰를 렌더링
렌더링시 data라는 변수명으로 데이터를 전달
● 테이블의 데이터 하나만 가져오기
# 시퀄라이즈 쓰기 전
exports.CgetVisitor1 = (req, res) => {
console.log(req.query); //req.query가 사용자가 입력한 쿼리스트링 데이터를 가져옴
visitor.getVisitors1(req.query.id, (value) => {
res.render("visitor", { data: value });
# 시퀄라이즈
exports.CgetVisitor1 = (req, res) => {
//sequlize
models.visitor.findOne({where:{id:req.query.id}}).then((result)=>{
res.render('visitor',{data:[result]})
})
};
models.visitor.findOne({where : { id : req.query.id }) : visitor 테이블에서 특정 id에 해당하는 데이터를 조회
*findOne( ) : 주어진 조건을 만족하는 첫 번째 레코드를 반환
where 속성을 사용하여 id가 req.query.id 값과 일치하는 데이터를 조회
res.render('visitor',{data:[result]}) : data라는 변수명으로 [result] 데이터 전달
[result]는 배열형태로 데이터를 전달하므로 visitor 뷰에서 반복문 등을 사용하여 데이터에 접근할 수 있음
● params로 테이블의 데이터 하나만 가져오기
# 시퀄라이즈 쓰기 전
exports.CgetVisitor2 = (req, res) => {
//model에서 만든 모듈 실행
console.log(req.params);
visitor.getVisitors1(req.params.id, (value) => {
res.send(value); //ejs에 value값만 보냄
});
};
# 시퀄라이즈
exports.CgetVisitor2 = (req, res) => {
models.visitor.findOne({ where: { id: req.params.id } }).then((result) => {
res.send([result]);
});
};
req.params는 라우트 경로에서 정의한 url 파라미터를 담고 있음
where 속성을 사용하여 id가 req.parmas.id 값과 일치하는 데이터를 조회
시퀄라이즈 사용순서를 정리하면
1. 'config'에서 데이터베이스 연결정보를 설정하고
2. 'models'에서 테이블의 모델을 정의한 후
3. 'controller'에서 모델을 사용하여 데이터를 가져오는 코드를 작성한다
*컨트롤러에서 데이터 가져오는 코드 async/await 로 바꿔보기!
# DB 전체데이터 가져오기
exports.getVisitors = (req, res) => {
models.visitor.findAll().then((result) => {
console.log(result);
res.render("visitor", { data: result });
});
};
# async/await
exports.getVisitors = async (req, res) => {
const data = await models.visitor.findAll({
order: [["id", "DESC"]],
});
res.render("visitor", { data });
};
await 키워드를 사용하여
findAll( ) 메서드의 작업이 완료될 때까지 기다린 후 작업이 완료되면 결과를 data 변수에 할당
# 데이터 생성하기
exports.postVisitor = async (req, res) => {
console.log(req.body);
models.visitor
.create({ name: req.body.name, comment: req.body.comment })
.then((result) => {
console.log(result),
res.send({
result: true,
//전체 Visitor 데이터에서 dataValues의 id값만 가져오는거
id: result.dataValues.id,
name: req.body.name,
comment: req.body.comment,
});
});
};
# async/await
exports.postComment = async (req, res) => {
console.log(req.body);
const data = await models.visitor.create({
name: req.body.name, //name input
comment: req.body.comment, //comment input
});
console.log("input에 입력한 데이터", data);
res.send({
result: true,
id: data.dataValues.id, //data중에 dataValues에서 id값
name: req.body.name,
comment: req.body.comment,
});
};
시퀄라이즈 쿼리문
findAll( ) - select
findOne( ) - select
create( ) - insert
update( ) - update
destroy( ) -delete
//SELECT * FROM user
models.User.findAll({})
//SELECT * FROM user LIMIT 1;
models.User.findOne({})
//SELECT * FROM userid FROM user;
models.User.findOne({
//원하는 컬럼 가져올때
attributes:['name','userid']
})
sequelize-auto 모듈
시퀄라이즈와 함께 사용되는 모델 자동 생성 도구이다
이미 구축된 데이터베이스 스키마를 바탕으로 모델을 자동으로 생성해줌!
이미 짜여진 테이블을 기반으로 → 자동으로 모델코드를 생성
npm install -g sequelize-auto
mvc와 시퀄라이즈 둘 다 어렵고 헷갈리지만 몇 번 반복하다 보니 아주 조금씩 이해가 되어가고 있다
자고 일어나면 다시 리셋 되긴하지만.. 어떡혀 무한반복해야지
'Coding' 카테고리의 다른 글
프론트엔드 개발자라면 꼭 알아야한다는 CSR, SSR (0) | 2023.07.14 |
---|---|
비밀번호 암호화 (0) | 2023.05.30 |
원티드 프리온보딩 커리어 킥오프 SPRING (0) | 2023.03.20 |
그동안 받았던 면접 질문 (0) | 2023.02.20 |
모던 웹 개발시 알아야 할 것들 (0) | 2023.01.18 |