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 |