티스토리 뷰

반응형
시퀄라이즈(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와 시퀄라이즈 둘 다 어렵고 헷갈리지만 몇 번 반복하다 보니 아주 조금씩 이해가 되어가고 있다

자고 일어나면 다시 리셋 되긴하지만.. 어떡혀 무한반복해야지

 

 

 

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함