데이터시각화-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;