[포스코x코딩온] 웹개발자 풀스택 과정 6주차 회고록 - 시퀄라이즈

🤔 Sequelize 란?

시퀄라이즈

시퀄라이즈는 DB 작업을 쉽게 해주는 라이브러리다. ORM으로 분류되며, 자바스크립트 객체와 데이터베이스의 릴레이션을 매핑해주는 도구라고 할 수 있다.

나는 MySQL과 같이 쓸거지만 MariaDB,MSSQL등 다른 DB와도 같이 쓸 수 있다. 

시퀄라이즈를 쓰는 가장 큰 이유는 SQL언어를 직접 사용하지 않아도 자바스크립트 구문을 알아서 SQL로 바꿔주기 때문이다. 

 

😎 설치 및 사용법

시퀄라이즈에 필요한 패키지 들을 설치한다.

 

npm i express sequelize sequelize-cli mysql2

 

sequelize : 시퀄라이즈 패키지
sequelize-cli : 시퀄라이즈 명령어 실행
mysql2 : mysql과 시퀄라이 연결하는 드라이버

npx sequelize init

 

설치를 한 후 시퀄라이즈를 호출한다.

 

몇몇 새로운 폴더가 생김

 

호출하면 새로운 폴더가 생기는 것을 볼 수 있다.(이젠 model은 생성 안해줘도 될 거 같다ㅎㅎ)

 

🤨 config 폴더

 이 폴더에는 내가 사용할 DB의 정보를 입력해주면 된다. 

 

내 DB

나는 kdt9이라는 데이터베이스에 정보를 저장할 것이다. 그리고 이 DB를 다루는 관리자의 이름은 name이라고 명시되 있다. 이러한 정보를 config 폴터에 입력해주면 된다.

 

{
  "development": {
    "username": "name",
    "password": "1234",
    "database": "kdt9",
    "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"
  }
}

 

development 객체만 수정해 주면 된다.

 

 

🧰 models 폴더

지금까지 본 model구조와는 또 다른 모습이다. (하나 적응할려 하면 또 새로운 하나가 나온다..🥲)

models 폴더는 크게 두가지 파일로 나뉜다. 

 

첫번째는 mysql과 연결하는 파일

두번째는 테이블을 만드는 파일

 

1. DB 연결하기

 

// models/index.js

"use strict";

const Sequelize = require("sequelize"); // 시퀄라이즈 모듈 사용
const config = require(__dirname + "/../config/config.json")["development"];
const db = {};

// Squelize 객체를 생성해서 Mysql과 연결한다.
const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

// 모델 정의
db.User = require("./User")(sequelize);

db.sequelize = sequelize;

module.exports = db;

 

이 파일은 시퀄라이즈 모듈을 사용해서 아까 config폴더에서 만든 DB정보를 적용시켜주는 역할을 한다. 

 

const Sequelize = require("sequelize"); // 시퀄라이즈 모듈 사용
const config = require(__dirname + "/../config/config.json")["development"];
const db = {};

 

시퀄라이즈 모듈을 생성한다.

config 변수에는 config.json 파일에서 만든 development부분을 가져온다.

db는 뭐지? (나중에 모듈로 내보내서 컨트롤러에서 사용되는 건가? 잘 모르겠다)

 

// Squelize 객체를 생성해서 Mysql과 연결한다.
const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

 

이후 sequelize 객체를 생성해서 mysql과 연결한다. 

여기 까지는 DB를 연결해주는 과정이었다면 이젠 테이블을 만들것이다. 


2. 테이블 생성하기

 

// models/User.js
const { DataTypes } = require("sequelize");

