요즘 닥터 후 부작용으로 자꾸 영어 단어를 보면 느낌표를 붙여야할 것 같다.
BRILLIANT!! FANTASTIC!! SEQUELIZE !!
...
본론으로 들어가면 ,
sequelize는 node의 ORM이다.
ORM?
스프링 공부하며 JPA, ORM .. 자주 들어봤지만 사용은 해봤지만 제대로 정의해본 적은 없는것같다.
그래서 ORM이란?
Object Relational Mapping 의 약자로, 객체 지향 패러다임을 관계형 데이터베이스에 적용하는 기술이다.
객체지향 패러다임!!
패러다임 .. 이라고 하면 사실 난 처음에 와닿지 않았다.
일단 패러다임이라고 하면 한 시대의 사람들의 견해나 사고를 근본적으로 규정하고 있는 인식의 체계. 또는, 사물에 대한 이론적인 틀이나 체계. 순화어는
틀
이라고 한다.
즉, 체계, 틀 이라는 용어에서 알 수 있듯이 어느 한 규격, 쯤이라고 이해할 수 있고,
객체지향 패러다임이라고 하면 객체지향의 틀, 규격인 것 같다.
관계형 데이터베이스의 Table은 객체 지향 프로그래밍의 클래스와 유사한데 Table에서는 여러 개의 컬럼을 만들지만 class에서는 속성을 만들어 저장하는 것이 유사하다.
이런 점에서 instance와 row가 유사하게 되고, 이 유사성, 패러다임을 적절히 이용해 node, javascript에서 instance를 가지고 관계형 데이터베이스 작업을 할 수 있도록 만든 프레임 워크이자 방식이다.
이제 사용해보자
이런 sequelize를 쓰기 위해선 먼저 npm init을 진행해놓은 node 프로젝트에 sequelize, sequelize-cli, mysql2를 설치해야한다.
npm install sequelize sequelize-cli mysql2
npx sequelize init
그리고 npx sequelize init 명령어를 통해 sequelize 모듈을 사용하기 위한 초기 설정이 된다.
이 명령어를 실행하면 프로젝트에 총 4개의 새 디렉토리가 생성된다.
- config : 데이터베이스 접속 정보 저장
이 디렉토리 안의 config.json 파일에서 development, test, production 총 세버전에 나누어 접속 정보를 설정할 수 있다.
development 를 예시로 들면
"development" : {
"username" : "MYSQL과 같은 데이터베이스 관리 시스템 유저 아이디",
"password" : "MYSQL과 같은 데이터베이스 관리 시스템 유저 비밀번호",
"database" : "DB 이름",
"host" : "DB 접속할 IP",
"dialect" : "DB 종류"
}
과 같이 작성할 수 있다.
- models : 각 테이블과 매핑되는 클래스 설정
user 라는 테이블 작성 예시
const Sequelize = require('sequelize');
class User extends Sequelize.Model {
// 테이블에 대한 설정
static init(Sequelize) {
return super.init({
// 컬럼 설정
name : {
type : Sequelize.INT,
allowNull : false,
unique : false
} ,
...
}, {
// 테이블 설정
sequelize,
// createdAt, updatedAt
timestamps: true/false,
// true - update\_date과 같이 이름이 snake 방식, false면 updateDate
underscored: true/false,
// 모델 명
modelName: 'User',
// 테이블 명
tableName: 'user',
// true - deleteAt이 table에 추가, 이 옵션은 timestamps가 true여만 사용
paranoid: true/false,
charset: 'utf8',
collate: 'utf8\_general\_ci'
});
}
static associate(db) {
// db.{ } 에 들어오는 이름은 models/index.js 에서 db 배열에 묶어서 내보내기 때문에 indexs.js에서 붙인 이름
// User : Post 관계는 1:N이기때문에
db.User.hasMany(db.Post);
// Post associate 메서드에는 db.Post.belongsTo(db.User);
// 이 외에도
// A : B가 1:1 일 때
// db.A.hasOne(db.B);
// db.B.belongsTo(db.A);
// A : B가 N:M 일 때
// db.A.belongsToMany(db.B);
// db.B.belongsToMany(db.A);
}
}
moduel.exports = User;
// class 정의와 동시에 export 해도 된다.
// moduel.expores = class User extends Sequelize.Model { ... }
- migrations : 데이터베이스 스키마(구조나 테이블)가 변경되는 경우를 위한 설정
- seeders : 테스트 데이터 사용을 위한 설정
위 설정을 마쳐주고 첫번째로 실행시키면 Table이 생성된 것을 확인할 수 있다.
Spring의 JPA와는 다른 모양새로 node의 ORM, sequelize를 사용해보았다.
이번 DB와 관련된 배움으로 느끼는 것은 데이터베이스를 만들 때는 어떤 목적으로 사용하는지, 목적을 생각하며 어떻게 관계를 구성해야하는지,
생각 !!!
이 필요하다.
생각 ..
생각을 하자 ..