Backend Study

MongoDB와 NoSQL

jimmmy_jin 2025. 2. 3. 16:28

1. NoSQL과 관계형 데이터베이스(SQL)의 차이

1.1 SQL vs NoSQL

SQL(관계형 데이터베이스, RDBMS)과 NoSQL(비관계형 데이터베이스)은 데이터 저장 방식과 확장성 측면에서 큰 차이가 있다.

비교 항목 SQL (관계형 DB) NoSQL (비관계형 DB)

데이터 모델 테이블 기반 (행, 열) 문서, 키-값, 그래프, 컬럼 기반
스키마 엄격한 스키마 필요 유연한 스키마 (동적 구조)
확장성 수직 확장 (Scale-up) 수평 확장 (Scale-out)
트랜잭션 강력한 ACID 지원 CAP 이론 적용 (일관성 vs 가용성)
적용 사례 금융, ERP, CRM 실시간 분석, IoT, 빅데이터

NoSQL은 유연한 데이터 저장 방식과 높은 확장성을 제공하기 때문에, 대량의 데이터 처리가 필요한 최신 웹 애플리케이션에서 많이 사용된다.


2. MongoDB란?

2.1 MongoDB 개요

MongoDB는 문서 기반(Document-Oriented)의 NoSQL 데이터베이스로, JSON과 유사한 BSON(Binary JSON) 형식으로 데이터를 저장한다.

스키마리스(Schema-less) → 데이터 구조 변경이 자유롭다.
수평 확장(Scale-out) 용이 → 여러 서버에 데이터를 분산 저장 가능.
고속 데이터 읽기/쓰기 → 인덱싱과 캐싱 지원.
대용량 데이터 처리 가능 → 빅데이터 및 실시간 애플리케이션에 적합.

2.2 MongoDB의 주요 개념

개념 설명

Database 여러 개의 컬렉션을 포함하는 단위 (RDBMS의 데이터베이스 개념)
Collection 여러 문서를 포함하는 그룹 (RDBMS의 테이블 개념)
Document JSON 형태의 데이터 (RDBMS의 행(Row) 개념)
Field 문서 내의 키-값 쌍 (RDBMS의 컬럼(Column) 개념)

3. MongoDB 설치 및 기본 사용법

3.1 MongoDB 설치

MongoDB는 로컬 또는 클라우드(MongoDB Atlas) 환경에서 실행할 수 있다.

설치 후 MongoDB 서버 실행:

mongod --dbpath /data/db

MongoDB 셸 실행:

mongo

3.2 기본 명령어

MongoDB의 CRUD(Create, Read, Update, Delete) 기본 명령어:

// 데이터베이스 선택
use myDatabase;

// 컬렉션에 데이터 삽입
db.users.insertOne({ name: "Jin", age: 25, email: "jin@example.com" });

// 데이터 조회
db.users.find();

// 데이터 수정
db.users.updateOne({ name: "Jin" }, { $set: { age: 26 } });

// 데이터 삭제
db.users.deleteOne({ name: "Jin" });

4. Node.js + MongoDB (Mongoose 활용)

4.1 Mongoose 설치

Mongoose는 MongoDB와 Node.js를 쉽게 연결할 수 있도록 도와주는 ODM(Object Data Modeling) 라이브러리다.

npm install mongoose

4.2 MongoDB 연결 설정

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/myDatabase', {
    useNewUrlParser: true,
    useUnifiedTopology: true,
})
.then(() => console.log('MongoDB 연결 성공'))
.catch(err => console.error('MongoDB 연결 실패:', err));

4.3 Mongoose 모델 생성

const { Schema, model } = require('mongoose');

const userSchema = new Schema({
    name: String,
    age: Number,
    email: { type: String, required: true, unique: true }
});

const User = model('User', userSchema);
module.exports = User;

4.4 CRUD 예제

const User = require('./models/User');

// 데이터 생성
const createUser = async () => {
    const user = new User({ name: 'Alice', age: 30, email: 'alice@example.com' });
    await user.save();
    console.log('사용자 생성 완료:', user);
};

// 데이터 조회
const getUsers = async () => {
    const users = await User.find();
    console.log('사용자 목록:', users);
};

// 데이터 업데이트
const updateUser = async (id) => {
    await User.findByIdAndUpdate(id, { age: 31 });
    console.log('사용자 정보 업데이트 완료');
};

// 데이터 삭제
const deleteUser = async (id) => {
    await User.findByIdAndDelete(id);
    console.log('사용자 삭제 완료');
};

5. MongoDB가 적합한 경우

대용량 데이터 처리 (빅데이터, IoT, 로그 시스템)
데이터 구조가 자주 변경되는 경우 (스타트업, 빠른 프로토타이핑)
JSON 기반 애플리케이션 (REST API, GraphQL)
수평 확장이 필요한 서비스 (클라우드 환경, 마이크로서비스 아키텍처)


6. 결론

MongoDB는 유연한 스키마와 강력한 확장성을 제공하는 NoSQL 데이터베이스로, 실시간 분석, 로그 처리, IoT 데이터 저장 등에 적합하다.

Node.js와 함께 사용하면 JSON 기반의 애플리케이션을 손쉽게 구축할 수 있으며, ORM인 Mongoose를 활용하면 데이터를 더욱 편리하게 관리할 수 있다.

빠르게 변화하는 서비스라면 MongoDB를 고려해보자! 🚀