
Mongoose
Node.js 환경에서 MongoDB와 상호작용하기 위한 ODM (객체 데이터 모델링 도구).
MongoDB는 NoSQL 데이터베이스 시스템으로, Mongoose는 이를 더 쉽게 사용할 수 있도록 도와주는 역할.
Mongoose를 사용하면 JavaScript 객체와 MongoDB 문서 간의 매핑이 가능해지며
이를 통해 애플리케이션에서 MongoDB 데이터를 조작하고 쿼리할 수 있음.
데이터 유효성 검사, 쿼리 빌더, 미들웨어의 기능 및 비동기 작업의 처리를 목적으로 Promise나 콜백을 사용.
→ 개발자가 DB작업을 쉽게 관리할 수 있도록 도와줌.
사용방법
예) user테이블을 이용하여 'id'라는 가상의 스키마를 생성, 이 스키마를 이용한 CRUD 기능 구현
1. server를 디렉토리로 하여 설치
npm i mongoose

2. dotenv 파일에 DB의 HOST 경로를 설정
MongoDb에서의 경로로 지정.

.env
0.00MB
3. Server\db\database.js 수정
import Mongoose from 'mongoose'; import {config} from '../config.js'; let db; // dotenv를 경로로 하여 config.js를 통해 db를 mongoose로 connect함. export async function connectDB(){ return Mongoose.connect(config.db.host) }; // db의 형태로 client를 return. // users tb를 불러오기 export function getUsers(){ return db.collection('users'); } // tweets tb를 불러오기 export function getTweets(){ return db.collection('tweets'); } // schema를 이용해 useVirtualId함수를 통과하도록 함 export function useVirtualId(schema){ schema.virtual('id').get(function() { // virtual(): 가상의 key를 만들어주는 함수 return this._id.toString(); // _id를 문자열로 id로 변경하여 반환. }); schema.set('toJSON', {virtuals: true}) // virtual key를 사용하여 toJSON으로 schema를 출력할 예정. schema.set('toObject', {virtuals: true}) // 다룰때는 Object로 할 예정. } |
4. Server\data\auth.js 수정
import Mongoose from 'mongoose'; import {useVirtualId} from '../db/database.js' //mongoose로 collection에 저장된 형태를 만들 수 있음. const userSchema = new Mongoose .Schema({ username: {type:String, required:true}, name: {type:String, required:true}, email: {type:String, required:true}, password: {type:String, required:true}, url: String }); // useVirtualId 함수를 db에서 가져옴. useVirtualId(userSchema); const User = Mongoose .model('User', userSchema); // Users 라는 collection이 바로 위의 Schema의 형태에 따라 새롭게 생성될 예정. // User객체를 이용하여 username을 찾음 export async function findByUsername(username){ return User.findOne({username}); } // 새로운 User 생성 export async function createUser(user){ return new User(user).save().then((data)=>data.id); } // User를 이용하여 id를 찾음 export async function findById(id){ return User.findById(id); } |
5. Server\data\tweet.js 수정
import Mongoose from 'mongoose' import { useVirtualId} from '../db/database.js'; import * as UserRepository from './auth.js'; // auth.js의 UserSchema로 유저 목록 가져오기. const tweetSchema = new Mongoose.Schema({ text: {type: String, required: true}, userId: {type: String, required: true}, name: {type: String, required: true}, username: {type: String, required: true}, url: String, // JS는 마지막이 콤마(,)로 끝나도 상관없음. }, {timestamps: true } ) useVirtualId(tweetSchema ); const Tweet = Mongoose .model('Tweet', tweetSchema ) // 1) export async function getAll() { return Tweet .find().sort({credatedAt:-1}) // {createdAt:-1}: 생성시간에 따른 내림차순 정렬. 없으면 오름차순. } // 2) export async function getAllByUsername(username) { return Tweet .find({username}).sort({createdAt:-1}); } // 3) export async function getById(id) { return Tweet .findById(id); } // 4) export async function create(text, userId) { return UserRepository .findById(userId) .then((user)=>new Tweet ({ text: text, userId: userId, name: user.name, username: user.username }).save() ); } // 5) export async function update(id, text) { return Tweet .findByIdAndUpdate(id, {text}, {returnOriginal: false} // {returnOriginal: false}: 변경 전의 데이터를 return하지 않는다는 조건. ); } // 6) export async function remove(id) { return Tweet .findByIdAndDelete(id); } |
6. Postman에서 확인