Backend Study

Node.js와 Sequelize: 효율적인 데이터베이스 ORM 활용

jimmmy_jin 2025. 2. 2. 18:33

1. Node.js와 Sequelize 

1.1 Node.js란?

Node.js는 JavaScript로 서버 측 애플리케이션을 개발할 수 있도록 해주는 비동기 이벤트 기반 런타임 환경이다.

비동기 I/O 처리 → 고성능 서버 구축 가능
싱글 스레드 이벤트 루프 → 많은 동시 요청을 처리 가능
다양한 패키지 지원 → npm을 통한 빠른 개발 가능

Express.js 같은 프레임워크와 함께 사용하면 웹 서버 개발이 용이하다.


1.2 Sequelize란?

Sequelize는 Node.js에서 사용하는 ORM(Object-Relational Mapping) 라이브러리로, SQL 데이터베이스를 쉽게 다룰 수 있도록 도와준다.

SQL 없이 JavaScript 코드로 데이터베이스 조작 가능
MySQL, PostgreSQL, SQLite, MariaDB 등 다양한 데이터베이스 지원
자동 마이그레이션 및 동적 데이터 모델링 지원
트랜잭션, 관계 설정 등 고급 기능 제공


2. Sequelize 설치 및 기본 설정

2.1 Sequelize 및 데이터베이스 드라이버 설치

npm install sequelize mysql2
  • sequelize: ORM 라이브러리
  • mysql2: MySQL 데이터베이스 드라이버 (PostgreSQL을 사용할 경우 pg를 설치)

2.2 Sequelize 인스턴스 생성

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

const sequelize = new Sequelize('database_name', 'username', 'password', {
    host: 'localhost',
    dialect: 'mysql' // 사용할 DBMS (mysql, postgres, sqlite, mariadb)
});

(async () => {
    try {
        await sequelize.authenticate();
        console.log('데이터베이스 연결 성공');
    } catch (error) {
        console.error('연결 실패:', error);
    }
})();

3. 모델(Model) 정의 및 사용

3.1 Sequelize 모델 생성

Sequelize에서는 모델을 정의하여 데이터베이스 테이블을 JavaScript 객체처럼 사용할 수 있다.

const { DataTypes } = require('sequelize');
const sequelize = require('./database');

const User = sequelize.define('User', {
    id: {
        type: DataTypes.INTEGER,
        autoIncrement: true,
        allowNull: false,
        primaryKey: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    },
    email: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true
    }
});

module.exports = User;

3.2 모델 동기화 및 데이터 삽입

(async () => {
    await sequelize.sync(); // 테이블이 존재하지 않으면 생성
    console.log('데이터베이스 동기화 완료');

    const newUser = await User.create({ name: 'Jin', email: 'jin@example.com' });
    console.log('새로운 사용자:', newUser.toJSON());
})();

4. CRUD (생성, 조회, 수정, 삭제) 예제

4.1 데이터 생성 (Create)

const user = await User.create({ name: 'Alice', email: 'alice@example.com' });
console.log('생성된 사용자:', user.toJSON());

4.2 데이터 조회 (Read)

const users = await User.findAll();
console.log('사용자 목록:', users.map(user => user.toJSON()));

4.3 데이터 수정 (Update)

await User.update({ name: 'Alice Updated' }, { where: { id: 1 } });
console.log('사용자 정보 업데이트 완료');

4.4 데이터 삭제 (Delete)

await User.destroy({ where: { id: 1 } });
console.log('사용자 삭제 완료');

5. Sequelize의 고급 기능

5.1 관계 설정 (Associations)

Sequelize는 1:1, 1:N, N:M 관계를 지원한다.

const Post = sequelize.define('Post', {
    title: DataTypes.STRING,
    content: DataTypes.TEXT
});

User.hasMany(Post); // 1:N 관계 (한 명의 사용자가 여러 게시물을 가질 수 있음)
Post.belongsTo(User); // 게시물은 한 명의 사용자에게 속함

sequelize.sync();

5.2 트랜잭션 처리

트랜잭션을 사용하면 여러 작업을 원자적으로 실행할 수 있다.

const transaction = await sequelize.transaction();
try {
    const user = await User.create({ name: 'Bob', email: 'bob@example.com' }, { transaction });
    await Post.create({ title: '첫 번째 글', content: '내용', UserId: user.id }, { transaction });
    await transaction.commit();
    console.log('트랜잭션 성공');
} catch (error) {
    await transaction.rollback();
    console.error('트랜잭션 실패:', error);
}

6. Sequelize 사용 시 고려할 점

장점

  • SQL을 직접 작성하지 않아도 되므로 개발 속도 향상
  • 다양한 데이터베이스 지원 (MySQL, PostgreSQL, SQLite 등)
  • 자동 마이그레이션 기능 제공
  • 관계형 데이터 모델링 지원

단점

  • 복잡한 SQL 쿼리는 직접 작성하는 것이 성능적으로 유리할 수 있음
  • 대규모 트래픽에서 원시 SQL보다 느릴 수 있음
  • 학습해야 할 개념이 많음

7. 결론

Sequelize는 Node.js 백엔드에서 데이터베이스 관리를 쉽고 효율적으로 할 수 있도록 도와주는 ORM 라이브러리이다.

  • SQL을 직접 작성할 필요 없이 데이터 조작 가능
  • PostgreSQL, MySQL, MariaDB, SQLite 등 다양한 DB 지원
  • 모델 정의, 관계 설정, 트랜잭션 처리 등 강력한 기능 제공

하지만 복잡한 SQL 연산이 필요한 경우는 직접 쿼리를 작성하는 것이 더 효율적일 수도 있다. Sequelize를 잘 활용하면 백엔드 데이터 관리를 더욱 쉽게 할 수 있으므로 프로젝트에 맞게 적절히 사용하자! 🚀