MongoDB와 Express.js로 블로그 만들기 – 완성까지 한번에!

MongoDB와 Express.js로 블로그 만들기 – 완성까지 한번에!

MongoDB와 Express.js로 블로그 만들기는 풀스택 개발 역량을 키우는 최적의 프로젝트입니다. 이 가이드에서는 Node.js 기반의 Express.js 프레임워크와 NoSQL 데이터베이스인 MongoDB를 활용하여 실전에서 바로 사용할 수 있는 블로그 시스템을 단계별로 구축합니다. 초보자도 따라할 수 있도록 프로젝트 셋업부터 배포까지 모든 과정을 상세히 다룹니다.

프로젝트 소개 및 목표

이번 프로젝트의 목표는 CRUD(Create, Read, Update, Delete) 기능을 갖춘 완전한 블로그 플랫폼을 만드는 것입니다. 사용자는 게시글을 작성하고, 조회하며, 수정 및 삭제할 수 있습니다. RESTful API 설계 원칙을 따르며, MVC 패턴을 적용하여 코드의 유지보수성을 높입니다. MongoDB를 통해 유연한 스키마 구조를 경험하고, Express.js의 미들웨어 시스템을 활용하여 효율적인 서버 로직을 구현합니다. 완성된 프로젝트는 포트폴리오에 추가하기에 적합하며, 실무에서 요구하는 백엔드 개발 능력을 검증할 수 있습니다.

필요한 기술 스택

프로젝트를 진행하기 위해 다음 기술들이 필요합니다:

  • Node.js (v16 이상): JavaScript 런타임 환경
  • Express.js (v4.x): 웹 애플리케이션 프레임워크
  • MongoDB (v5.x 이상): NoSQL 데이터베이스
  • Mongoose: MongoDB ODM(Object Data Modeling) 라이브러리
  • EJS 또는 Pug: 템플릿 엔진 (선택사항)
  • Postman: API 테스팅 도구

기본적인 JavaScript 지식과 비동기 프로그래밍에 대한 이해가 있으면 좋습니다.

프로젝트 셋업

먼저 프로젝트 디렉토리를 생성하고 npm을 초기화합니다:

mkdir blog-project
cd blog-project
npm init -y

필요한 패키지들을 설치합니다:

npm install express mongoose dotenv cors
npm install --save-dev nodemon

프로젝트 구조를 다음과 같이 설정합니다:

blog-project/
├── models/
│   └── Post.js
├── routes/
│   └── posts.js
├── controllers/
│   └── postController.js
├── config/
│   └── database.js
├── .env
├── server.js
└── package.json

.env 파일을 생성하여 환경 변수를 설정합니다:

PORT=3000
MONGODB_URI=mongodb://localhost:27017/blog

단계별 구현 과정

1단계: 데이터베이스 연결 설정

config/database.js 파일을 생성하여 MongoDB 연결을 구성합니다:

const mongoose = require('mongoose');

const connectDB = async () => {
  try {
    await mongoose.connect(process.env.MONGODB_URI, {
      useNewUrlParser: true,
      useUnifiedTopology: true
    });
    console.log('MongoDB 연결 성공');
  } catch (error) {
    console.error('MongoDB 연결 실패:', error.message);
    process.exit(1);
  }
};

module.exports = connectDB;

2단계: 게시글 모델 정의

models/Post.js 파일에서 Mongoose 스키마를 정의합니다:

const mongoose = require('mongoose');

const postSchema = new mongoose.Schema({
  title: {
    type: String,
    required: [true, '제목은 필수입니다'],
    trim: true,
    maxlength: [100, '제목은 100자를 초과할 수 없습니다']
  },
  content: {
    type: String,
    required: [true, '내용은 필수입니다']
  },
  author: {
    type: String,
    required: [true, '작성자는 필수입니다'],
    trim: true
  },
  tags: [{
    type: String,
    trim: true
  }],
  views: {
    type: Number,
    default: 0
  },
  published: {
    type: Boolean,
    default: false
  }
}, {
  timestamps: true
});

// 인덱스 생성으로 검색 성능 향상
postSchema.index({ title: 'text', content: 'text' });

