본문 바로가기

2. MySQL | MongoDB

5/15(월) IT K-DT(52일차) / Mongoose

 

 

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에서 확인