(Node.js) DataBase & Sequelize

Mirrer·2022년 9월 5일
0

Node.js

목록 보기
3/12
post-thumbnail

DataBase

구조화된 정보 또는 데이터의 조직화된 모음

DataBase데이터의 저장소 또는 통합해 관리되는 데이터의 집합체를 의미하며 중복 데이터 제거, 자료 구조화, 효율적 처리를 통해 관리된다.

DataBase에서는 행(row), 열(column)로 구성되어 있는 테이블이라는 단일 주제 관련 정보 모음이 존재하는데, 이들간의 관계를 정의하여 관리하는 미들웨어를 관계형 데이터베이스 관리시스템 (RDBMS: Database Management System)이라 부른다.

관계형 데이터베이스에서는 이러한 관계를 나타내기 위해 외래 키(foreign key)를 사용한다.


MySQL

MySQL은 데이터를 저장, 검색하는 데 사용하는 관계형 데이터베이스 관리 시스템

MySQL은 구조화된 쿼리 언어(SQL)를 기반으로 하는 무료 오픈 소스 관계형 데이터베이스 관리 시스템이다.

MySQL은 현재 가장 널리 사용되고 있는 관계형 데이터베이스 관리 시스템이며, 오픈소스로, 다중 사용자와 다중 스레드를 지원한다.

또한 Window, Linux...등 다양한 운영체제에서 사용 가능하여 Apache, PHP와 함께 웹개발에 주로 사용된다.


Sequelize

SequelizeJavaScriptSQL을 조작할 수 있게 해주는 라이브러리

SequelizeDB 작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리이다.

ORM이란 Object-Relational Mapping의 약자로, JavaScript 객체와 관계형 데이터베이스를 서로 연결해주는 도구이다.


기본 설정

  1. 아래 npm명령어들을 통해 Sequelize관련 패키지 설치, 세팅 파일 생성
npm i sequelize
npm i sequelize-cli
npm i mysql2
npx sequelize init

  1. 생성된 config.json파일에서 DB 연결 정보를 개발, 테스트, 배포용으로 저장

기본적으로 MySql은 host가 local host다. ("host": "127.0.0.1")
기본적으로 MySql은 port가 3306이다. ("port": "3306")

// config.json
{
  // 개발용 데이터베이스
  "development": {
    "username": "root",
    "password": "암호",
    "database": "데이터베이스명",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  // 테스트용 데이터베이스
  "test": {
    "username": "root",
    "password": null,
    "database": "데이터베이스명",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  // 배포용 데이터베이스
  "production": {
    "username": "root",
    "password": null,
    "database": "데이터베이스명",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}
  1. 생성된 models/index.js 파일을 아래와 같이 수정
const Sequelize = require('sequelize');
// 배포, 개발용으로 환경변수 기본값 설정
const env = process.env.NODE_ENV || 'development';
// 수정한 config.json파일의 development 데이터베이스 불러오기
const config = require('../config/config.json')[env];
const db = {};

// sequelize를 통해 Node.js, MySql연결
const sequelize = new Sequelize(config.database, config.username, config.password, config);

module.exports = db;

Sequelize Model

Sequelize에서 테이블을 모델이라 부르며 기본 설정시 생성된 models폴더에서 테이블데이터를 .js파일로 작성한다.

모델은 기본적으로 클래스방식으로 작성하며 작성된 .js파일의 정보를 토대로 SequelizeMySql에 테이블을 생성한다.

이 때 주의해야할점은 Sequelize에서 모델명은 대문자로 작성하는데, MySql에서는 이를 소문자, 복수형으로 저장한다. (User → users)

// user.js
const DataTypes = require('sequelize');
const { Model } = DataTypes;

module.exports = class User extends Model {
  static init(sequelize) {
    return super.init({
	  // id: {}, -> MySql에서 각각의 user 고유값인 id를 부여하므로 생략
      email: {},
      nickname: {},
      password: {},
    }, {
			// Model Setting
      modelName: 'User', // 시퀄라이즈 모델명
      tableName: 'users', // MySql 테이블명
      charset: 'utf8', // MySql 한글 저장
      collate: 'utf8_general_ci', // MySql 한글 저장
      sequelize,
    });
  }
  static associate(db) {}
};
// post.js
const DataTypes = require('sequelize');
const { Model } = DataTypes;

module.exports = class Post extends Model {
  static init(sequelize) {
    return super.init({      
      content: {},      
    }, {
      modelName: 'Post',
      tableName: 'posts',
      charset: 'utf8mb4', // MySql 이모티콘 포함 한글 저장(mb4)
      collate: 'utf8mb4_general_ci', // MySql 이모티콘 포함 한글 저장(mb4)
      sequelize,
    });
  }
  static associate(db) {}
};

이 후 컬럼에 대한 정보, 즉 데이터 타입에 관한 조건을 설정한다.

// user.js
const DataTypes = require('sequelize');
const { Model } = DataTypes;

module.exports = class User extends Model {
  static init(sequelize) {
    return super.init({
     email: {
      type: DataTypes.STRING(30), // 데이터 타입에 관한 조건을 설정 
      allowNull: false, // 필수입력 여부 (null 허용 설정)
      unique: true, // 고유값 여부
	    },
	    nickname: {
	      type: DataTypes.STRING(30),
	      allowNull: false,
	    },
	    password: {
	      type: DataTypes.STRING(100),
	      allowNull: false,
	    },
    }, {
      modelName: 'User',
      tableName: 'users',
      charset: 'utf8',
      collate: 'utf8_general_ci',
      sequelize,
    });
  }
  static associate(db) {}
};

조건을 설정할 때 사용되는 데이터 타입은 다음과 같으며 자세한 정보는 해당 사이트에서 확인할 수 있다.

데이터 타입용도
STRING 문자열
TEXT긴 문자열
BOOLEAN참(true), 거짓(false)
INTEGER정수
FLOAT실수
DATETIME시간

참고 자료

Node.js 공식문서
Node.js 교과서 - 조현영
React로 NodeBird SNS 만들기 - 제로초

profile
memories Of A front-end web developer

0개의 댓글