Sequelize를 활용한 database 설정

ESH'S VELOG·2023년 8월 2일
0

Sequelize

ORM 중 하나로 관계형 DBMS를 node.js환경에서 사용할 수 있게 해주는 도구

Sequelize로 MySQL database를 연결하는 방법

  1. migration과 model 디렉토리를 활용
    두 가지로 구성되어 있는 이 방법은
  • migration을 기반으로 하여 데이터 타입 등을 1차적으로 설정하고 확인한 후
  • model을 기반으로 하여 테이블 간 관계 설정을 해준 후 실제로 DB와 프로젝트를 연결시켜주는 역할을 한다.
  1. model 디렉토리와 model디렉토리 안에 index.js파일을 활용하여 sequelize와 MySQL 테이블을 동기화
  • model 디렉토리에서 각각의 테이블의 데이터 타입 등을 설정해주고
  • sequelize.sync() 를 사용하면 연결할 수 있다.
  1. 쿼리로 이미 작성해놓은 DB와 테이블을 연결하는 방법
    아래는 옵션 중 하나인데 나는 sql을 사용하고 RDS의 정보를 입력하는 방법을 쓰므로 옵션3번을 가져와봤다.

출처: https://sequelize.org/docs/v6/getting-started/#testing-the-connection

const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});
  • sequelize 객체에 연결할 RDS의 정보를 입력한 뒤
try {
  await sequelize.authenticate();
  console.log('Connection has been established successfully.');
} catch (error) {
  console.error('Unable to connect to the database:', error);
}
  • sequelize.authenticate()를 사용하여 연결

*** 번외 : mysql.createConnection으로 ORM없이 직접 연결할 수도 있다.

적절한 사용 방법 찾기

사실 1번과 2번 방법은 크게 차이나지는 않는다.
다만 ORM을 사용하여 DB를 설정하는 만큼 개발 초기나 DB관계가 아직 확실하게 정해지지 않았을 때 여러 번 테이블 및 DB를 만들었다 없앴다 할 때 쉽게 사용할 수 있다.

1번과 2번의 차이점을 굳이 찾으라면 다음과 같다.
1번 방법
장점: 1차적으로 DB 및 테이블 생성을 확인하고 연결할 수 있다.
단점: 폴더 구조가 복잡해 보일 수 있으며 중복되는 설정이 많다.
2번 방법
장점: 1번 방법에 비해 폴더 구조가 단순하며 중복되는 설정이 적다.
단점: 1번은 INDEX, VIEW, SCHEDULER와 같은 명령어를 관리할 수 있으나 2번은 어렵다.

1번, 2번, 번외를 사용해본 사람으로써 1번보다 2번 2번보다 번외가 사용하기 편리해보았다.

(1번 < 2번 < 번외 )

그렇다면 본질적으로 sequelize로 DB 및 테이블 생성을 하는 이유가 무엇일까?

이 질문에 대해 위에 적었던 각 장단점에 대해 현직 튜터님께 질문해보았다.

결론적으로 DB및 테이블은 쿼리로 작성하고, sequelize 명령어를 이용하여 기능을 구현하는 것이 적합하다.

우선 번외의 방법으로 코드를 작성하게 되면 models, migrations 등의 디렉터리들이 필요없지만 sequelize의 옵션들을 사용할 수 없다. 그렇게 되면 코드가 굉장히 길어지고 비효율적인 작업들을 코드에 넣게될 지도 모른다

예를 들어, 메뉴 테이블에서 메뉴 아이디로 단가를 조회하여 값을 받아오려면 다음과 같이 작성해야 한다.

sqlexe = async (sql, arr) => {
    const exeResult = await expressApp.dbConnection.query(sql, arr);
    return exeResult;
const itemPrice = 'SELECT price FROM item WHERE id=?';
    const itemPriceResult = await this.sqlExe(itemPrice, item_id);
    const totalPrice = Object.values(itemPriceResult[0][0]) * amount;

쿼리 실행 후 받아오는 값이
[[{key:value},{key:value}],[record]]
이런 방식이기 때문이다.

따라서 sequelize의 where, findOne, create등의 메서드는 우리가 사용하기 편한 방식으로 바꿔서 값을 반환하기 때문에 ORM의 이런 기능들은 현업에서 굉장히 많이 사용된다.

또 한편으로,
sequelize를 이용하여 데이터베이스와 테이블의 데이터 타입설정들과 관계를 각 방법이 요구하는 파일에서 작성을 한다면, 그 파일들을 설정할 때 사람의 단순한 실수(오타, 잘못된 설정, 변경 등)으로 인해 데이터가 한순간에 날아갈 수도 있기때문에 이 방법은 거의 쓰지 않는다고 한다.

그렇다면 방법은 DB와 테이블은 쿼리문으로 직접 작성하되, ORM의 명령어를 사용하기 위해 작성된 DB를 직접 연결하고(3번 방법) ORM의 명령어를 서버 기능 구현에서 활용하는 것이다.

개발할 때 DB를 기본으로 query문을 숙지하고, ERD의 관계를 잘 이해하고 ORM을 활용하는 방식으로 진행하면 좋을 것 같다. :)

profile
Backend Developer - Typescript, Javascript 를 공부합니다.

0개의 댓글