Mongoose (Basic)

공부의 기록·2022년 3월 22일
0

DB MongoDB

목록 보기
4/5
post-thumbnail

Introduce

본 문서는 2022년 3월 22일 에 작성되었습니다.

Mongoose 는 ODM(Object Document Mapper) 라이브러리입니다.
Application 과 MongoDB 를 메서드의 형태로 편하게 연결해주는 기능을 담당합니다.

이를 위해서 먼저, Application 프레임워크를 결정해야합니다.
가장 쉽고 대중적인 Exrpess 를 사용하였으며, 프로젝트 스텍은 다음과 같았습니다.

# Program

  1. Node.js 14.17.3 LTS
  2. Npm 6.14.13
  3. MongoDB Atlas 5.0.6 Enterprise
  4. MongoDB Atlas Network AWS Seoul(ap-northeast-2)
  5. MongoDB Atlas Cluster M0 Sandbox(General)
  6. MongoDB Compass Version 1.30.1

# Modules

  1. Express 4.17.3
  2. Mongoose 6.2.7

# Project

작성 시점에 진행했던 연습용 프로젝트는 Express with MongoDB 입니다.
자세한 내용은 해당 저장소의 README.md 를 확인해주세요.


Thoery

본 문서와 함께한 프로젝트는 RESTful API 를 기준으로 하고 있습니다.
더 자세한 내용을 원하시면 Velog - unchaptered / Dev 컴퓨터 상식 > REST API 을 참고해주세요.

CRUD 란?

Create, Read, Update, Delete 의 4가지 메서드를 의미힙나디ㅏ.

여기서 메서드란,
클라이언트가 브라우저를 이용해서 서버에 Request 를 보낼 때,
동봉하게 되는 정보 객체의 headers 안의 mehotd 값을 의미합니다.

RESTful API 란?

CRUD 에 맞춰서 백앤드 API 를 설계한 것을 RESTful API 혹은 RESTful Server 라고 합니다.

여기서 REST 라는 것은,
Representational state tranfer, 대표 상태 전송을 의미하며,
클라이언트가 서버에 보내는 정보의 Method 값을 의미합니다.

즉,
다음과 같이 CRUD 맞춰 설계된 API를 RESTful API 라고 할 수 있을 것입니다.

GET /user 로그인
POST /user 회원가입

GET /user/:_id 회원정보 보기
PUT /user/:_id 회원정보 수정
DELETE /user/:_id 회원탈퇴


Mongoose

본문의 내용은 Mongoose API 을 참고하였으며,
동시에 자주 사용하는 몇몇 메서드만을 한정적으로 다루고 있습니다.

가끔 사용하거나 세부적인 내용은 그때끄떄 Mongoose API 나 구글링을 활용합니다.

GET, POST, PUT, DELETE 등으로 DB 에 접속을 하면 비동기 처리(async await)를 해주어야 한다.

ObjectId

MongoDB 는 해시화된 Index 용 ObjectId 를 자동으로 만들어줍니다.
해당 내용은 하기 게시글 MongoDB 이해하기 을 참고해주세요.

Shcema, Model

여기서 다룰 userModel 은 다음과 같이 구성되어 있습니다.

import mongoose from "mongoose";

const userSchema = new mongoose.Schema({
    email: { type:String, required:true, unique:true },
    password: { type:String, required:true },
    age:Number
}, { timestamps:true });

// timestamp 옵션은 처음 데이터를 생성했을 떄 createAt, 수정했을 때 updateAt 을 최신화

export default userModel = mongoose.model('User', userSchema);

POST / Create

POST Method, Create 는 다음의 2 경우가 존재한다

  1. new userModel().save();
  2. userModel.create();

1번 방법은 userModel 을 만들고 이를 저장하는 것이고
2번 방법은 userModel 기반으로 DB 에 바로 생성하는 것이다.

두 방법은 큰 차이가 없다.

GET / Read

GET Method, Read 는 다음의 경우가 존재한다.

  1. userModel.findById({ _id:ObjectId("대충 문자열 블라블라") });
  2. userModel.findOne({ key:"value" });
  3. 그 외에도 매우 많음

SQL 처럼 select 를 통해서 IO를 제한하거나, 정규표현식을 사용할 수 있다.

PUT / Update

PUT Method, Update 는 다음의 경우가 존재한다.

  1. const user = userModel.findById({ _id:ObjectId("대충 문자열 블라블라") });
    user.save();
  2. userModel.findByIdAndUpdate( "대충 문자열 블라블라", { key:"value" });

1번의 경우 DB 를 2회 호출하기 떄문에 2번이 좋아보인다.
하지만, ObjectId 가 없을 때나, 비밀번호 등의 비교를 해야 할 때는 어쩔 수 없는 경우도 있다.

DELETE / Delete

DELETE Method, Delete 는 다음의 경우가 존재한다.

  1. userModel.deleteOne({ key:"value" });
  2. userModel.findByIdAndDelete(_id);

Mongoose Relation

유저가 게시글을 작성하는 것 이라는 요구사항을
Mongoose 가 이루는 방식은 간단하게 2가지가 존재합니다.

  1. postSchema 를 만들고 userSchema 와 연결
  2. userSchema 안에 document 로 추가

postSchema <-> userSchema

// userSchame 안에 아래의 코드 삽입
postLists: [{ type:mongoose.Schema.Types.ObjectId, ref: "Post" }],

위와 같은 코드를 userSchema 안에 사용하고 실제로 JOIN 하는 방법은 populate 메서드를 사용합니다.

userModel.findById({ _id:"대충 문자열 블라블라" }).popualte("postLists");

post in userSchema

그냥 json 형태로 파싱한 이후, 넣어주면 됩니다.

profile
2022년 12월 9일 부터 노션 페이지에서 작성을 이어가고 있습니다.

0개의 댓글