본문 바로가기

JavaScript/Node JS

Java Script(18)-Mongoose

*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*

1. Mongoose

- Node.js와 MongoDB를 위한 ODM(Object Data Mapping) 라이브러리
- Javascript Object와 MongoDB의 데이터를 Mapping하여 호환성을 만들어내고, 간편한 CRUD를 가능

몽구스를 사용하는 이유: 몽고db를 사용하는 것보다, 지원하는 메서드가 많아서 데이터처리가 많다. schema를 생성할 수 있어서, 속도가 빠름, schema가 데이터가 들어가는 규격 생성-> 몽고db에 schema 적용

궁극적으로 schema틀 만들고 모듈적용하기

// mongoose 설치하기
npm i mongoose

auth폴더를 postman으로 미들웨어 요청방식이 작동하는지 확인하기: 

// db > database.js 파일
import { config } from '../config.js';
import Mongoose from 'mongoose';

let db;

export async function connectDB(){
    return Mongoose.connect(config.db.host);
}

export function useVirtualId(schema) {
    schema.virtual('id').get(function(){
        return this._id.toString();
    });
    schema.set('toJSN', {virtuals:true});
    schema.set('toObject', {virtuals:true});
}

export function getUsers(){
    return db.collection('users');
}

export function getTweets(){
    return db.collection('tweets');
}
// data > auth.js 파일
import Mongoose from 'mongoose';
import { useVirtualId } from '../db/database.js';

const userSchema = new Mongoose.Schema({
    username: {type: String, require: true},
    name: {type: String, require: true},
    email: {type: String, require: true},
    password: {type: String, require: true},
    url: String
});

useVirtualId(userSchema);

const User = Mongoose.model('User', userSchema);

// const ObjectID = MongoDB.ObjectId;

// 아이디(username) 중복검사
export async function findByUsername(username){
    return User.findOne({username});
}

// id 중복검사
export async function findById(id){
    return User.findById(id);
}

// user객체 생성
export async function createUser(user){
    return new User(user).save().then((data)=> data.id);
}

// export async function login(username){
//     const user = users.find((user) => user.username === username)
//     return user;
// }

function mapOptionalUser(user){
    return user ? { ...user, id: user._id.toString() } : user;
}
// app.js 파일
import express from "express";
import morgan from "morgan";
import tweetsRouter from './router/tweets.js';
import authRouter from './router/auth.js';
import { config } from "./config.js";
import { connectDB } from "./db/database.js";

const app = express();

app.use(express.json());
app.use(morgan("dev"));

app.use('/tweets', tweetsRouter);
app.use('/auth', authRouter);

app.use((req, res, next) => {
    res.sendStatus(404);
});

// DB 연결 테스트!
connectDB().then((db) => {
    console.log('몽구스를 사용하여 몽고디비에 접속 성공!')
    app.listen(config.host.port);
}).catch(console.error);

psotman으로 signup 데이터 입력
login 확인
조회 확인

postman에서 tweets폴더로 DB를 새로 생성합니다.

// data > tweet.js 파일
import Mongoose from 'mongoose';
import { useVirtualId } from '../db/database.js';
import * as authRepository from './auth.js';

const tweetSchema = new Mongoose.Schema({
    text: {type: String, require: true},
    userId: {type: String, require:true},
    name: {type: String, require:true},
    username: {type: String, require:true},
    url: String
}, {timestamps: true});

useVirtualId(tweetSchema);
const Tweet = Mongoose.model('Tweet',tweetSchema);

// 모든 트윗을 리턴
export async function getAll() {
    return Tweet.find().sort({createdAt: -1});
}

// 해당 아이디에 대한 트윗을 리턴
export async function getAllByUsername(username){
    return Tweet.find({username}).sort({createdAt:-1});
}

// 글번호에 대한 트윗을 리턴
export async function getById(id){
    return Tweet.findById(id);
}

// 트윗을 작성
export async function create(text, userId){
    return authRepository.findById(userId).then((user) => new Tweet({
        text, userId, name: user.name, username: user.username, url: user.url
    }).save())
}

// 트윗을 변경
export async function update(id, text){
    return Tweet.findByIdAndUpdate(id, {text}, {returnDocument: "after"});
}

// 트윗을 삭제
export async function remove(id){
    return Tweet.findByIdAndDelete(id);
}

test.tweets DB생성
MongoDB로 확인
조회
Objectid로 조회
ObjectId 변경
삭제
삭제확인