1. 오늘의 학습 목표
학습 목표: 개발자가 SQL이나 MongoDB 쿼리 언어를 직접 작성하는 대신, 익숙한 JavaScript 객체와 메서드를 사용하여 데이터베이스를 제어할 수 있게 해주는 ORM과 ODM의 개념을 이해합니다. 대표적인 라이브러리인 Sequelize(SQL용)와 Mongoose(MongoDB용)의 역할을 배우고, 이를 사용했을 때의 장점을 설명할 수 있습니다.
핵심 요약: ORM/ODM은 데이터베이스와 우리의 JavaScript 코드를 연결해주는 '자동 번역기'입니다. 복잡한 쿼리문 대신 user.save()와 같은 직관적인 코드로 데이터를 다룰 수 있게 되어 개발 생산성이 크게 향상됩니다.
2. 핵심 개념 파헤치기
2.1. ORM이란?
ORM은 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 기술입니다. 즉, SQL 데이터베이스의 테이블을 JavaScript의 객체(또는 클래스)처럼 다룰 수 있게 해줍니다
- 작동 방식: 개발자가 User.create({ name: 'Alice' })와 같은 객체 지향 코드를 작성하면, ORM이 내부적으로 INSERT INTO users (name) VALUES ('Alice');와 같은 SQL 쿼리를 생성하여 데이터베이스에 전달합니다.
- 대표적인 Node.js ORM: Sequelize, TypeORM
2.2. ODM (Object-Document Mapping)이란?
ODM은 객체와 도큐먼트 데이터베이스를 매핑해주는 기술입니다. MongoDB와 같은 NoSQL 데이터베이스의 도큐먼트를 JavaScript 객체처럼 다룰 수 있게 해줍니다.
- 특징: ODM은 스키마가 없는(Schemaless) MongoDB에 애플리케이션 레벨에서 스키마를 정의하고 검증할 수 있는 기능을 제공합니다. 이를 통해 데이터의 일관성을 유지하고 예측 가능한 코드를 작성하는 데 큰 도움을 줍니다.
- 대표적인 Node.js ODM: Mongoose
2.3. ORM/ODM 사용의 장점
- 생산성 향상: 복잡한 SQL 쿼리를 직접 작성하지 않아도 되므로 개발 속도가 빨라집니다
- 유지보수 용이: SQL 코드가 비즈니스 로직에서 분리되고, 코드가 더 객체 지향적이 되어 가독성과 유지보수성이 좋아집니다.
- 데이터베이스 종속성 감소 (주로 ORM): ORM을 사용하면 데이터베이스를 MySQL에서 PostgreSQL 등으로 비교적 쉽게 교체할 수 있습니다.
- 보안: SQL 인젝션과 같은 일반적인 보안 공격을 ORM 라이브러리가 상당 부분 방지해줍니다
3. 코드로 배우기 (Code Comparison)
3.1. 구현 목표
'사용자 생성' 기능을 순수 쿼리문과 ORM/ODM을 사용한 코드로 각각 비교하여 그 차이점을 명확히 이해합니다.
3.2. [1단계: Raw SQL vs. ORM (Sequelize)]
users 테이블에 새로운 사용자를 추가하는 코드입니다. ORM을 사용하면 SQL 구문 없이 객체와 메서드만으로 작업이 완료됩니다.
//[A] Raw SQL Query
const sql = "INSERT INTO users (name, email) VALUES (?, ?)";
db.query(sql, ['Alice', 'alice@example.com']);
//[B] ORM using Sequelize
// 1. 모델(테이블) 정의
const User = sequelize.define('User', {
name: DataTypes.STRING,
email: DataTypes.STRING
});
//2. 데이터 생성
const newUser = await User.create({
name: 'Alice',
email: 'alice@example.com'
});
3.3. [2단계: Raw MongoDB Query vs. ODM (Mongoose)]
users 컬렉션에 새로운 사용자 도큐먼트를 추가하는 코드입니다. Mongoose를 통해 스키마를 정의하고, save() 메서드로 간단하게 데이터를 저장합니다.
//[A] Raw MongoDB Query (mongodb driver)
db.collection('users').insertOne({
name: 'Alice',
email: 'alice@example.com'
});
//[B] ODM using Mongoose
//1. 스키마 정의
const userSchema = new mongoose.Schema({
name: String,
email: String
});
//2. 모델 생성
const User = mongoose.model('User', userSchema);
//3. 데이터 생성
const newUser = new User({
name: 'Alice',
email: 'alice@example.com'
});
await newUser.save();
'개발 > 웹 개발' 카테고리의 다른 글
| Day 36: JWT (JSON Web Token) (0) | 2024.09.18 |
|---|---|
| Day 33-35: DB 연동과 인증의 기초 (4) | 2024.09.12 |
| Day 31: NoSQL 기초 (MongoDB 모델링) (1) | 2024.09.06 |
| Day 29-30: SQL 기초와 심화 (CRUD와 JOIN) (1) | 2024.09.06 |
| Day 28: 데이터베이스 (SQL vs NoSQL) (1) | 2024.09.03 |