Sequelize에 대한 공부- 공식문서 읽기

공부중인 개발자·2021년 8월 23일
1

sequelize

목록 보기
1/6
post-thumbnail
초보개발자입니다. 틀린부분이 있다면 언제든지 말씀해주시면 감사합니다!

Sequelize is a promise-based Node.js ORM for Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server. It features solid transaction support, relations, eager and lazy loading, read replication and more.

시퀄라이즈는 Postgres, MySQL, MariaDB, SQLite and Microsoft SQL Server 를 지원하는 Node.js ORM이다.

ORM은 Object-Relational Mapping 관계형 데이터베이스에 있는 엔티티를 자바스크립트에 있는 객체나 클래스처럼 이용할 수 있게 만들어 주는 것

왜 사용하는지?

데이터베이스의 자료를 컴퓨터 프로그래밍 적인 언어의 관점에서 맞출 수 있도록 해주는 것이 ORM

이라고 지난 블로그에 작성을 했었다. 위에 나오는 DB의 자료를 JS에서 이용할 수 있도록 해주는 것이 ORM이란 뜻이다.

프로젝트가 끝나면 프로젝트 중 내가 사용했던 스택을 가지고 발표를 해야했고 나는 프로젝트를 진행해보면서 Sequelize 에 대해 좀 더 공부해보고 싶은 생각이 들었다.

가장먼저 공식문서를 살펴보면

설치법에 대한 내용이 먼저 나오는 것을 확인할 수 있다.

먼저 데이터베이스를 연결해줘야하는데 나는 mysql을 이용했기 때문에

const { Sequelize } = require("sequelize");

const sequelize = new Sequelize("sequelize_test", "root", "1234", {
  host: "localhost",
  dialect: "mysql",
});

데이터베이스를 sequelize_test 로 만들었다.

그리고 데이터베이스와 JS 가 연결될 수 있는 Test 에 대해서 말해준다.

try {
  sequelize.authenticate();
  console.log("Connection has been established successfully.");
} catch (error) {
  console.error("Unable to connect to the database:", error);
}

await의 경우 당장 async 를 넣을 곳이 없어서 빼고 테스트를 실행해봤다.

mysql만 설치를 했더니 mysql2 까지 설치를 하라고 하는 테스트의 결과를 확인해서 설치 후 재 실행 한 결과

잘 실행됐다는 console.log 가 도착했다.

그외에도 연결을 닫는법이나 용어 규칙, 새 데이터베이스와 구 데이터베이스 비교, 로그에 관한 옵션 마지막으로 Promise 와 async/await 를 시퀄라이즈에서 사용할 수 있는지의 여부에 대해서도 알려주면서 공식문서의 시작이 끝이났다.

다음으로 넘어가면 시퀄라이즈의 핵심인 Model에 대한 설명이 나온다.
Model은 데이터베이스의 테이블을 나타내는 추상화라고 번역이 되었고 시퀄라이즈는 Model을 확장하는 클래스라는 명시가 되어있었다.

그리고 Model을 정의하는 두가지 방법에 대해서 나와있는데 하나는 sequelize.define 이고 다른 하나는 init 이었다.
Calling sequelize.define(modelName, attributes, options)
Extending Model and calling init(attributes, options)
After a model is defined, it is available within sequelize.models by its model name.
두가지 방법은 본질적으로 동일하다고 공식문서에 적혀 있다.

sequelize-cli init 을 했을 때와 migration 을 했을 때 나와있는 모델이 Extending Model 이었기 때문에 이번에도 역시 똑같이 Extending Model 을 이용했고

const { Sequelize, DataTypes, Model } = require("sequelize");

const sequelize = new Sequelize("sequelize_test", "root", "1234", {
  host: "localhost",
  dialect: "mysql",
});

class User extends Model {}

User.init(
  {
    firstName: {
      type: DataTypes.STRING,
      allowNull: false,
    },
    lastName: {
      type: DataTypes.STRING,
    },
  },
  {
    sequelize,
    modelName: "User",
    freezeTableName: true,
  }
);

console.log(User === sequelize.models.User); 

실행 결과 console.log 는 true로 나왔다. 작성하면서 확장하는 class 에 대해서 찾아봤지만 이 말이 정확히 어떤 뜻인지에 대해선 알 수 없었다. 더 확인해봐야겠다.

다음으로 나온 것은 Table 이름에 대한 내용이다. Model 은 User라는 이름을 가지고 있지만 Table의 이름은 명시되지 않았고 테이블 이름을 지정하지 않으면 시퀄라이즈는 모델의 이름을 복수화하여(Users) 사용된다고한다. 또한 불규칙 복수도 라이브러리를 통해 적용이 가능하다고 한다.

이 복수형으로 변하는 테이블 명을 모델명과 같게 만들 수 있는데 위의 내가 작성한 코드에 있는 freezeTableName을 이용하여 Model 과 Table이 같은 이름이 되도록 할 수 있고 전역으로 진행할수도 있다.

const sequelize = new Sequelize("sequelize_test", "root", "1234", {
  define: {
    freezeTableName: true,
  },
  host: "localhost",
  dialect: "mysql",
});

위와같이 새로운 Sequelize 를 만들 때 define에 먼저 freezeTableName:true 를 넣어주면 전역으로 Table 이름이 Model과 같게 된다.

내일 작성할 내용은 Model의 동기화이다.

profile
열심히 공부하자

0개의 댓글