NodeJs.ORM - Sequelize(1)

2023. 1. 11. 21:58NodeJs

목차
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() 등을 사용할 수 있다.

 

물론, asyncawait도 사용이 가능하다.

 

 


 

4. Model(모델)

 

모델은 데이터베이스의 테이블을 나타내는 추상화이다.

 

<그림 1> 모델

 

모델에는 이름이 있으며, 이 이름은 사용자가 지정할 수 있다.

 

 

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