본문 바로가기

Nodejs

MongoDB (2024-05-09)

MongoDB
- MongoDB NoSQL 데이터베이스로 문서 기반 데이터 저장 방식을 채택한 오픈소스 DBMS
- 관계형 데이터베이스와는 달리 스키마가 없으며, BSON(Binary JSON) 형태로 데이터를 저장 
- 유연성이 좋고, 대규모 데이터 처리에 용이

(스키마가 없다 -> 테이블 형태가 없다 / 골격이 없다)
(데이터의 형태가 제각각일 수 있다)

MongoDB Atlas
- MongoDB의 관리형 클라우드 데이터베이스 서비스
- MongoDB 데이터베이스를 클라우드에서 호스팅 하고 관리하는 것을 중심으로 하며, 개발자 및 기업이 손쉽게 어플리케이션을 빌드하고 배포할 수 있도록 지원

 

data > auth.js

더보기
import MongoDB from 'mongodb';
import { getUsers } from '../db/database.js';

const ObjectID = MongoDB.ObjectId;


// // 아이디(username) 중복검사
export async function findByUsername(username){
    return getUsers().find({username}).next().then(mapOtionalUser);
}

// id 중복검사
export async function findById(id){
    return getUsers().find({_id: new ObjectID(id)}).next().then(mapOtionalUser);
}

export async function createUser(user){
   return getUsers().insertOne(user).then((result )=> console.log(result.insertedId.toString()));
};

function mapOtionalUser(user){
    return user ? { ...user, id : user._id.toString()} : user;
}

 

data> tweet.js

더보기
import MongoDB from 'mongodb';
import { getUsers, getTweets } from '../db/database.js';
import * as authRepository from './auth.js';
import { Result } from 'express-validator';

const ObjectID = MongoDB.ObjectId;

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

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

// 글번호에 대한 트윗을 리턴
export async function getById(id){
    return getTweets().find({_id : new ObjectID(id)}).next().then(mapOptionalTweet);
}


// 트윗을 작성
export async function create(text, userId){
    return authRepository.findById(userId).then((user) => getTweets().insertOne(
        {
        text, 
        userId,
        username: user.username,
        url:user.url
        }
        )).then((result)=> getById(result.insertedId)).then(mapOptionalTweet);
}

// 트윗을 변경
export async function update(id, text){
    return getTweets().findOneAndUpdate({_id: new ObjectID(id)}, {$set: {text}}, {returnDocument: 'after'}).then((result) => result).then(mapOptionalTweet);
}

// 트윗을 삭제
export async function remove(id){
    return getTweets().deleteOne({_id : new ObjectID(id)});
};

function mapTweets(tweets){
    return tweets.map(mapOptionalTweet);
}

function mapOptionalTweet(tweet){
    return tweet ? { ...tweet, id: tweet.insertedId} : tweet;
}

 

db > database.js

더보기
import { config } from '../config.js';
import MongoDb from 'mongodb';

let db;

export async function connectDB(){
    return MongoDb.MongoClient.connect(config.db.host).then((client) => db = client.db()
    )
}

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

export function getTweets(){
    return db.collection('tweets');
}

 

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('몽고 db 연결')
    app.listen(config.host.port)
}).catch(console.error);

'Nodejs' 카테고리의 다른 글

Mongoose (2024-05-10)  (0) 2024.05.10
tweet, auth DB연결 (2024-05-08)  (0) 2024.05.08
Authentication (2024-05-02)  (0) 2024.05.02
과제 회원가입, 로그인 router, tweet 활용  (0) 2024.04.29
리팩토링, validation(2024-04-29)  (0) 2024.04.29