🍃
EPISODE 06
Atlas · Mongoose · Schema/Model · CRUD
MongoDB 기초
NoSQL의 대표 MongoDB의 문서·컬렉션 개념, Atlas 무료 클러스터 생성, Mongoose로 Node에서 연결, Schema/Model 정의와 CRUD를 익힙니다.
MongoDBMongooseNoSQLAtlas
소요 시간
⏱ 60분
난이도
📊 중급
선수 조건
🎯 db-05
결과물
Atlas에 연결된 메모 CRUD API
이 강의에서 배우는 것
- 1Database/Collection/Document/Field 개념을 안다
- 2MongoDB Atlas 무료 클러스터를 생성하고 접속 URL을 얻는다
- 3Mongoose로 연결, Schema/Model을 정의한다
- 4create/find/findById/findByIdAndUpdate/findByIdAndDelete를 사용한다
- 5MongoDB와 RDB 중 적합한 상황을 판단한다
1. NoSQL — 문서/컬렉션
| SQL | MongoDB | 설명 |
|---|---|---|
| 데이터베이스 | Database | 같음 |
| 테이블 | Collection | 문서의 묶음 |
| 행(Row) | Document | 하나의 데이터 |
| 열(Column) | Field | 데이터의 속성 |
| 기본키(PK) | _id | 자동 ObjectId |
json
{
"_id": "64a7c8e3f9b12345678abcde",
"title": "오늘 할 일",
"content": "MongoDB 공부하기",
"tags": ["공부", "개발"],
"author": { "name": "김철수", "email": "kim@example.com" },
"createdAt": "2024-03-15T10:00:00.000Z"
}관련 데이터를 문서 안에 중첩(embed) 가능 → JOIN 없이 하나의 쿼리로 조회.
2. MongoDB Atlas 무료 클러스터
- https://www.mongodb.com/atlas 접속 → 회원가입
- Build a Database → Free (M0) 선택
- AWS / Seoul (ap-northeast-2)
- Create
- Database Access — 사용자 추가 (비밀번호 기록!)
- Network Access — Allow Access from Anywhere
- Connect → Connection String 복사
text
mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/myDB?retryWrites=true&w=majority3. Mongoose 연결
bash
npm install mongoose express dotenvtext
# .env
MONGODB_URI=mongodb+srv://username:password@cluster0.xxxxx.mongodb.net/myDBjavascript
const mongoose = require('mongoose');
mongoose.connect(process.env.MONGODB_URI)
.then(() => console.log('MongoDB 연결 성공'))
.catch((err) => console.error('연결 실패:', err));4. Schema / Model
javascript
const mongoose = require('mongoose');
const memoSchema = new mongoose.Schema(
{
title: { type: String, required: true },
content: { type: String, required: true },
tags: [String],
isPublic: { type: Boolean, default: false },
},
{ timestamps: true } // createdAt, updatedAt 자동
);
// 컬렉션명은 자동으로 소문자 복수형 (Memo → memos)
const Memo = mongoose.model('Memo', memoSchema);
module.exports = Memo;5. CRUD
Create
javascript
// new + save
const memo = new Memo({ title: '제목', content: '내용', tags: ['공부'] });
await memo.save();
// create (권장)
const memo = await Memo.create({ title: '제목', content: '내용' });Read
javascript
const memos = await Memo.find();
const memos = await Memo.find({ tags: '공부' });
const memos = await Memo.find().sort({ createdAt: -1 }).limit(10);
const memo = await Memo.findById('64a7c8e3f9b12345678abcde');
const memo = await Memo.findOne({ title: '오늘 할 일' });Update
javascript
const updated = await Memo.findByIdAndUpdate(
id,
{ title: '새 제목' },
{ new: true } // 수정 후 문서 반환
);Delete
javascript
await Memo.findByIdAndDelete(id);6. 언제 MongoDB?
MongoDB 유리
- 데이터 구조가 자주 바뀌는 프로젝트
- 문서 안에 배열/중첩 객체가 많은 경우 (태그, 댓글 배열)
- 대용량 비정형 데이터 (로그, 이벤트)
- 빠른 수평 확장이 필요한 경우
RDB 유리
- 데이터 간 복잡한 관계가 많은 경우
- 금융/결제 등 트랜잭션 무결성 중요
- 정해진 스키마로 데이터 일관성 중요