Express 개발 강좌, MongoDB와 Mongoose를 이용한 데이터베이스 연동

이 강좌에서는 Express.js 웹 프레임워크를 사용하여 Node.js 서버를 구축하고, MongoDB 데이터베이스와의 연동을 위해 Mongoose 라이브러리를 사용하는 방법에 대해 자세히 설명합니다. 이 강좌를 통해 여러분은 Express 서버를 설정하고 데이터베이스 모델을 정의하며 데이터 CRUD(Create, Read, Update, Delete) 작업을 수행하는 방법을 배우게 될 것입니다.

목차

  1. Express.js 소개
  2. MongoDB 소개
  3. Mongoose란?
  4. Express 서버 준비하기
  5. MongoDB 연동하기
  6. CRUD 기능 구현하기
  7. 결론

1. Express.js 소개

Express.js는 Node.js를 위한 최소화되고 유연한 웹 애플리케이션 프레임워크입니다. 이 프레임워크는 웹 애플리케이션 및 API를 구축하는 데 필요한 많은 기능을 제공합니다. Express는 미들웨어 개념을 사용하여 요청-응답 사이클을 처리하며, 이를 통해 다양한 요청에 대한 유연한 라우팅과 응답 처리가 가능합니다.

Express의 주요 특징으로는 다음과 같습니다:

  • 경량성과 빠른 성능
  • 미들웨어를 통한 확장 가능성
  • RESTful API 구축을 위한 사용 용이성
  • 다양한 데이터 포맷 지원 (JSON, XML 등)

2. MongoDB 소개

MongoDB는 비관계형(NoSQL) 데이터베이스로, 유연한 데이터 모델링을 지원합니다. JSON과 유사한 BSON(Binary JSON) 형식으로 데이터를 저장하기 때문에, 객체 지향 프로그래밍에 친숙한 개발자들에게 인기가 많습니다. MongoDB는 스케일 아웃이 용이하고 대용량 데이터 저장에 적합한 특성을 가지고 있습니다.

MongoDB의 주요 특징은 다음과 같습니다:

  • 유연한 스키마: 데이터 구조를 사전에 정의할 필요 없이, 서로 다른 데이터 구조를 같은 컬렉션에 저장할 수 있습니다.
  • 수평 확장: 데이터 분산 및 복제를 통해 유연하게 데이터베이스 성능을 확장할 수 있습니다.
  • 강력한 쿼리 메커니즘: 다양한 쿼리 반환 기능을 지원하여 복잡한 데이터 검색이 가능합니다.

3. Mongoose란?

Mongoose는 MongoDB를 Node.js 애플리케이션과 연결하는 ODM(Object Data Modeling) 라이브러리입니다. Mongoose는 MongoDB의 데이터를 더 쉽게 다룰 수 있도록 스키마 기반 모델링을 제공합니다. 이를 통해 데이터의 구조를 정의하고, 유효성 검사, 쿼리 빌더와 같은 기능을 사용할 수 있습니다. Mongoose를 사용하면 MongoDB의 모든 기능을 효율적으로 활용할 수 있습니다.

Mongoose의 주요 기능은 다음과 같습니다:

  • 스키마 정의: CRUD 작업에 필요한 데이터 구조를 명확히 정의할 수 있습니다.
  • 미들웨어: 데이터 저장 또는 업데이트 전에 실행되는 전/후처리기를 작성할 수 있습니다.
  • 내장 유효성 검사: 데이터 저장 시 유효성을 검사할 수 있습니다.

4. Express 서버 준비하기

이제 Express 서버를 구축해 보겠습니다. 먼저 Node.js가 설치되어 있어야 합니다. 아래와 같이 프로젝트를 생성하고 필요한 패키지를 설치합니다.

mkdir express-mongo-example
cd express-mongo-example
npm init -y
npm install express mongoose body-parser

