[TIL] MongoDB - The Complete Developer's Guide 2025 (유데미)
8년 전에 개발한 시스템을 아직 회사에선 열심히 쓰고 있고, mongodb 데이터가 많아서 버벅거립니다. 그걸 해결하기 위해 담당자는 데이터를 쪼갠다고 합니다. (컬렉션을 나누는 건데, 그렇게 하더라도 로직 변경은 필수더군요.) 근본적인 해결책이 있었으면 좋을 것 같아서 mongodb 공부를 하기 시작했습니다.
https://www.udemy.com/course/mongodb-the-complete-developers-guide/
유데미에서 가장 평점이 좋고 수강생이 많은 강의를 선택했습니다. 이 강의도 역시 maximilian 선생이네요. 웹 개발 관련한 강의에서는 이 사람이 지분이 큰 강사입니다.
mongodb 가 중심이 되는 강의라서 대부분의 내용은 mongosh 커맨드라인으로 진행합니다. 재미있던 대목들은 다음과 같습니다.
find() 에서 사용하는 각종 operator ($regex, $expr, $elemMatch, $slice)
인덱스를 만드는 다양한 옵션 (partial, expireAfter) 과 텍스트 인덱스
GeoJSON 지리 데이터에 대한 $near, $geoWithin, $geoIntersects 등의 사용
aggregation framework ($match, $sort, $group, $project) 의 사용
이걸 공부하고 나면 react 프런트 + express 백엔드인 앱으로 mongodb에 데이터를 저장하고 로그인 처리하는 실습을 하는데 이 부분이 다른 강의에서 mongodb를 사용하던 것과 다른 느낌입니다. 뭔가 알고 하는 느낌이 드네요. mongosh 가 기본적으로 javascript 환경이라서 아주 자연스럽게 node 로 연결됩니다.
p.s)
자연스럽게 express 미들웨어 개념을 가져다 쓰게 되기도 했네요.
다음과 같이 app.js 초반에 req 에서 db 변수를 쓸수 있게 해 둔 후,
// mongodb 미들웨어
app.use(async (req, res, next) => {
try {
req.db = await connectDB(); // 모든 req 에 db 변수를 제공한다
next();
} catch (error) {
next(error);
}
})라우트 핸들러들은 req.db를 통해 mongodb 컬렉션에 접근할 수 있습니다.
즉, 각각의 js 파일에서 require(‘mongodb’)를 할 필요가 없습니다.
// Get single product
router.get("/:id", (req, res, next) => {
req.db.collection("products").findOne({_id: new ObjectId(req.params.id)})
.then((product) => {
if (!product) {
res.status(404).json({ message: "Product not found." });
} else {
res.json ({
_id: product._id.toString(),
name: product.name,
description: product.description,
price: product.price.toString(), // Convert Decimal128 to string for JSON serialization
image: product.image,
})
}
})
.catch((err) => {
console.error(err);
res.status(500).json({ message: "An error occurred while fetching the product." });
});
});