ORM( Object-relational mapping ) 이란?
객체와 관계와의 설정하여 데이터를 자동으로 매핑 해주는 것을 의미
ORM에서 말하는 객체 의 의미는 OOP의 객체가 아니라 관계형 데이터베이스를 의미합니다.
이제 express.js 로 서버를 돌리며 orm sequelize를 연동해 보겠습니다.
Install
폴더 하나를 만들고 npm init을 친다음 기본 셋팅을 해줍니다.
그리고 sequelize 를 사용하기 위해 관련 패키지들을 설치해줍니다.
npm install express sequelize sequelize-cli mysql2 body-parser cors --save
{
"name" : "a01-orm-sequelize" ,
"version" : "1.0.0" ,
"description" : "" ,
"main" : "index.js" ,
"scripts" : {
"test" : "echo \"Error: no test specified\" && exit 1"
},
"author" : "" ,
"license" : "ISC" ,
"dependencies" : {
"cors" : "^2.8.5" ,
"express" : "^4.17.3" ,
"mysql2" : "^2.3.3" ,
"sequelize" : "^6.19.0" ,
"sequelize-cli" : "^6.4.1"
}
}
설치가 제대로 된다면 다음과 같이 dependncies에 cors, express, mysql2, sequelize, sequelize-cli 가 존재합니다.
npm install -g nodemon
아 만약에 nodemon 이 없으시다면 다음과 같이 nodemon을 설치해줍니다.
{
"scripts" : {
"test" : "echo \"Error: no test specified\" && exit 1"
"start" : "npx nodemon app.js"
},
}
간단하게 scripts start 도 넣어줍시당 ( 구분이 되지 않을것 같아서 scripts 부분만 빼고 다 지워두었습니다. )
mkdir database;
root 폴더(/a01-orm-sequelize) 에서 database 폴더를 생성해줍니다.
cd database;
그리고 database 폴더로 이동해줍니다.
window 사용하시는 분은 그냥 폴더에서 작업하면 됩니다.
Init Sequelize
npx sequelize init
이제 sequelize 기본 설정을 해보겠습니다.
위 init 명령어를 치게 되면 다음과 같이 설정이 됩니다.
sequelize 을 이용하여 테이블을 모델링 하는 방법이 있고 이미 생성된 테이블을 불러와서 사용하는 방법이 있는데
이번 정리하는 글에서는 직접 모델링을 해보겠습니다.
{
"development" : {
"username" : "root" ,
"password" : "1234" ,
"database" : "sequelize_development" ,
"host" : "127.0.0.1" ,
"dialect" : "mysql"
},
{
"test" : {
"username" : "root" ,
"password" : "1234" ,
"database" : "sequelize_test" ,
"host" : "127.0.0.1" ,
"dialect" : "mysql"
},
{
"production" : {
"username" : "root" ,
"password" : "1234" ,
"database" : "sequelize_production" ,
"host" : "127.0.0.1" ,
"dialect" : "mysql"
},
/database/config/config.json 에 가서 mysql 연결 셋팅을 해보겠습니다.
mysql id, pw, db, host 를 적어줍니다.
const express = require ("express" );
const { sequelize } = require ("./database/models/index" );
const app = express();
const port = 3000 ;
app.use(express.json());
app.use(express.urlencoded({ extended : true }));
const router = require ("./router/index" );
sequelize.sync().then(() => console .log("connected database" ));
app.listen(port, () => {
console .log(`server is on ${port} ` );
});
app.get("/" , (req, res ) => {
res.send("hi friend" );
});
app.use(router);
이제 app.js를 건드려보겠습니다.
주의깊게 봐야할 코드가 몇가지가 있는데영
const { sequelize } = require ("./database/models/index" );
다음과 같이 sequelize를 require /database/models/index 하여 불러온뒤
sequelize.sync().then(() => console .log("connected database" ));
이렇게 Sequelize 를 초기화 하면서 DB에 필요한 테이블을 생성하는 함수 입니다.
CREATE TABLE IF NOT EXISTS `user` 이런 문구를 띄우며 만약 user이란 테이블이 없다면 테이블을 만들어 준다는 것입니다.
Create User Table
이제 간단하게 user 이라는 테이블을 만들어서 테스트를 해볼것인데요.
/database/models/user.js 라는 파일을 만들어 줍니다.
module .exports = (sequelize, DataTypes ) => {
const user = sequelize.define(
"User" ,
{
pk_id : {
type : DataTypes.INTEGER,
primaryKey : true ,
autoIncrement : true ,
comment : "유저 고유 ID" ,
},
id : {
type : DataTypes.STRING,
allowNull : false ,
comment : "유저 ID" ,
},
password : {
type : DataTypes.STRING,
allowNull : false ,
comment : "유저 패스워드" ,
},
email : {
type : DataTypes.STRING,
allowNull : true ,
comment : "유저 이메일" ,
},
createdAt : {
type : DataTypes.DATE,
allowNull : false ,
defaultValue : DataTypes.fn("NOW" ),
},
updatedAt : {
type : DataTypes.DATE,
allowNull : false ,
defaultValue : DataTypes.fn("NOW" ),
},
},
{
tableName : "user" ,
underscored : true ,
freezeTableName : true ,
timestamps : true ,
}
);
return user;
};
이렇게 저장하면 nodemon 이기때문에 자동으로 restart가 됩니다.
이런식으로 나올건데 제대로 나온것 맞습니당 CREATE TABLE IF NOT EXISTS 'user 이라는게 보이는데 이것은 만약 user 테이블이 없다면 새로 생성한다는 의미 입니다.
필드 옵션
필드 옵션
설명
type
Data type을 의미
primary key
기본키 ( default : false )
autoIncrement
SERIAL ( auto increment 여부 ) ( default : false )
allowNull
NOT NULL 조건 ( default : true )
unique
unique 조건 ( default : true )
comment
Comment
데이터 타입
데이터 타입
설명
STRING
A variable length string 변하는 길이의 문자열
CHAR
A fixed length string 고정된 길이의 문자열
TEXT
Unlimited length TEXT column 제한되지 않은 길이의 텍스트
INTEGER
A 32 bit integer 32비트 정수
BIGINT
A 64 bit integer 64비트 정수
FLOAT, DOUBLE
실수형
BOOLEAN
A boolean / tinyint column, depending on dialect
DATE
Date column with timezone, default is UTC
ARRAY
An array of type. Only available in Postgres. 유형의 배열입니다. Postgres에서만 사용할 수 있습니다.
Config
Config
설명
timestamps
Sequlize는 테이블을 생성한 후 자동적으로 createAt, updateAt 생성
paranoid
paranoid 옵션이 true 이라면 deletedAt column이 테이블에 추가 해당 row를 삯제시 실제로 데이터가 삭제되지 않고 deletedAt에 삭제된 날짜가 추가되며, deletedAt에 날짜가 표기된 row는 find 작업시 제외됩니다.
underscored
underscored 옵션이 true이면 column 이름을 camalCase가 아닌 underscore 방식으로 사용
freezeTableName
Sequelize는 define method의 첫 번째 파라미터 값으로 tablename을 자동 변환하는데, 이 옵션의 값이 true 이라면 변환 작업을 하지 않도록 합니다.
tableName
실제 Table 이름 정의
comment
주석
여기까지 기본 셋팅에 대해서 알아보았구영 다음 포스팅에선 router, controllers을 통해 postman을 이용하여 테스트 해보겠습니다.
예시로 github repository 에 올려두었습니다.
예제 링크
GitHub - GangOn0215/node-orm-sequelize-example: 블로그에 강좌용 으로 포스팅 하기 위한 git repository
블로그에 강좌용 으로 포스팅 하기 위한 git repository. Contribute to GangOn0215/node-orm-sequelize-example development by creating an account on GitHub.
github.com