이제 간단한 Express 서버를 만들어 보겠습니다. server.js 파일을 생성하고 다음 코드를 작성합니다.

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');

const app = express();
app.use(bodyParser.json());

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

app.get('/', (req, res) => {
    res.send('Express 서버가 실행 중입니다.');
});

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

위 코드를 실행하기 위해 아래 명령어를 터미널에 입력합니다.

node server.js

브라우저에서 http://localhost:3000을 입력하면 “Express 서버가 실행 중입니다.”라는 메시지를 확인할 수 있습니다.

5. MongoDB 연동하기

Mongoose를 사용하여 MongoDB에 연결하고, 데이터 모델을 정의해 보겠습니다. models 폴더를 생성하고, 그 안에 User.js 파일을 생성합니다. 다음과 같이 사용자 모델을 정의합니다.

const mongoose = require('mongoose');

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

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

이제 server.js 파일에서 위 모델을 불러와서 사용할 수 있습니다.

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

MongoDB에 데이터 삽입을 위한 API를 추가해 보겠습니다. POST /api/users 엔드포인트를 만들고, 사용자 데이터를 수신하여 데이터베이스에 저장합니다.

app.post('/api/users', (req, res) => {
    const user = new User(req.body);
    user.save()
        .then(() => res.status(201).send('사용자 생성 완료.'))
        .catch(err => res.status(400).send('사용자 생성 실패: ' + err.message));
});

위 코드를 통해 클라이언트에서 전송한 JSON 데이터를 MongoDB에 저장할 수 있습니다. 이제 Postman 또는 Curl을 사용하여 테스트해 볼 수 있습니다.

6. CRUD 기능 구현하기

이제 MongoDB와의 연동이 완료되었으므로, Complete CRUD(생성, 조회, 수정, 삭제) 기능을 구현해 보겠습니다.

6.1 Create

위에서 이미 POST /api/users API를 구현했습니다. 이제 사용자 생성을 위해 JSON 데이터를 전송하면 됩니다.

6.2 Read

사용자 데이터를 조회하는 API를 생성하겠습니다. GET /api/users 엔드포인트를 추가하여 모든 사용자 데이터를 가져오는 기능을 구현해 보겠습니다.

app.get('/api/users', (req, res) => {
    User.find()
        .then(users => res.status(200).json(users))
        .catch(err => res.status(500).send('사용자 조회 실패: ' + err.message));
});

6.3 Update

특정 사용자의 정보를 수정할 수 있는 PUT /api/users/:id 엔드포인트를 추가합니다.

app.put('/api/users/:id', (req, res) => {
    User.findByIdAndUpdate(req.params.id, req.body, { new: true })
        .then(updatedUser => res.status(200).json(updatedUser))
        .catch(err => res.status(400).send('사용자 수정 실패: ' + err.message));
});

6.4 Delete

사용자를 삭제하는 DELETE /api/users/:id 엔드포인트를 추가합니다.

app.delete('/api/users/:id', (req, res) => {
    User.findByIdAndDelete(req.params.id)
        .then(() => res.status(200).send('사용자 삭제 완료.'))
        .catch(err => res.status(400).send('사용자 삭제 실패: ' + err.message));
});

7. 결론

이 강좌를 통해 Express.js와 Mongoose를 사용하여 MongoDB에 데이터베이스 연동하는 방법을 배웠습니다. 우리는 기본적인 CRUD 기능을 모두 구현하였으며, 이러한 기능을 기반으로 더 복잡한 애플리케이션을 개발할 수 있습니다. 추가적으로 환경변수 설정, 에러 핸들링, 사용자 인증 등을 고려한다면 더 완벽한 애플리케이션을 개발할 수 있을 것입니다. Express와 MongoDB의 조합은 많은 웹 애플리케이션에서 매우 유용하게 사용되므로, 이 기술 스택에 대해 지속적으로 연구하고 실습하는 것을 추천드립니다.