안녕하세요

MongoDB 모델, controller, router 모듈화 하기 본문

데이터시각화-KMG/MongoDB

MongoDB 모델, controller, router 모듈화 하기

sakuraop 2023. 8. 10. 03:14

서버 파일이 너무 길어져버렸습니다. 코드 정리 방법을 찾을 때가 왔습니다.


1) 우선 스키마와 모델의 모듈화를 합니다.

server.js

아래와 같이 스키마를 정의하고 User를 User Collection에 연결하였습니다.

 
// MongoDB 연결 설정
mongoose
  .connect(mongoURI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  })
  .then(() => {
    console.log("MongoDB에 연결되었습니다.");
  })
  .catch((error) => {
    console.error("MongoDB 연결에 실패했습니다.", error);
  });

// Post 모델 스키마 정의
const postSchema = new mongoose.Schema({
  postId: { type: Number, required: true, unique: true },
  userId: { type: String, required: true },
  nickname: { type: String, required: true },
  title: { type: String, required: true },
  content: { type: String, required: true },
  createdAt: { type: String, default: Date.now().toLocaleString("ko-KR") },
  isPrivate: { type: Boolean, default: false },
});

const Post = mongoose.model("Post", postSchema);
 

 

models를 모아둘 폴더를 만들고 각 모델을 export 해주기 위한 파일을 생성합니다.

 

Post.js 

아래와 같이 스키마와 Post를 그대로 가져와 선언한 뒤 exports 해주면 됩니다.

 
const mongoose = require("mongoose");

const postSchema = new mongoose.Schema({
  postId: { type: Number, required: true, unique: true },
  userId: { type: String, required: true },
  nickname: { type: String, required: true },
  title: { type: String, required: true },
  content: { type: String, required: true },
  createdAt: { type: String, default: Date.now().toLocaleString("ko-KR") },
  isPrivate: { type: Boolean, default: false },
});

const Post = mongoose.model("Post", postSchema);

module.exports = Post;
 

2) Controller를 모듈화합니다

아래와 같이 Controller를 모아둘 폴더를 만들었습니다.

 

viewComment.js

모듈화한 Comment 모델을 import 하여 아래와 같이 요청을 함수로 만듭니다. 

 
const Comment = require("../../models/Comment");

const viewComments = async (req, res) => {
  console.log(req.path);
  try {
    const { postId } = req.params;
    const comments = await Comment.find({ postId });

    if (!comments) {
      return res.status(404).json({ message: "댓글을 찾을 수 없습니다." });
    }

    res.status(200).json(comments);
  } catch (error) {
    console.error(error);
    res.status(500).json({ message: "서버 에러" });
  }
};

module.exports = viewComments;
 

3) Router를 모듈화합니다.

아래와 같이 Router를 기능별로 모아둘 폴더를 만들었습니다. 

PostRouter.js

아래와 같이 viewConmments controller를 import하고,
api 주소를 작성한 뒤,
postRouter를 export 해줍니다.

 
const express = require("express");
const viewComments = require("../controllers/postController/viewComments");
const postRouter = express.Router();

postRouter.get("/:postId/comments", viewComments);

module.exports = postRouter;
 

4) postRouter를 미들웨어로 만듭니다. 

server.js

예를 들어 /api/posts/:postId/comments 로 api 요청이 오게 되면,

postRouter를 거쳐, viewComments 함수를 실행하게 됩니다.

 

아래와 같이 여러 함수를 생성하여

/api/posts 로 오는 요청을 모아서 관리할 수 있게 되고, 코드의 관리가 용이해졌습니다.

 
const express = require("express");
const viewPosts = require("../controllers/postController/viewPosts");
const viewPost = require("../controllers/postController/viewPost");
const viewComments = require("../controllers/postController/viewComments");
const postRouter = express.Router();

postRouter.get("/", viewPosts);
postRouter.get("/:postId", viewPost);
postRouter.get("/:postId/comments", viewComments);

module.exports = postRouter;