글 작성자: 망고좋아
반응형

🎯 Express.js + Mongoose ODM

  • Express.js는 프로젝트 구조를 자유롭게 구성할 수 있기 때문에 어느 부분에 Mongoose ODM을 위치시키면 좋을지 적절한 위치를 결정하는 것이 중요하다.
  • 일반적으로 models 디렉터리에 Schema와 Model을 같이 위치한다.
  • app 객체는 애플리케이션 시작을 의미하는 부분이므로 해당 부분에 데이터베이스 연결을 명시하는 mongoose.connect를 위치해준다.

 

📝 Mongoose ODM 커넥션 이벤트

  • Express.js 애플리케이션은 종료되지 않고 동작하기 때문에 계속해서 데이터베이스가 정상적으로 동작하는지를 파악하기 위해 동작 중에 발생하는 데이터베이스 연결 관련 이벤트에 대한 처리를 하는 것이 좋다.
  • 즉, DB가 살아있는지 파악하는 게 중요하다. ⇒ 로그로 남겨 놓는 것이 중요하다.
mongoose.connect('----');

mongoose.connection.on('connected', () => {
});

mongoose.connection.on('disconnected', () => {
});

mongoose.connection.on('reconnected', () => {
});

mongoose.connection.on('reconnectFailed', () => {
});
  • connected : 연결 완료
  • disconnected : 연결이 끊김
  • reconnected : 재연결 완료
  • reconnectFailed : 재연결 시도 횟수 초과

 

📝 실습 :: Mongoose ODM 커넥션 이벤트

🛠 index.js

const express = require('express');
const mongoose = require('mongoose');

// 라우처 추가
const postsRouter = require('./routes/posts');

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

// DB 연결
mongoose.connect("mongodb://localhost:27017/exam_7");

// 커넥션 관리 이벤트 :: 연결 확인 log
mongoose.connection.on("connected", () => {
  console.log("Successfully connected to MongoDB");
})

app.get('/', (req, res) => {
  res.send("OK");
});

// 라우터 이동
app.use('/posts', postsRouter);

app.listen(8080);

 

🛠 /routes/posts.js

const { Router } = require('express');
const { Post } = require('../models'); // model load
const { pickRandomWord } = require('../utils/random-word');

// 라우터 선언
const router = Router();

// /generate 경로
router.get('/generate', async (req, res, next) => {
  const title = pickRandomWord(); //랜덤한 문자열 저장
  const content= pickRandomWord();

  try {
    // Create
    const post = await Post.create({
      title,
      content,
    });

    res.json(post);
  } catch(err) {
    next(err);
  }
});

// /posts 경로
router.get('/', async (req, res, next) => {
  try {
    // Post에서 검색을 해서 posts에 저장
    const posts = await Post.find({});

    //  posts에 저장된 내용을 json으로 보내주기
    res.json(posts); 
  } catch(err) {
    next(err);
  }
});

module.exports = router;

 

🛠 /models/schemas/post.js

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

const PostSchema = new Schema({
  title: {
    type: String,
    required: true,
  },
  content: {
    type: String,
    required: true,
  },
}, {
  timestamps: true,
})

module.exports = PostSchema;

 

🛠 /models/index.js

const mongoose = require('mongoose');
const PostSchema = require('./schemas/post');

exports.Post = mongoose.model('Post', PostSchema);

 

🛠 /utils/random-word.js

const randomWords = [
  '안녕하세요', '반갑습니다', '오히려 좋아', 'express', '재밌다',
  'Node.js', '즐겁다', '좋아요', '날씨가', 'MongoDB', '너무 쉽다.',
  'elice.io', 'javascript', '배고파요', '심심해요', '치킨을 좋아해요', 
];

const pickRandomWord = () => {
  randomWords
}

exports.pickRandomWord = () => {
  const index = Math.floor(Math.random() * randomWords.length);
  return randomWords[index];
}
반응형