module.exports = mongoose.model('Post', postSchema);

3단계: 컨트롤러 구현

controllers/postController.js에서 비즈니스 로직을 처리합니다:

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

// 모든 게시글 조회
exports.getAllPosts = async (req, res) => {
  try {
    const { page = 1, limit = 10, published } = req.query;
    const filter = published !== undefined ? { published } : {};
    
    const posts = await Post.find(filter)
      .sort({ createdAt: -1 })
      .limit(limit * 1)
      .skip((page - 1) * limit)
      .select('-__v');
    
    const count = await Post.countDocuments(filter);
    
    res.status(200).json({
      success: true,
      data: posts,
      totalPages: Math.ceil(count / limit),
      currentPage: page
    });
  } catch (error) {
    res.status(500).json({ success: false, message: error.message });
  }
};

// 단일 게시글 조회
exports.getPostById = async (req, res) => {
  try {
    const post = await Post.findById(req.params.id);
    
    if (!post) {
      return res.status(404).json({ success: false, message: '게시글을 찾을 수 없습니다' });
    }
    
    // 조회수 증가
    post.views += 1;
    await post.save();
    
    res.status(200).json({ success: true, data: post });
  } catch (error) {
    res.status(500).json({ success: false, message: error.message });
  }
};

// 게시글 생성
exports.createPost = async (req, res) => {
  try {
    const post = await Post.create(req.body);
    res.status(201).json({ success: true, data: post });
  } catch (error) {
    res.status(400).json({ success: false, message: error.message });
  }
};

// 게시글 수정
exports.updatePost = async (req, res) => {
  try {
    const post = await Post.findByIdAndUpdate(
      req.params.id,
      req.body,
      { new: true, runValidators: true }
    );
    
    if (!post) {
      return res.status(404).json({ success: false, message: '게시글을 찾을 수 없습니다' });
    }
    
    res.status(200).json({ success: true, data: post });
  } catch (error) {
    res.status(400).json({ success: false, message: error.message });
  }
};

// 게시글 삭제
exports.deletePost = async (req, res) => {
  try {
    const post = await Post.findByIdAndDelete(req.params.id);
    
    if (!post) {
      return res.status(404).json({ success: false, message: '게시글을 찾을 수 없습니다' });
    }
    
    res.status(200).json({ success: true, message: '게시글이 삭제되었습니다' });
  } catch (error) {
    res.status(500).json({ success: false, message: error.message });
  }
};

4단계: 라우트 설정

routes/posts.js에서 엔드포인트를 정의합니다:

const express = require('express');
const router = express.Router();
const postController = require('../controllers/postController');

router.get('/', postController.getAllPosts);
router.get('/:id', postController.getPostById);
router.post('/', postController.createPost);
router.put('/:id', postController.updatePost);
router.delete('/:id', postController.deletePost);

module.exports = router;

5단계: 서버 구성

server.js에서 Express 애플리케이션을 설정합니다:

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const connectDB = require('./config/database');
const postRoutes = require('./routes/posts');

const app = express();

// 데이터베이스 연결
connectDB();

// 미들웨어
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// 라우트
app.use('/api/posts', postRoutes);

// 기본 라우트
app.get('/', (req, res) => {
  res.json({ message: '블로그 API 서버에 오신 것을 환영합니다!' });
});

// 에러 핸들링 미들웨어
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ success: false, message: '서버 오류가 발생했습니다' });
});

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
  console.log(`서버가 포트 ${PORT}에서 실행 중입니다`);
});

package.json에 실행 스크립트를 추가합니다:

"scripts": {
  "start": "node server.js",
  "dev": "nodemon server.js"
}

테스트 및 배포

로컬 테스트

MongoDB가 실행 중인지 확인한 후 개발 서버를 시작합니다:

npm run dev

Postman이나 curl을 사용하여 API를 테스트합니다:

# 게시글 생성
curl -X POST http://localhost:3000/api/posts \
  -H "Content-Type: application/json" \
  -d '{"title":"첫 게시글","content":"테스트 내용","author":"홍길동","tags":["테스트"]}'

# 모든 게시글 조회
curl http://localhost:3000/api/posts

