[부트캠프] 백엔드 - nodeJS의 DB 연동(Sequelize)

RedPanda·2022년 8월 29일
0

NodeJS

목록 보기
8/11

준비하기

우선 사용할 DB를 정해준다. 나같은 경우는 mySQL을 사용하였다.

이후에 sequeilze 모듈을 설치하고 초기 설정을 해준다.

npm i sequelize sequelize-cli // 모듈 설치
npm i mysql // mysql 모듈도 설치해야 함
npx sequeilze init // DB의 초기 설정을 해줌. config, models, migartion, seeders 폴더가 자동생성됨

npx를 하면 여러 폴더들이 생성될 것이다. 우리는 초기 설정을 위해 config와 models를 살펴볼 것이다.

{ // config 파일
  "development": {
    "username": "root",
    "password": "root", // 비밀번호를 꼭 바꿔주어야 한다.
    "database": "nodetest", // 다룰 DB의 이름을 적어준다.
    "host": "127.0.0.1",
    "dialect": "mysql" // 사용하는 DB를 적어준다.
  },
  "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"
  }
}

config에서는 development만 수정해주면 된다. 각각의 환경에서 사용할 db를 나누어 놓은 것 같은데, 우선 맨 위에만 수정해주자.

// models의 index파일
"use strict";

const Sequelize = require("sequelize");
const User = require("./user");
const Post = require("./post");

const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];
const db = {};

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(
    config.database,
    config.username,
    config.password,
    config
  );
}

db.sequelize = sequelize;

db.User = User;
db.Post = Post;

User.init(sequelize);
Post.init(sequelize); // 각 DB마다 설정해주자.

User.associate(db);
Post.associate(db); // 각 DB들의 관계가 설정되면 꼭 써주어야 한다.

module.exports = db;

models 디렉토리는 DB들의 초기 모델링이다. (SQL문의 CREATE와 유사)
그 중에서도 index.js는 그 DB들을 묶어주는 역할을 하는 것 같다.

const Sequelize = require("sequelize");

module.exports = class Post extends Sequelize.Model {
  static init(sequelize) {
    return super.init(
      {
        message: {
          type: Sequelize.STRING(100),
          allowNull: false,
        },
        uploadDate: {
          type: Sequelize.DATEONLY,
          allowNull: false,
        },
      },
      {
        sequelize,
        timestamps: true,
        modelName: "Post",
        tableName: "Posts",
        paranoid: false,
        charset: "utf8mb4",
        collate: "utf8mb4_general_ci",
      }
    );
  }

  static associate(db) {
    db.Post.belongsTo(db.User, { foreignKey: "userId", targetKey: "id" });
  } // 관계 설정. belongsTo는 외래키를 받는 입장, hasMany는 기본키를 주는 입장, hasOne은 1대1 관계를 뜻함.
  // 1대1관계는 비교적 부모 테이블일 것 같은 테이블에게 sourceKey를 부여해준다.
};

이후에 app.js(메인 스크립트)에 다음을 추가해준다.

const { sequelize } = require("./models");
// model들을 받아옴
sequelize
  .sync({ force: false })
  .then(() => {
    console.log("데이터베이스 연결 성공");
  })
  .catch((err) => {
    console.error(err);
  });
// DB가 연동되면 성공했다는 문구를 띄움

다음은 자주 사용하는 코드들이다. SQL문을 간단하게 사용할 수 있도록 하였다.(ORM)

// Insert문이며, Where절을 사용하여 조건을 부여한다.
await User.create({ 
        name: input.name,
        userId: input.id,
        password: hash,
        isRoot: false,
      });
// Delete문이며, Where절로 조건을 부여한다.
await Post.destroy({
      where: { id },
    });
// SELECT문이며, findOne과 findAll이 있다.
// include와 model은 테이블 join을 위해 사용한다.
const message = await Post.findAll({
      include: [
        {
          model: User,
        },
      ],
    });

각 코드들은 await async로 꼭 처리 해주어야 하며, try catch문으로 예외처리 해주자.

profile
끄적끄적 코딩일기

0개의 댓글