[Project]MongoDB 설정하기

harin·2024년 10월 16일
post-thumbnail

MVC 패턴을 기반으로 데이터베이스 세팅을 해봅시댜


1. MongoDB 스키마 정의

models/Character.js

const mongoose = require('mongoose');

// 캐릭터 스키마 정의
const CharacterSchema = new mongoose.Schema({
    id: { type: Number, required: true },
    name: { type: String, required: true },
    characteristic: { type: String, required: true },
    signature: { type: String, required: true },
    series: { type: String, required: true },
    image: { type: String, required: true },
    type: { type: String, required: true }
});

// 모델 생성
const Character = mongoose.model('Character', CharacterSchema);

module.exports = Character;

MongoDB에 저장될 데이터들을 정의하는 모델 파일로, 나는 아이디, 이름, 특징, 시그니처, 시리즈. 이미지, 타입 등이 들어가는 데이터를 준비했기 때문에 위와 같이 작성했다.

2. 비지니스 로직 처리 (Controller)

controllers/characterController.js

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

// 모든 캐릭터 데이터 조회
const getAllCharacters = async (req, res) => {
    try {
        const characters = await Character.find();
        res.status(200).json(characters);
    } catch (error) {
        res.status(500).json({ message: '데이터 조회 실패: ' + error });
    }
};

// 데이터베이스에 JSON 데이터 삽입 (한 번만 사용)
const insertInitialData = async (req, res) => {
    const jsonData = [
        // 초기 데이터를 넣어요!!!
    ];
    try {
        const count = await Character.countDocuments();
        if (count === 0) {
            await Character.insertMany(jsonData);
            res.status(201).json({ message: '데이터 삽입 완료!' });
        } else {
            res.status(200).json({ message: '이미 데이터가 존재합니다.' });
        }
    } catch (error) {
        res.status(500).json({ message: '데이터 삽입 실패: ' + error });
    }
};

module.exports = {
    getAllCharacters,
    insertInitialData
};

데이터베이스를 조회하거나, 삽입하는 작업을 처리하는 함수를 작성

3. 라우트 설정

routes/characters.js

const express = require('express');
const router = express.Router();
const { getAllCharacters, insertInitialData } = require('../controllers/characterController');

// 모든 캐릭터 가져오기
router.get('/characters', getAllCharacters);

// 초기 데이터 삽입 (필요시 호출)
router.get('/init-data', insertInitialData);


module.exports = router;

API 엔드포인트를 작성!

4. 서버 설정 및 MongoDB 연결

server.js

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
require('dotenv').config();

// Express 앱 생성
const app = express();

// 미들웨어 설정
app.use(cors());
app.use(express.json());

// 라우트 불러오기
const characterRoutes = require('./routes/characters');
app.use('/api', characterRoutes);

// 정적 파일 제공 설정 (images 폴더)
app.use('/images', express.static(path.join(__dirname, 'images')));

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

// 서버 실행
const PORT = process.env.PORT || 3002;
app.listen(PORT, () => {
  console.log(`서버가 http://localhost:${PORT} 에서 실행 중입니다.`);
});

이렇게 작성하면 이제
api/init-data로 들어가면 controller에서 작성했던 초기 데이터들이 데이터베이스로 삽입되고, api/characters로 들어가면 데이터 조회를 할 수 있게 된다!

참고로 이미지 파일을 어떻게 관리하고 데이터베이스에 넣는지 몰라서 backend 폴더 안에 images 폴더를 만들고, 그 안에 이미지를 넣은 후, server.js 에서

// 정적 파일 제공 설정 (images 폴더)
app.use('/images', express.static(path.join(__dirname, 'images')));

를 작성하고 초기 데이터에서 "image": '/images/aloneping.png', 이런식으로 작성하였다.

그리고 위의 MongoDB 연결 부분에서도 process.env.MONGO_URL을 사용하여 내 정보가 코드에 노출되지 않도록 하였다!

이렇게 해서 npm start를 한 뒤, localhost:3002/api/init-data를 하면 데이터가 삽입 되고, (MongoDB Compass에서 확인 가능!) /api/characters를 하면 조회도 가능하다!

우선 기본적인 데이터베이스 세팅 완료!!

이제 다음 단계는 프론트 서버로 넘어가서 UI를 꾸며볼 계획이다.

0개의 댓글