# 특정 게시글 조회
curl http://localhost:3000/api/posts/{게시글ID}

배포 준비

MongoDB와 Express.js로 블로그 만들기 프로젝트를 프로덕션에 배포하려면 다음을 고려합니다:

  • MongoDB Atlas: 클라우드 기반 MongoDB 사용
  • Heroku, Vercel, Railway: 서버 호스팅 플랫폼
  • 환경 변수: 민감한 정보를 안전하게 관리
  • HTTPS: SSL 인증서로 보안 강화

Heroku 배포 예시:

heroku create my-blog-app
heroku config:set MONGODB_URI=your_mongodb_atlas_uri
git push heroku main

마무리 및 확장 아이디어

MongoDB와 Express.js로 블로그 만들기 기본 구현이 완료되었습니다. 이제 다음과 같은 기능을 추가하여 프로젝트를 확장할 수 있습니다:

  • 사용자 인증: JWT 또는 Passport.js를 활용한 로그인 시스템
  • 댓글 기능: 게시글별 댓글 및 대댓글 지원
  • 이미지 업로드: Multer와 Cloudinary를 이용한 파일 관리
  • 검색 기능: MongoDB의 텍스트 인덱스를 활용한 전문 검색
  • 카테고리 관리: 게시글을 주제별로 분류
  • 좋아요/북마크: 사용자 상호작용 기능
  • 프론트엔드: React, Vue 또는 EJS로 UI 구현

이 프로젝트를 통해 실무에서 필요한 백엔드 개발 역량을 키우고, 포트폴리오에 추가할 수 있는 완성도 높은 결과물을 만들어보세요!

📚 함께 읽으면 좋은 글

1

MongoDB와 Express.js로 블로그 만들기 – 완성까지 한번에!

📂 프로젝트 아이디어
📅 2025. 10. 31.
🎯 MongoDB와 Express.js로 블로그 만들기

2

React + Node.js 풀스택 앱 배포하기 – 완성까지 한번에!

📂 프로젝트 아이디어
📅 2025. 11. 20.
🎯 React + Node.js 풀스택 앱 배포하기

3

REST API 서버 구축 단계별 튜토리얼 – 완성까지 한번에!

📂 프로젝트 아이디어
📅 2025. 11. 18.
🎯 REST API 서버 구축 단계별 튜토리얼

4

JWT 인증 시스템 구현하기 – 완성까지 한번에!

📂 프로젝트 아이디어
📅 2025. 11. 18.
🎯 JWT 인증 시스템 구현하기

5

실시간 채팅 앱 만들기 with Socket.io – 완성까지 한번에!

📂 프로젝트 아이디어
📅 2025. 11. 17.
🎯 실시간 채팅 앱 만들기 with Socket.io

💡 위 글들을 통해 더 깊이 있는 정보를 얻어보세요!

📢 이 글이 도움되셨나요? 공유해주세요!

여러분의 공유 한 번이 더 많은 사람들에게 도움이 됩니다 ✨

🔥 공유할 때마다 블로그 성장에 큰 힘이 됩니다! 감사합니다 🙏

💬 여러분의 소중한 의견을 들려주세요!

이 글에서 가장 도움이 된 부분은 어떤 것인가요?

💡
유용한 정보 공유

궁금한 점 질문

🤝
경험담 나누기

👍
의견 표현하기

⭐ 모든 댓글은 24시간 내에 답변드리며, 여러분의 의견이 다른 독자들에게 큰 도움이 됩니다!
🎯 건설적인 의견과 경험 공유를 환영합니다 ✨

🔔 블로그 구독하고 최신 글을 받아보세요!

📚
다양한 주제
17개 카테고리

정기 업데이트
하루 3회 발행

🎯
실용적 정보
바로 적용 가능

💡
최신 트렌드
2025년 기준

🌟 프로젝트 아이디어부터 다양한 실생활 정보까지!
매일 새로운 유용한 콘텐츠를 만나보세요 ✨

📧 RSS 구독 | 🔖 북마크 추가 | 📱 모바일 앱 알림 설정
지금 구독하고 놓치는 정보 없이 업데이트 받아보세요!

답글 남기기