Sequelize로 Node.js ORM 시작하기 쉽게 보기
Node.js 환경에서 Sequelize를 설치하고 모델을 정의해 기본 CRUD와 연관 관계를 이해하는 실용 설명서. 초보자도 따라할 수 있는 예제 중심 설명.
목차
소개
Sequelize는 Node.js에서 널리 쓰이는 ORM이다. SQL 문을 직접 많이 쓰지 않고도 데이터베이스를 다룰 수 있다. 이 글은 Sequelize 사용법 Node.js 환경에서 설치부터 모델 정의, 기본 CRUD와 연관 관계까지 차근차근 설명한다. 처음 접하는 사람도 이해하기 쉽도록 예제를 중심으로 구성했다.
준비 작업
필수 도구
- Node.js(최신 LTS 권장)
- 데이터베이스(MySQL, PostgreSQL, SQLite 등)
- 프로젝트 초기화: npm init
패키지 설치
Sequelize와 사용하려는 데이터베이스 드라이버를 설치한다.
npm install sequelize
npm install mysql2 # MySQL 예시
npm install pg pg-hstore # PostgreSQL 예시
기본 설정
새 파일 db.js를 만든 뒤 Sequelize 인스턴스를 생성한다. 환경 변수로 설정을 분리하면 운영 환경과 개발 환경을 나누기 쉽다.
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql',
logging: false,
});
module.exports = sequelize;
모델 정의
모델은 테이블 구조를 코드로 표현한다. 아래는 사용자 모델 정의 예제다. 필드 타입과 제약을 명시할 수 있다.
const { DataTypes } = require('sequelize');
const sequelize = require('./db');
const User = sequelize.define('User', {
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
username: { type: DataTypes.STRING, allowNull: false, unique: true },
email: { type: DataTypes.STRING, allowNull: false },
}, {
tableName: 'users',
timestamps: true,
});
module.exports = User;
Sequelize 모델 정의 예제 설명
define 메서드는 모델 이름과 속성, 옵션을 받는다. timestamps 옵션으로 createdAt, updatedAt을 자동 처리한다. 다양한 데이터 타입과 검증 옵션을 통해 제약을 추가할 수 있다.
테이블 생성 및 동기화
개발 초기에는 sync 메서드로 간단히 테이블을 생성할 수 있다. 운영 환경에서는 마이그레이션 도구 사용을 권장한다.
const sequelize = require('./db');
const User = require('./User');
(async () => {
try {
await sequelize.authenticate();
await sequelize.sync({ alter: true });
console.log('DB 연결 및 동기화 완료');
} catch (err) {
console.error('DB 연결 오류:', err);
}
})();
기본 CRUD 예제
CRUD 패턴을 통해 데이터를 생성, 조회, 수정, 삭제하는 방법을 보여준다.
// 생성
const newUser = await User.create({ username: 'kim', email: 'kim@example.com' });
// 조회
const users = await User.findAll({ where: { username: 'kim' } });
// 수정
await User.update({ email: 'kim2@example.com' }, { where: { id: newUser.id } });
// 삭제
await User.destroy({ where: { id: newUser.id } });
연관 관계(Associations)
다대일, 일대다, 다대다 관계를 정의해 조인 쿼리를 ORM 수준에서 처리할 수 있다. 아래는 게시글과 사용자 관계 예시다.
const Post = sequelize.define('Post', {
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
title: DataTypes.STRING,
content: DataTypes.TEXT,
});
User.hasMany(Post, { foreignKey: 'userId' });
Post.belongsTo(User, { foreignKey: 'userId' });
// 포함 조회
const posts = await Post.findAll({ include: [{ model: User, attributes: ['username'] }] });
실무 팁
- 환경별 설정을 분리해 비밀번호와 호스트 정보를 관리한다.
- 운영 환경에서는 sync 대신 마이그레이션 사용을 권장한다.
- 연결 풀과 타임아웃 설정으로 안정성을 높인다.
- 대용량 작업은 배치 처리와 트랜잭션으로 묶는다.
문제 해결과 디버깅
에러 발생 시 SQL 로그를 확인하면 원인을 빠르게 파악할 수 있다. logging 옵션을 true로 설정하거나 sequelize.showAllSchemas 같은 유틸을 이용한다. 또한 validation 오류와 DB 제약 오류를 구분해 처리하면 에러 핸들링이 단순해진다.
마무리
이 글은 Node.js Sequelize 튜토리얼 형태로 설치부터 모델 정의 예제, CRUD와 연관 관계를 설명했다. ORM의 장점은 반복적인 SQL 작성 부담을 줄이고 코드 중심으로 데이터 모델을 관리할 수 있다는 점이다. 필요한 경우 공식 문서와 마이그레이션 도구를 함께 사용하면 안정적인 운영 환경을 구축할 수 있다.