[포스코x코딩온] 웹개발자 풀스택 부트캠프8기

[포스코x코딩온] Sequelize 사용하기

항상 발전하는 개발자 2023. 8. 11. 00:35
728x90

Sequelize

 

Reference | Sequelize

V Deferrable: {"INITIALLY_DEFERRED": *, "INITIALLY_IMMEDIATE": *, "NOT": *, "SET_DEFERRED": *, "SET_IMMEDIATE": *}

sequelize.org

주요 기능 및 개념

  1. 모델 정의: Sequelize를 사용하면 JavaScript 클래스 형태로 데이터베이스 테이블을 모델링할 수 있다. 이 모델 클래스는 데이터베이스 테이블과 1:1 매핑되며, 모델 클래스의 인스턴스는 데이터베이스 레코드를 나타낸다.
  2. 마이그레이션: 데이터베이스 스키마를 변경하거나 업데이트하는 것을 도와주는 기능이다. 마이그레이션을 사용하면 데이터베이스 스키마 버전 관리를 보다 편리하게 할 수 있다.
  3. CRUD 작업: CRUD 작업을 간단하게 수행할 수 있다.
  4. 검색 및 쿼리: 강력한 쿼리 빌더를 제공하여 복잡한 쿼리 작성을 지원한다. 데이터베이스에서 데이터를 검색하고 필터링하는 작업을 쉽게 할 수 있다.
  5. 관계 정의: 데이터베이스 테이블 간의 관계를 모델링할 수 있다. 1:1, 1:N, N:M 등 다양한 관계를 정의하고 관계에 따라 데이터를 조회하거나 연결할 수 있다.
  6. 트랜잭션: 복수의 쿼리 작업을 하나의 트랜잭션으로 묶어서 원자성과 일관성을 보장할 수 있다.

Sequelize 설치

npm install sequelize sequelize-cli mysql2
  • sequelize : 시쿼라이즈 패키지
  • sequelize-cli : 시쿼라이즈 명령어 수행
  • mysql2 : mysql과 시쿼라이즈 연결하는 드라이버(도구)

package.json

npx sequelize init
  • sequelize init : 명령어 호출

※npm과 npx 비교

2023.08.09 - [개념 정리] - npm과 npx 비교

 

npm과 npx 비교

npm과 npx 비교 npm Node.js 패키지를 설치, 관리, 배포하는 데 사용되는 명령줄 도구. 패키지 설치: 'npm install ' 명령을 사용하여 패키지를 설치한다. 이때, 패키지는 'package.json' 파일에 기록되고 의존

dongho-kang.tistory.com


Sequelize 모델 정의

MySQL에서 정의한 테이블을 Sequelize에서도 정의가 필요하다.

즉, MySQL 테이블과 Sequelize의 모델이 대응한다.

Sequelize.define(param1, param2, param3);
  • param1 : 모델(테이블) 이름 설정
  • param2 : 컬럼 정의
  • param3 : 모델 옵션 정의
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,
    }
  );
  • param1(첫번째 인자) => 'visitor'로 모델 이름을 설정한다.
  • param2(두번째 인자) => {id ~ comment}로 컬럼을 정의한다.
    • type : 데이터 타입을 정의(문자, 숫자, 날짜 등등)
    • primaryKey : 기본키 설정(default: false)
    • autoIncrement : 숫자 자동 증가(default: false)
    • allowNull : NOT NULL 허용 여부(default: true)
    • comment : column에 대한 설명 작성
    • validate : 데이터 유효성 검사를 하는 속성
  • param3(세번째 인자) => {tableName ~ timestamps}로 모델 옵션을 정의한다.
    • charset : "utf8"
    • collate : "utf8_general_ci" (만약 여기서 설정을 안하면 DB를 생성할 때 설정해야 한다.)
    • tableName : 테이블 이름 설정
    • freezeTableName : true로 설정하면 이름을 복수로 설정하지 않는다.
    • timestamps : 기본적인 설정은 true

Sequelize 자료형(DataTypes) MySQL 자료형
Sequelize.STRING VARCHAR(255)
Sequelize.STRING(1234) VARCHAR(1234)
Sequelize.TEXT TEXT
Sequelize.TEXT('tiny') TINYTEXT
Sequelize.INTEGER INTEGER
Sequelize.DATE DATETIME for mysql

Sequelize 쿼리문

Sequelize에서 SQL문에 상응하는 메서드가 존재

프로미스를 반환해서 .then()을 붙여서 결과값 사용이 가능하다.

  • findAll() - select
  • findOne() - select
  • create() - insert
  • update() - update
  • destroy() - delete

자! 그러면 아래 글에서 만든 회원관리를 Sequelize를 사용하면서 코드를 익혀보겠습니다.

2023.08.09 - [[포스코x코딩온] 웹개발자 풀스택 부트캠프8기] - [포스코x코딩온] MySQL과 연동하고 MVC 패턴을 적용하여 회원가입, 로그인, 회원정보 수정 및 탈퇴 기능구현

 

[포스코x코딩온] MySQL과 연동하고 MVC 패턴을 적용하여 회원가입, 로그인, 회원정보 수정 및 탈퇴

MySQL과 연동하고 MVC 패턴을 적용하여 회원가입, 로그인, 회원정보 수정 및 탈퇴 기능구현 Node.js, Express 모듈, ejs, MySQL을 사용하기 위한 설정 git bash에 아래 명령어들을 입력해 준다. npm init -y npm ins

dongho-kang.tistory.com


Sequelize 설치하기.


config.json

  • MySQL 경로 설정하기

이번에는 development만 사용할 것이다.


models/index.js

  • model이 아닌 models을 사용할 것이니 여기에 있는 index.js에 기본 설정을 해준다.
"use strict";

//기본 설정
const Sequelize = require("sequelize");
const config = require(__dirname + "/../config/config.json")["development"];

const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);
//여기까지가 기본 설정.

models/login_sequelize.js

  • Sequelize 모델 정의하기
  • login_sequelize라는 테이블 만들기
const Login_sequelize = (sequelize, DataTypes) => {
  const login = sequelize.define("login_sequelize", {
    id: {
      type: DataTypes.INTEGER,
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
    },
    userid: {
      type: DataTypes.STRING(20),
      allowNull: false,
    },
    name: {
      type: DataTypes.STRING(10),
      allowNull: false,
    },
    pw: {
      type: DataTypes.STRING(20),
      allowNull: false,
    },
  });
  return login;
};

module.exports = Login_sequelize;

models/index.js

  • models/login_sequelize.js에서 설정한 모델을 가져오기
//모델 가져오기
db.Login_sequelize = require("./login_sequelize")(sequelize, Sequelize);

app.js

  • models/index.js 가져오기
const db = require("./models/index");

db.sequelize.sync({ force: false }).then(() => {
  //force: false => 테이블이 없으면 생성
  //force: true => 테이블 무조건 생성(만약 DB가 있다면 다 삭제하고 다시 생성)
  app.listen(PORT, () => {
    console.log(`http://localhost:${PORT}`);
  });
});

여기까지 Sequelize를 사용하기 위한 기본 설정이었습니다. 이제 Controller에서 직접적으로 사용을 하면 됩니다.


회원가입 기능

controller/Cuser.js

  • models/index을 가져온다.
exports.postSignUp = (req, res) => {
  console.log("회원가입 Brower 데이터 받아옴req1: ", req.body);
   User.postSignUp(req.body, (result) => {
     console.log("회원가입 정보3: ", req.body);
     res.send({ result: result, msg: "회원가입 완료" });
   });
};

이 코드에 Sequelize를 적용한다.

exports.postSignUp = (req, res) => {
  console.log("회원가입 Brower 데이터 받아옴req1: ", req.body);
  model.Login_sequelize.create({
    userid: req.body.userId,
    name: req.body.name,
    pw: req.body.pw,
  }).then((result) => {
    console.log(result);
    res.send({ result: result, msg: "회원가입 완료" });
  });
};

코드를 이렇게 작성하면 된다. create()안에는 객체 형태로 넣어주어야 한다.


이후 실행해 보면 MySQL에 login_sequelize 테이블이 생성되고 회원가입 시 데이터도 잘 들어가는 것을 확인할 수 있다.


https://github.com/DongHo-Kang/KDT-8-web/tree/855e06472c8ef0387cf3373c6ff03b7edce289e3/230810_mvc_practice_sequelize


※ Sequelize 사용 순서

1. sequelize 초기 설정
2. config/config.json에서 MySQL 연결
3. models/index.js에서 기본 설정
4. models/에 파일 만들어서 모델 설정
5. models/index.js에서 모델 설정한 것 가져오기
6. index.js에서 models/index.js 가져오기
7. db.sequelize.sync({ force: false }).then(() => { app.listen(PORT, () => { console.log(`http://localhost:${PORT}`); }); }); 설정
8. Controller에서 작업하기.(models 불러와서)

※ update() 사용 주의

  • 구조분해 할당을 사용하여 코드를 간결하게 할 수 있다.
  • update는 set과 where이 있기에 아래처럼 사용하면 된다.
const { userid, pw, name, id } = req.body;
  //구조분해 할당
  models.User2.update(
    /*set*/ { userid, pw, name },
    /*where*/ {
      where: {
        id,
      },
    }
  ).then((result) => {
    console.log("result", result);
    res.send({ result: true });
  });

※ findAll() 정리

//findall  정리. => 무조건 배열이다.
exports.findall = (req, res) => {
  models.User2.findAll({
    //attributes: 원하는 컬럼 조회
    attributes: ["name", "userid"],
    //Op.gt(초과), Op.gte(이상), Op.lt(미만), Op.ne(같지않은)
    //Op.or(또는), Op.in(배열 요소 중 하나), Op.notIn(배열요소와 모두다름)
    where: { id: { [Op.gte]: 4 } },
    //id값을 desc로 가져온다.
    order: [["id", "DESC"]],
    limit: 1,
    offset: 1,
  }).then((result) => {
    //console.log("result", result);
    res.send(result);
  });
};

Sequelize를 사용함으로써 SQL문을 직접적으로 작성하지 않아도 된다.

728x90