2023. 1. 11. 21:58ㆍNodeJs
목차 |
1. Sequelize |
2. 사용방법 |
3. Promise와 Async |
4. Model(모델) 4.1. 모델의 정의 4.2. 모델의 동기화 |
1. Sequelize
Sequelize는 MySQL, MariaDB, SQLite, Amazon Redshift 등등 데이터 베이스 관리 시스템을 위한
Promise 기반 NodeJs.ORM 도구이다.
ORM은 이전 포스팅에 간단하게 설명해놓았다.
https://char1ey.tistory.com/71
Sequelize는 데이터베이스 관리 시스템을 좀 더 간편하게 사용하도록 만들어 놓은 NodeJs용 ORM 도구이며,
데이터들을 객체와 같이 다룰 수 있도록 도와준다.
2. 사용방법
2.1 설치하기
우선, Sequelize 사용을 위해서는 npm을 이용해 설치해야한다.
이 때, Sequelize뿐만 아니라 선택한 데이터베이스용 드라이버도 설치해야한다.
$ npm init -y
$ npm install sequelize
$ npm install [DBMS]
2.2 데이터베이스에 연결하기
이 단계에서는 데이터베이스와 코드를 연결시키는 과정임을 숙지하자.
Sequelize는 생성자(Class)이다. 즉, 실행하면 인스턴스화 할 수 있다.
데이터베이스에 연결을 위해서 Sequelize 인스턴스를 생성해야한다.
new 키워드를 사용하여 인스턴스 생성시, 연결 매개변수를 전달하거나, 단일 연결 URI를 전달하여 수행하도록 한다.
Syntax(문법)
const Sequelize = require("sequelize") // class이므로 대문자로 가져온다.
const sequelize = new Sequelize("연결매개변수")
const sequelize = new Sequelize("연결URI")
Sample(예시)
const Sequelize = require("sequelize")
const sequelize = new Sequelize('database', 'username', 'password', { host: 'localhost', dialect: 'mysql' })
생성자 안에들어가는 매개변수는 순서대로 데이터베이스, 아이디, 비밀번호를 넘겨주고 남은 값(포트, 호스트 등)은 객체 형태로 넘겨주면 인스턴스를 생성하여 연결할 수 있다.
여기에서 dialect는 어떤 데이터베이스 관리 시스템을 사용하는지 적어주면된다.
# 연결 확인하기(테스트)
try{
await sequelize.authenticate();
console.log("성공적으로 연결되었습니다.")
} catch {
console.log("데이터베이스에 연결할 수 없습니다.")
}
# 연결 종료하기
sequelize.close() // Promise를 반환한다.
Sequelize는 기본적으로 연결을 열어두고 모든 쿼리에 대해 동일한 연결을 사용한다.
위의 코드는 연결을 닫을 때 사용하도록 하며 연결을 닫았을 경우,
다시 데이터베이스에 접근(Access)하고 싶을 때, 새 인스턴스를 생성해야한다.
3. 프라미스와 Async
Sequelize에서 제공하는 대부분의 메서드는 Promise 객체를 반환한다.
따라서, Promise API : then(), catch(), finally() 등을 사용할 수 있다.
물론, async와 await도 사용이 가능하다.
4. Model(모델)
모델은 데이터베이스의 테이블을 나타내는 추상화이다.
모델에는 이름이 있으며, 이 이름은 사용자가 지정할 수 있다.
4.1 모델의 정의
모델을 정의하는 방법은 두 가지가 있다.
Syntax(문법)
1. sequelize.define( modelName(모델명), attributes(속성), options(옵션) )
2. class 모델명 extends Model { }
(위의 방법은 class의 상속을 하여야 가능하다)
Sample 1 (예시 1)
const Sequelize = require("sequelize")
// 인스턴스 생성하기
const sequelzie = new Sequelize("database", "username", "password", { })
// const [변수명] = sequelize.define(모델명, { 스키마 }, 옵션)
const User = sequelize.define('User',
{ // 스키마 설계
username: {
type: Sequelize.STRING(30),
allowNull: false
},
content: {
type: Sequelize.TEXT(),
allowNull: true,
}
},
{
// 옵션값
}
)
console.log(User === sequelize.models.User) // true
Sample 2 (예시 2, Model을 상속시켜 진행해야한다.)
const Sequelize = require("sequelize") // 생성자
// 인스턴스 생성하기
const sequelzie = new Sequelize("database", "username", "password", { })
// 생성자(class) 안에 정의된 Model을 상속받고,
// Model 안의 정적메서드를 사용한다.
// class 모델명 extends Sequelize.Model{ }
class User extends Sequelize.Model{ }
// 모델명.init(스키마 설계, 옵션)
User.init(
{ // 스키마 설계
username: {
type: Sequelize.STRING(30),
allowNull: false
},
content: {
type: Sequelize.TEXT(),
allowNull: true,
}
},
{ // 옵션값
sequelize: sequelize, // 연결을 위해서 지정해준다
modelName: 'User' // 모델명을 지정해준다. 지정하지 않으면 클래스명을 따라간다.
}
)
console.log(User === sequelize.models.User) // true
테이블 이름
Sequelize에서는 테이블 이름을 지정하지 않으면, 자동으로 모델의 이름을 복수화한다.
보통은 s를 붙이지만, person을 people로 변경하는 등 불규칙 복수형도 올바르게 바꿔준다.
테이블 이름을 모델이름과 같도록 해주는 옵션이 있다.
freezeTableName: true, 모델이름과 테이블 이름을 같도록 해준다
Sequlize를 인스턴스화 할 때, 전역적으로 정의할 수도 있다.
const sequelize = new Sequelize('~', {
define: {
freezeTableName: true
}
});
테이블 이름을 직접 지정할 수도 있다.(옵션)
tableName: "테이블 명"
4.2 모델의 동기화
모델을 정의할 때, 실제로 존재하는 데이터베이스와 비교하여 어떻게 동기화 할 지 정할 수도 있다.
동기화
model.sync(options)
model.sync( )
model.sync({ force: true })
model.sync({ alter: true })
- model.sync( ) : 존재하지 않는 경우 테이블을 생성하고 이미 존재하면 아무동작하지 않는다.
- model.sync({ force: true }) : 존재하는 경우 기존의 것을 삭제하고, 테이블을 생성한다.
- model.sync({ alter: true }) : 테이블의 현재 상태와 비교하여, 모델과 일치하도록 '테이블에서' 필요한 변경을 수행함.
삭제
await 테이블명.drop( )
await sequelize.drop( )
- await 테이블명.drop( ) : 해당 테이블을 삭제한다.
- await sequelize.drop( ) : 모든 테이블을 삭제한다.
( Sequelize 공식문서를 기반으로 작성하였습니다. )
'NodeJs' 카테고리의 다른 글
NodeJs. JWT(JSON Web Token) (0) | 2023.01.20 |
---|---|
NodeJs.ORM - Sequelize(2) (0) | 2023.01.13 |
NodeJs.ORM(Object Relational Mapping) (0) | 2023.01.11 |
NodeJs.XMLHttpRequest의 이해(코드) (0) | 2023.01.04 |
NodeJs.서버의 분리 실습코드 (0) | 2023.01.04 |