const UserModel = (sequelize) => {
  const User = sequelize.define("user", {
    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 User;
};
module.exports = UserModel;

 

테이블을 만들때는 데이터 타입을 설정해주기 위해 시퀄라이즈 모듈에서 가져온다. 

그리고 id값은 거의 필수로 만든다고 하셨다. 데이터 정보에 대한 고유한 값이 필요하기 때문이다. 그래서 id컬럼을 설정해 줄때도 auto Increment를 true로 해서 고유값으로 만든다.

그리고 또 한가지 중요한게 기본키로 설정을 한 컬럼은 절때 중복되면 안되며, Null값이 올 수 없다.

 

const UserModel = (sequelize) => {
  const User = sequelize.define("user", {
    //  ...(attribute)
  });
  return User;
};

 

솔직히 테이블 정의하는 부분이 이해하기 어려웠다. 정확히 말하자면 첫번째 파라미터 값이 무엇을 뜻하는지 몰랐었다.

 

sequelize.define 함수에는 3가지 파라미터 값이 들어간다.

 

sequelize.define()

1. 테이블 이름 설정 

내가 위에 코드에서 user라고 테이블 이름을 정의해도 시퀄라이즈는 users라는 복수 형태 이름으로 테이블을 생성한다. 

그 이유는 테이블 옵션 정의를 하지 않았기 때문이다. 아래에서 또 설명하겠지만 테이블 이름 옵션(tableName:"user") 또는 복수화 중지(freezeTableName:true) 옵션을 설정하지 않았기 때문이다. 

 

2. 컬럼정의 

테이블에 들어가는 컬럼 값들을 정의한다. 주로 아래 5가지를 많이 쓴다고 하셨다.

  • type : 데이터 타입을 정의(문자, 숫자, 날짜 등등)
  • primaryKey : 기본 키 설정(default : false) 시퀄 라이즈에서는 기본적으로 primaryKey 컬럼을 생성한다.(id라는 이름으로 생성)
  • autoIncrement : 숫자 자동 증가(default : false)
  • allowNull : NOT NULL 허용 여부(default : true)
  • unique : Unigue 조건인지 아닌지에 대한 옵션

3. 테이블 옵션 정의

  • tableName : 테이블 이름 설정
  • freezeTableName : true로 설정하면 이름을 복수로 설정하지 않는다

내가 원하는 이름으롤 테이블을 만들고 싶으면 tableName 옵션을 통해 명확히 해주던가 freeze TableName 옵션을 통해 복수형으로 만들어주지 않으면 된다.

 

⚒️ Controller 폴더

테이블을 정의하고 생성하였다면 이젠 데이터를 생성하고, 조회하고, 삭제 할 시간이다. (CRUD)

시퀄라이즈 쿼리문은 비동기로 동작하며 프로미스 객체를 반환하므로, then을 붙여 결과값을 받을 수 있다.

 

시퀄라이즈 쿼리문

1. findAll() - 모든 데이터를 추출한다.

 

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

User.findAll({
    //attributes 원하는 컬럼 조회
    // attributes: ["name", "userid"],
    // Op.gt(초과), Op.gte(이상), Op.lt(미만), Op.ne(같지않은)
    // Op.or(또는), Op.in(배열 요소중 하나), Op.notin(배열요소와 모두 다름)
    // where: { id: { [Op.gte]: 2 } }, // id 가 2 이상인 아이디를 찾아라
    attribute:['name','age'},
    where:{
    	married:true,
    	age:{[Op.gt]:30},		// age>30
        },
    order: [["id", "DESC"]], // id기준으로 내림차순
    limit: 1,		// 첫번째 데이터만 추출
    offset: 1,		// 조회를 시작할 위치
  }).then((result) => {
    console.log("findAll", result);
  });

 

findAll()함수는 SQL문과 같이 조건(where)을 붙일 수 있다. 

where은 기본적으로 and 옵션과 같다.

 

SELECT name,age FROM users WHERE married=1 AND age > 30 ORDER BY id DESC LIMIT 1 OFFSET 1;

 

2. findOne() - 하나의 데이터만 추출한다.

 

User.findOne({
    where: { userid },
  }).then((data) => {
    console.log("result", data);
  });

 

기본적으로 하나의 데이터만 추출하기 때문에 limit 속성이 들어가 있다고 보면 될 것 같다.

 

SELECT userid FROM users limit 1;

 

3. create() - 데이터 넣기

SQL에서의 create는 테이블을 만드는 거지만 ORM에서의 create는 insert로 쓰인다는 점을 숙지하자.

 

User.create({
    userid: req.body.userid,
    name: req.body.name,
    pw: req.body.pw,
  }).then((result) => {
    console.log("result", result);
  });

 

INSERT INTO users ( userid, name, pw ) VALUES ( req.body.userid , req.body.name, req.body.pw);

 

주의할 점은 내가 테이블에서 정의한 자료형대로 넣어줘야 한다. 안그럼 오류가 발생할 수도..

 

4. update() - 데이터 수정하기

 

  User.update({ 
 	userid : req.body.userid,
    	pw : req.body.pw,
   	name : req.body.name,
  }, { 
  where: { 
  	id : req.body.id,
  }
  }).then((result) => {
    res.send({ result: true });
  });

 

첫번째 인자는 수정할 내용을 적고, 두번째 where 인자에는 어떤 데이터를 수정할 지 작성해준다.

 

UPDATE users SET userid = req.body.userid, pw = req.body.pw, name = req.body.name WHERE id = req.body.id;

 

5. delete() - 데이터 삭제하기

행 전체를 삭제한다는 뜻으로 destroy 함수를 사용한다.

 

User.destroy({ 
    where: { 
    	id : req.body.id 
    } 
}).then((result) => {
    res.send({ result: true });
});

 

DELETE FROM users WHERE id : req.body.id;

 

 

후 힘들다... 어렵다...