구조화된 정보 또는 데이터의 조직화된 모음
DataBase
는 데이터의 저장소 또는 통합해 관리되는 데이터의 집합체를 의미하며 중복 데이터 제거, 자료 구조화, 효율적 처리를 통해 관리된다.
DataBase
에서는 행(row)
, 열(column)
로 구성되어 있는 테이블이라는 단일 주제 관련 정보 모음이 존재하는데, 이들간의 관계를 정의하여 관리하는 미들웨어를 관계형 데이터베이스 관리시스템 (RDBMS: Database Management System)
이라 부른다.
관계형 데이터베이스에서는 이러한 관계를 나타내기 위해 외래 키(foreign key)
를 사용한다.
MySQL
은 데이터를 저장, 검색하는 데 사용하는 관계형 데이터베이스 관리 시스템
MySQL
은 구조화된 쿼리 언어(SQL)
를 기반으로 하는 무료 오픈 소스 관계형 데이터베이스 관리 시스템이다.
MySQL
은 현재 가장 널리 사용되고 있는 관계형 데이터베이스 관리 시스템이며, 오픈소스로, 다중 사용자와 다중 스레드를 지원한다.
또한 Window
, Linux
...등 다양한 운영체제에서 사용 가능하여 Apache
, PHP
와 함께 웹개발에 주로 사용된다.
Sequelize
는JavaScript
로SQL
을 조작할 수 있게 해주는 라이브러리
Sequelize
는 DB 작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리
이다.
ORM
이란 Object-Relational Mapping
의 약자로, JavaScript
객체와 관계형 데이터베이스를 서로 연결해주는 도구이다.
Sequelize
관련 패키지 설치, 세팅 파일 생성npm i sequelize
npm i sequelize-cli
npm i mysql2
npx sequelize init
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"
}
}
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
에서 테이블을 모델이라 부르며 기본 설정시 생성된 models
폴더에서 테이블데이터를 .js
파일로 작성한다.
모델은 기본적으로 클래스방식으로 작성하며 작성된 .js
파일의 정보를 토대로 Sequelize
가 MySql
에 테이블을 생성한다.
이 때 주의해야할점은 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 만들기 - 제로초