본문 바로가기

개발

Node.js와 데이터베이스 간의 ORM(Object-Relational Mapping)

ORM이란

ORM이란 Object-Relational Mapping의 약자로, 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 기술입니다. 즉, ORM을 사용하면 SQL 문을 직접 작성하지 않고도 객체 지향 프로그래밍 방식으로 데이터베이스를 조작할 수 있습니다. 예를 들어, User라는 클래스를 정의하고, 이 클래스의 인스턴스를 생성하고, 저장하고, 조회하고, 수정하고, 삭제하는 등의 작업을 할 수 있습니다. 이때 ORM은 User 클래스와 데이터베이스의 user 테이블 간의 매핑 정보를 바탕으로 적절한 SQL 문을 생성하고 실행해줍니다.

 

ORM의 장단점

ORM은 다음과 같은 장점을 가집니다.

- SQL 문을 직접 작성하지 않아도 되므로 개발 속도와 생산성을 높일 수 있습니다.

- SQL 문을 추상화하므로 데이터베이스에 종속적이지 않고 다양한 데이터베이스를 사용할 수 있습니다.

- 객체 지향 프로그래밍 방식으로 코드를 작성하므로 가독성과 유지보수성을 높일 수 있습니다.

- 타입 안전성과 유효성 검사 등의 기능을 제공하여 오류를 줄일 수 있습니다.

 

ORM은 다음과 같은 단점을 가집니다.

- SQL 문을 추상화하므로 성능 저하가 발생할 수 있습니다. 예를 들어, N+1 문제나 캐싱 문제 등이 있습니다.

- SQL 문을 추상화하므로 복잡한 쿼리나 최적화가 어려울 수 있습니다. 예를 들어, 조인이나 서브쿼리 등이 있습니다.

- ORM에 의존하면 SQL 문에 대한 지식이 부족해질 수 있습니다. 예를 들어, 디버깅이나 튜닝 등이 어려울 수 있습니다.

 

Node.js에서 사용할 수 있는 ORM 모듈 소개

Node.js에서는 다양한 ORM 모듈을 사용할 수 있습니다. 대표적인 예로는 다음과 같은 모듈들이 있습니다.

- Sequelize: PostgreSQL, MySQL, MariaDB, SQLite, SQL Server 등을 지원하는 프로미스 기반의 ORM 모듈입니다. 트랜잭션, 관계, 즉시 로딩과 지연 로딩, 복제 등의 기능을 제공합니다.

- Prisma: PostgreSQL, MySQL, SQLite, SQL Server, MongoDB 등을 지원하는 넥스트 제네레이션(next-generation) ORM 모듈입니다. 데이터 모델, 자동 마이그레이션, 타입 안전성, 오토 컴플리션 등의 기능을 제공합니다.

- TypeORM: PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, MongoDB 등을 지원하는 타입스크립트와 자바스크립트를 위한 ORM 모듈입니다. 액티브 레코드와 데이터 매퍼 패턴, 트랜잭션, 관계, 캐싱 등의 기능을 제공합니다.

 

ORM 모듈의 기본적인 사용 방법

ORM 모듈의 사용 방법은 각 모듈마다 다르지만, 일반적으로 다음과 같은 과정을 거칩니다.

- ORM 모듈을 설치하고 불러옵니다. 

npm install sequelize
const Sequelize = require("sequelize");

- 데이터베이스와 연결하기 위한 설정을 합니다. 

const sequelize = new Sequelize("database", "username", "password", { dialect: "mysql" });

- 모델을 정의하고 데이터베이스에 테이블을 생성합니다. 

const User = sequelize.define("User", { name: Sequelize.STRING, age: Sequelize.INTEGER });
sequelize.sync();

- CRUD(Create, Read, Update, Delete) 작업을 수행합니다. 

User.create({ name: "Alice", age: 20 });
User.findAll();
User.update({ age: 21 }, { where: { name: "Alice" } });
User.destroy({ where: { name: "Alice" } });

 

ORM 모듈의 고급 기능 소개

ORM 모듈은 다양한 고급 기능을 제공합니다. 대표적인 예로는 다음과 같은 기능들이 있습니다.

- 관계(Relation): 모델 간에 1:1, 1:N, N:M 등의 관계를 정의하고 조인(join) 쿼리를 수행할 수 있습니다. 예를 들어, User 모델과 Post 모델 간에 1:N 관계를 정의하고, User와 Post를 함께 조회할 수 있습니다.

User.hasMany(Post);
Post.belongsTo(User);
User.findAll({ include: Post });

- 스코프(Scope): 특정 조건이나 옵션을 미리 정의해두고 재사용할 수 있습니다. 예를 들어, User 모델에서 나이가 20살 이상인 유저들만 조회하는 스코프를 정의하고 사용할 수 있습니다.

User.addScope("adults", { where: { age: { [Sequelize.Op.gte]: 20 } } }); 
User.scope("adults").findAll();

- 훅(Hook): 모델의 생명주기(lifecycle)에 따라 특정 로직을 실행할 수 있습니다. 예를 들어, User 모델에서 생성하기 전에 비밀번호를 암호화하거나, 삭제하기 전에 로그를 남기는 등의 작업을 할 수 있습니다. 

User.beforeCreate(user => { 
	user.password = bcrypt.hashSync(user.password); 
}); 
User.beforeDestroy(user => {
	console.log(`user ${user.name} is deleted.`); 
});

 

Node.js와 데이터베이스 간의 ORM(Object-Relational Mapping)에 대해 알아보았습니다. ORM은 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 기술입니다. ORM을 사용하면 SQL 문을 직접 작성하지 않고도 객체 지향 프로그래밍 방식으로 데이터베이스를 조작할 수 있습니다. ORM은 개발 속도와 생산성, 가독성과 유지보수성, 타입 안전성과 유효성 검사 등의 장점을 가지지만, 성능 저하나 복잡한 쿼리나 최적화의 어려움, SQL 문에 대한 지식의 부족 등의 단점도 가집니다. Node.js에서는 Sequelize, Prisma, TypeORM 등의 다양한 ORM 모듈을 사용할 수 있습니다. ORM 모듈을 사용하려면 데이터베이스와 연결하기 위한 설정을 하고, 모델을 정의하고, CRUD 작업을 수행하는 등의 과정을 거칩니다. 또한 ORM 모듈은 관계, 스코프, 훅 등의 다양한 고급 기능을 제공합니다. Node.js 애플리케이션에서 ORM을 적절하게 활용하여 데이터베이스 작업을 편리하고 안전하게 수행해보세요.