Node.js Sequelize

Sequelize 소개 (Introduction to Sequelize)

Sequelize는 Node.js에서 SQL 기반 데이터베이스(MySQL, PostgreSQL, SQLite 등)와 상호작용하기 위한 ORM(Object-Relational Mapping) 라이브러리입니다. Sequelize를 사용하면 데이터베이스 쿼리를 JavaScript 객체를 통해 쉽게 작성하고 관리할 수 있습니다.

Sequelize의 특징과 장점 (Features and Benefits of Sequelize)

  • 다중 데이터베이스 지원: MySQL, PostgreSQL, SQLite, MariaDB 등 다양한 데이터베이스를 지원합니다.
  • 모델 기반의 데이터베이스 상호작용: 테이블과 레코드를 JavaScript 객체로 관리할 수 있습니다.
  • 자동화된 데이터베이스 마이그레이션: 스키마 변경 및 버전 관리를 자동화할 수 있습니다.
  • 다양한 쿼리 작성 방법: CRUD 작업을 위한 메서드 제공 및 복잡한 쿼리를 위한 SQL 작성 가능.

Sequelize 설치 및 설정 (Installing and Setting Up Sequelize)

Sequelize와 MySQL2 설치 (Installing Sequelize and MySQL2)

npm을 사용하여 Sequelize와 MySQL2 드라이버를 설치합니다.

npm install sequelize mysql2

Sequelize 설정 (Configuring Sequelize)

Sequelize를 설정하고 데이터베이스와 연결하는 예제입니다.

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

// Sequelize 인스턴스 생성 및 데이터베이스 연결
const sequelize = new Sequelize('database', 'username', 'password', {
  host: 'localhost',
  dialect: 'mysql' // 'mysql', 'postgres', 'sqlite', 'mariadb' 등을 지원
});

// 연결 테스트
sequelize.authenticate()
  .then(() => {
    console.log('Database connection established.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

모델 정의 (Defining Models)

모델은 데이터베이스의 테이블을 나타내며, 각 모델은 Sequelize의 Model 클래스를 확장합니다.

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

const User = sequelize.define('User', {
  // 속성 정의
  name: {
    type: DataTypes.STRING,
    allowNull: false
  },
  age: {
    type: DataTypes.INTEGER,
    allowNull: false
  },
  email: {
    type: DataTypes.STRING,
    allowNull: false,
    unique: true
  }
}, {
  // 옵션 설정
  timestamps: true
});

데이터베이스 동기화 (Synchronizing the Database)

모델을 정의한 후 데이터베이스와 동기화하여 테이블을 생성합니다.

sequelize.sync({ force: true })
  .then(() => {
    console.log('Database & tables created!');
  })
  .catch(err => {
    console.error('Error creating database & tables:', err);
  });

CRUD 작업 (CRUD Operations)

Sequelize를 사용한 기본적인 CRUD(생성, 조회, 수정, 삭제) 작업 예제입니다.

데이터 생성 (Creating Data)

const createUser = async () => {
  const user = await User.create({ name: 'John Doe', age: 30, email: 'john@example.com' });
  console.log('User created:', user.toJSON());
};

createUser();

데이터 조회 (Reading Data)

const getUsers = async () => {
  const users = await User.findAll();
  console.log('Users:', users);
};

getUsers();

데이터 수정 (Updating Data)

const updateUser = async (userId) => {
  const user = await User.findByPk(userId);
  if (user) {
    user.age = 31;
    await user.save();
    console.log('User updated:', user.toJSON());
  } else {
    console.log('User not found');
  }
};

updateUser(1);

데이터 삭제 (Deleting Data)

const deleteUser = async (userId) => {
  const user = await User.findByPk(userId);
  if (user) {
    await user.destroy();
    console.log('User deleted');
  } else {
    console.log('User not found');
  }
};

deleteUser(1);

관계 설정 (Defining Relationships)

Sequelize를 사용하면 모델 간의 관계를 설정할 수 있습니다. 예를 들어, User 모델과 Post 모델 간의 일대다 관계를 설정할 수 있습니다.

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

// 관계 정의
User.hasMany(Post);
Post.belongsTo(User);

// 동기화
sequelize.sync({ force: true })
  .then(() => {
    console.log('Database & tables created with relationships!');
  });

데이터베이스 마이그레이션 (Database Migration)

Sequelize CLI를 사용하여 데이터베이스 마이그레이션을 관리할 수 있습니다. 마이그레이션은 데이터베이스 스키마 변경을 추적하고 관리하는 데 도움이 됩니다.

Sequelize CLI 설치 (Installing Sequelize CLI)

npm install --save-dev sequelize-cli

Sequelize CLI 초기화 (Initializing Sequelize CLI)

npx sequelize-cli init

이 명령은 config, models, migrations, seeders 디렉토리를 생성합니다.

마이그레이션 파일 생성 (Creating Migration Files)

npx sequelize-cli migration:generate --name create-users

마이그레이션 파일을 작성한 후, 마이그레이션을 실행하여 데이터베이스 스키마를 변경합니다.

npx sequelize-cli db:migrate

예제 프로젝트 (Example Project)

간단한 예제 프로젝트를 통해 Sequelize를 사용하여 사용자와 게시물을 관리하는 애플리케이션을 만들어 보겠습니다.

프로젝트 구조 (Project Structure)

my-app/
├── config/
│   └── config.json
├── models/
│   ├── index.js
│   ├── user.js
│   └── post.js
├── migrations/
├── seeders/
├── node_modules/
├── package.json
└── app.js

config/config.json

데이터베이스 설정 파일입니다.

{
  "development": {
    "username": "root",
    "password": "password",
    "database": "mydatabase",
    "host": "127.0.0.1",
    "dialect": "mysql"
  }
}

models/index.js

모델을 초기화하는 파일입니다.

const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize(require('../config/config.json').development);

const User = require('./user')(sequelize, DataTypes);
const Post = require('./post')(sequelize, DataTypes);

// 관계 정의
User.hasMany(Post);
Post.belongsTo(User);

sequelize.sync();

module.exports = { sequelize, User, Post };

models/user.js

User 모델을 정의합니다.

module.exports = (sequelize, DataTypes) => {
  return sequelize.define('User', {
    name: {
      type: DataTypes.STRING,
      allowNull: false
    },
    age: {
      type: DataTypes.INTEGER,
      allowNull: false
    },
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true
    }
  });
};

models/post.js

Post 모델을 정의합니다.

module.exports = (sequelize, DataTypes) => {
  return sequelize.define('Post', {
    title: {
      type: DataTypes.STRING,
      allowNull: false
    },
    content: {
      type: DataTypes.TEXT,
      allowNull: false
    }
  });
};

app.js

애플리케이션의 진입점 파일입니다.

const { User, Post } = require('./models');

// 사용자와 게시물 생성 예제
const createData = async () => {
  const user = await User.create({ name: 'John Doe', age: 30, email: 'john@example.com' });
  await Post.create({ title: 'First Post', content: 'This is the content of the first post', UserId: user.id });
};

createData().then(() => console.log('Data created successfully'));

이 예제에서는 Sequelize를 사용하여 사용자와 게시물 간의 관계를 설정하고, 데이터를 생성하는 방법을 보여줍니다. 이러한 기본적인 CRUD 작업과 관계 설정을 통해 Sequelize를 활용한 데이터베이스 연동을 쉽게 이해할 수 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *