Web Dev/ELICE

30 :: MongoDB, No SQL, Mongoose, Express + MongoDB

HJPlumtree 2021. 12. 4. 10:07

엘리스 SW 엔지니어 트랙 30일차

온라인 강의날

 

 

MongoDB와 Mongoose

풀스택 개발자가 되어야지 했을 때

배워야지 하는 스킬의 마지막 녀석은

MongoDB였다 벌써 여기까지왔다

이 전까지 내용도 확실치 않지만

뭘 어떻게 숙련시킬지 감은 온다

 

 

MongoDB

대표적인 NoSQL, Document DB

huMONGOus에서 만든 말

엄청나게 큰 DB라는 의미 => 대용량 데이터 처리하기 좋게 만들어짐

 

 

No SQL vs RDB

RDB

관계형 데이터

데이터 구조화

 

Non SQL | Not Only SQL

구조화된 질이어 사용 안하는 데이터베이스

자료 간의 관계 초점 X

데이터 구조화하지 않고, 유연하게 저장

 

 

NoSQL 사용 이유

SQL

데이터 구조화 하는 것이 필수

DDL 이용이 필수

BUT 스키마에 정의된 데이터가 아니면 저장할 수 없는 제약

 

NoSQL

사전작업 없이 데이터베이스 사용 가능

=> 데이터베이스 작업에 크게 관여없이 프로젝트 빠르게 진행 가능

 

MongoDB

  • Database
    하나 이상의 Collection 갖는 저장소
    SQL에서 database와 유사

  • Collection
    하나 이상의 Document 저장
    SQL table과 유사하지만 Document 구조 정의 X

  • Document
    저장되는 자료
    SQL row와 유사하지만 구조제약 없이 유연하게 저장
    JSON과 유사한 BSON 사용 다양한 자료형 지원

    Document - ObjectID
    유일한 키 값 ObjectID 갖는다
    SQL primary key 유사
    document 생성시 자동 생성됨

 

 

사용 방법

직접 설치

귀찮지만, 얼마든지 데이터 사용가능

직접 모든데이터 관련 설정 필요

Sharding이나 Replication 등 작업에 운영지식 필요

무료로 사용할 수 있는 Community Version 제공

 

Cloud

쉽고 빠르지만, 쓰는만큼 요금

모든 데이터베이스 관련 웹에서 관리

특별한 노하우 없이 데이터베이스 운용 가능

 

 

MongoDB Compass

Database, Collection, Document 시각화 관리 가능

MySQL Workbench와 유사

 

 

MongoDB 설치

여기서 직접 or Cloud로 사용 가능

MongoDB 링크 => https://mongodb.com/

 

 

Mongoose ODM

ODM(Object Data Modelling)

데이터를 오브젝트로 모델화해서 관리

Collection에 집중해서 관리

Collection 모델화, 관련 기능들을 쉽게 사용할 수 있도록 도와준다

 

 

Mongoose 사용 이유

1. 데이터베이스 연결상태 관리

MongoDB 기본 Node.js 드라이버 연결상태 관리 어렵다

Mongoose 사용하면 간단하게 데이터베이스와 연결상태 관리

 

2. 스키마 관리

스키마 정의하지 않고 사용하는게 No SQL 장점이지만,

데이터 형식 미리 정의해야 코드 작성과 프로젝트 관리에 유용

Code-level에서 스키마 정의하고 관리할 수 있게 해준다

 

3. Popluate

MongoDB 기본적으로 Join 제공 X

Join과 유사한 기능 aggregate있지만, 복잡한 쿼리

Mongoose에서 populate으로 간단하게 구현

 

 

Mongoose 사용 방법

1. 스키마 정의

2. 모델 만들기

3. 데이터베이스 연결

4. 모델 사용

 

스키마(Schema)
타입스크립트에서 타입을 정해주는 것처럼 보인다

 

 

간단한 CRUD - CREATE

create

Document 생성

생성된 Document 반환

 

 

간단한 CRUD - READ

find(query), findOne(query), findById(id)

Document 검색

 

Query
where과 비슷한 조건절
BSON 형식

Mongoose는 쿼리 값으로 배열이 주어지면 $in 쿼리 생성

다양한 Query Operator 확인 가능

MongoDB 링크 => https://docs.mongodb.com/manual/tutorial/query-documents/

 

간단한 CRUD - UPDATE

updateOne, updateMany

업데이트 결과 리턴

 

findByIdAndUpdate, findOneAndUpdate

검색된 결과에 업데이트 반영해서 반환

 

Document 수정

기본적으로 $set operator 사용 => Document 통째로 변경하지 않는다

 

 

간단한 CRUD - DELETE

document 삭제

 

deleteOne, deleteMany

삭제 결과 리턴

 

findOneAndDelete, findByIdAndDelete

find된 검색 결과 삭제해서 반환

 

 

populate

유용한 기능이라는데 아직 이해 안되네

 

스키마 생성 예시

 

author: {
    type: Schema.Types.ObjectId,
    required: true,
    // 모델의 이름 들어간다
    ref: 'User'
 }

 

 

Express.js + Mongoose ODM

어느 부분에 Mongoose ODM 위치시킬지 정하는게 중요

일반적으로 models 디렉터리에 Schema와 Model 같이 위치

 

app 객체 부분에 데이터베이스 연결하는

mongoose.connect 위치

추천 내용 특별한 규정 없다

 

Express.js 동작 중

데이터베이스가 연결이 잘 되고 있는지 확인 하는게 좋다

연결 관련 이벤트에 대한 처리

 

 

MongoDB 외 다른 DB

Sequelize ORM

ORM

Object Relational Mapping

RDBMS 이용하는 간단한 방법

 

ODM은 모델에 집중

ORM은 테이블 관계, 쿼리 등 기능 단순화 용도

 

Mongoose는 MongoDB만 연결 가능하지만,

MySQL, PostgreSQL, SQLite 등 다양한 RDBMS 연결 가능

 

헷깔리니까 Suquelize ORM은 사용전에 까먹자

 

RDB를 Node.js 프로젝트에 사용할 때 Sequlize ORM 고려