article thumbnail image
Published 2021. 10. 31. 12:57

1. ORM으로 하는 DB 작업

mysql2 를 이용해서 DB에서 리소스를 가져오는 방법이 있다.

 

sql문을 잘 다루지 못하는 경우 ORM 패키지 사용해서

JS로 작성한 DB 관련 코드를 자동으로 SQL문으로 변환시켜서 클라이언트 객체를 통해 DBMS로 전송시키는 방법이 있다.


ORM (Object Relational Mapping) 이란?

데이터베이스에 있는 데이터를 하나의 객체에 매핑시키는 기술이다.

그니까 sql문을 작성하지 않고 JS 코드만으로 데이터를 가져오고 보낼 수 있다는 것이다.

 

 

$ npm install mysql2

DB를 다룰때에 ORM을 쓰든 안쓰든 이 패키지가 필요하다.

 

$ npm install sequelize sequelize-cli

 

$ npx sequelize init

init 명령어 실행하면 총 4개의 디렉토리와 각각의 기본 파일이 생성된다.

config, models, migrations, seeders

 

$ cat config.json 
$ sudo vim config.json

 

Sequelize 패키지를 사용할 때, config.json 파일에는 데이터베이스 접속에 관한 크게 3가지 종류의 객체들이 적혀있다. 그 중에서 개발이나 테스트가 아니라 실제 배포용 데이터베이스에 접속하기 위해 적용해야 하는 것은 production 객체이다.

 

{

  "development": {

    "username": "root",

    "password": null,

    "database": "database_development",

    "host": "127.0.0.1",

    "dialect": "mysql"

  },

 

password 수정

 

$ npx sequelize db:create --env development

env옵션 : config.json 파일의 객체중 하나 선택

 

id 컬럼은 sequelize 에서 자동으로 만들어준다.

 

$ sudo npx sequelize model:generate --name User --attributes user_id:string,user_pw:string,user_name:string

migrations, models 디렉토리가 생긴다.

index, user도 기본적으로 생긴다.

 

migrations : 데이터베이스 내에서 일어나는 모든 변경사항

 

migrations 안의 파일

테이블이름을 user라고 지으면 users 라고 바꾼다.

sequelize 이용하면 자동으로 위의 컬럼도 추가된다.

"use strict";
module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable("Users", {
      id: {
        allowNull: false, // null을 허용하지 않는다.
        autoIncrement: true, // 자동으로 1 큰값 넣어준다.
        primaryKey: true, // primary key 사용할 것인지
        type: Sequelize.INTEGER,
      },
      user_id: {
        type: Sequelize.STRING,
      },
      user_pw: {
        type: Sequelize.STRING,
      },
      user_name: {
        type: Sequelize.STRING,
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn("now"),
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn("now"),
      },
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("Users");
  },
};

 

      createdAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('now'),
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE,
        defaultValue: Sequelize.fn('now'),
      }

defaultValue 값 추가해준다.

컬럼의 값을 설정해주지 않았을 때의 기본값을 넣어준다.

date 뒤에 , 안써줘서 계속트릶


테이블 생성

$ npx sequelize db:migrate

migrations 내에 있는 모든 migration 파일 적용하라

이렇게 나오면 Users 테이블이 생성된다.


테이블 초기화

$ npx sequelize db:migrate:undo

가장 최근에 적용된 migration 파일 해제

 


시드 데이터 넣기

$ npx sequelize seed:generate --name initialUsers

 

intialUsers 파일

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert('Users', [
      {
        id:1,
        user_id:'abcd',
        user_pw:'1234',
        user_name:'SeonWooChan',
      },
      {
        id:2,
        user_id:'bcde',
        user_pw:'1234',
        user_name:'WiJiHoon',
      },
      {
        id:3,
        user_id:'cdef',
        user_pw:'1234',
        user_name:'KimChangHee',
      },
    ]);
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete('Users', null, {});
  },
};

 


시드 파일 적용하기

$npx sequelize db:seed:all

 

 


모델과 테이블 연동하기

migration 파일 수정해주기

$ sudo vim user.js

이렇게 하면 Model 에서 id 컬럼도 인식할 수 있게 된다.

 

models 파일 안에 index.js 파일 수정하기

const Sequelize = require("sequelize");
const config = require("../config/config.json");

const { username, password, database, host, dialect } = config.development;
const sequelize = new Sequelize(database, username, password, {
  host,
  dialect,
});

const User = require("/user")(sequelize, Sequelize.DataTypes);

const db ={};
db.User = User;

module.exports = db;

 

App.js 파일 수정하기

db 연동하게

import "./App.css";
import MainPage from "./assets/components/mainPage/MainPage";
import UserLogin from "./assets/components/Login/UserLogin";

const db = require('../models/index');
const { User } = db;

function App() {
  return (
    <div className="App">
      <UserLogin />
      {/* <MainPage/> */}
    </div>
  );
}

export default App;

'🚦 Server > Node.js' 카테고리의 다른 글

express 시작하기  (0) 2021.10.28
서드파티 모듈, npm 이해하기  (1) 2021.10.26
Node js 정리  (0) 2021.10.19
Node - 화살표 함수  (0) 2021.08.10
Node - const, let 는 var를 대체한다.  (0) 2021.08.10
복사했습니다!