[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

🛠 기타/WEB

Node.js - Sequelize

inu 2021. 1. 28. 17:05
반응형

Sequelize?

  • node.js의 ORM으로, mysql이나 postgresql과 같은 DB를 제어할 수 있도록 해준다.
  • cf. ORM(Object relational Mapping) : 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다. 즉, 프로그래밍 언어의 구문을 자동으로 SQL 구문으로 변경해준다.
$ npm install sequelize
  • 또한 sequelize는 mysql 등의 DB모듈도 필요로 한다. 그 중 하나인 mysql을 설치하자.
$ npm install mysql2

dotenv 설정

  • Sequelize를 사용하기 위해서는 앞서 말했듯이 DB와 연동이 되어있어야 한다.
  • mysql과 같은 DB에 접속하기 위해서는 해당 DB의 ID와 password가 필요하다. 이를 한두번 입력해주는 것은 어렵지 않겠지만 매번 처리하기란 귀찮은 일이다. 다른 사람과 프로젝트를 공유하는 상황에서는 더더욱 그렇다.
  • dotenv를 활용하면 환경변수 설정이 가능해져 이러한 작업이 용이해진다. 따라서 Sequelize 사용에 앞서 dotenv를 설정해보겠다.
$ npm install dotenv
  • 패키지를 설치한다.

  • 새 파일 만들기로 .env.sample을 만들어서 .env파일을 어떻게 구성하면 되는지 작성한다. 아래는 그에 대한 예시이다.

  • .env.sample에는 해당 정보에 대한 설명이 들어간다고 생각하면 편하다.

DATABASE = "데이터베이스명"
DB_USER = "아이디"
DB_PASSWORD = "패스워드"
DB_HOST = "DB호스트"
  • .env.sample을 참고하여 실질적인 .env파일을 작성할 수 있는 것이다.
  • git에 프로젝트를 올리는 경우, .env파일은 id, password같은 보안정보가 포함되어 있기 때문에 .env.sample만 git에 올리고 .env는 git ignore로 설정해야 한다.
  • 추후 프로젝트에서 .env의 정보는 process.env.DB_USER와 같은 방식으로 접근할 수 있다.

DB 접속

  • mysql에 'exercise'라는 DB가 생성되어 있다는 가정하에 설명을 시작한다.
  • 일반적으로 프로젝트 root 디렉토리에 models 폴더 생성 후 index.js 파일을 만들어 이에 관련내용을 작성한다.

📃 index.js

var Sequelize = require('sequelize');
var path = require('path');
var fs = require('fs');
var dotenv = require('dotenv');

dotenv.config(); //LOAD CONFIG

const sequelize = new Sequelize( process.env.DATABASE,
process.env.DB_USER, process.env.DB_PASSWORD,{
    host: process.env.DB_HOST,
    dialect: 'mysql',
    timezone: '+09:00', // 한국 시간 셋팅
    operatorsAliases: Sequelize.Op,
    pool: {
        max: 5,
        min: 0,
        idle: 10000
    }
});
  • 새로운 Sequelize 객체를 process.env.DATABASE, process.env.DB_USER, process.env.DB_PASSWORD를 기반으로 생성
let db = [];

fs.readdirSync(__dirname)
    .filter(file => {
        return file.indexOf('.js')&& file !== 'index.js'
    })
    .forEach(file => {
        var model = sequelize.import(path.join(__dirname,
            file));
            db[model.name] = model;
    });
  • 현재경로에서 index.js 파일을 제외한 파일들을 참조해 테이블들을 생성
Object.keys(db).forEach(modelName => {
    if("associate" in db[modelName]){
        db[modelName].associate(db);
    }
});
  • foreign key 관련 정보를 읽고 이와 관련된 테이블도 자동생성
db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;
  • 최종 모듈 exports
  • 이제 app.js에서 해당 모듈을 불러와 활용하면 된다.

📃 app.js

const db = require('./models');
db.sequelize.authenticate()
  .then(() => {
      console.log('Connection has been established successfully.');
  })
  .then(() => {
      console.log('DB Sync complete.');
      return db.sequelize.sync();
  })
  .catch(err => {
      console.error('Unable to connect to the database:', err);
  });    
  • 위 코드를 app.js에 추가하고 실행했을 때 'Connection has been established successfully.'와 'DB Sync complete.' 메세지가 콘솔에 출력된다면 성공적으로 DB가 연결된 것이다.

모델 작성

  • models 폴더에 새로운 js파일을 만들어 모델을 작성한다.

📃 ex. Products.js

module.exports = (sequelize, DataTypes) => {
    const Products = sequelize.define('Products',
        {
            id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
            name : { type: DataTypes.STRING },
            price : { type: DataTypes.INTEGER },
            description : { type: DataTypes.TEXT }
        }
    );
    return Products;
}
  • db.sequelize.sync()를 통해 자동으로 초기화가 진행되면서 해당 테이블이 지정된 DB에 생성된다.

DB CRUD

CREATE

Model.create({key: 'value'})
  • 위의 형식으로 입력할 데이터를 전달

READ

Model.findAll()
Model.findOne()
Model.findAll({ where: { type: 'choice' } })
  • Model.findAll() : 조건에 맞는 모든 데이터를 불러옴
  • Model.findOne() : 조건에 맞는 하나의 데이터만 불러옴
  • Model.findAll({ where: { type: 'choice' } })와 같이 검색할 조건 전달가능

UPDATE

Model.update({ answer: 1 }, { where: { _id: 1 } })
  • 첫 번째 인자로 수정할 데이터를, 두 번째 인자로 조건을 전달. (위 코드는 id가 1인 행의 answer를 1로 변경함)

DESTROY

Model.destroy({ where: { type: 'choice' } })
  • 조건에 맞는 모든 데이터 삭제. 위의 경우 type이 choice인 모든 데이터를 삭제함.
반응형

'🛠 기타 > WEB' 카테고리의 다른 글

Node.js - cookie  (0) 2021.02.02
Node.js - multer (파일 업로드)  (0) 2021.01.31
Nest.js - nest.js 환경에서 GraphQL 사용하기  (0) 2021.01.13
React - GraphQL Client (with Apollo)  (0) 2021.01.12
React - Styled Components  (0) 2021.01.12