관리 메뉴

정골라코딩

[JS] Node.js와 MongoDB III 본문

JavaScript

[JS] Node.js와 MongoDB III

정골라 2022. 10. 21. 15:29

MongoDB

 

-MongoDB란?

: 대표적인 NoSQL, Document DB

->Mongo는 Humongous에서 따온 말로, 엄청나게 큰 DB라는 의미

(대용량 데이터를 처리하기 좋게 만들어짐)

 

-RDB vs NoSQL

   RDB: Relational Database

  • 관계형 데이터베이스
  • 자료들의 관계를 주요하게 다룸.
  • SQL 질의어를 사용하기 위해 데이터를 구조화해야 함

   NoSQL: Non SQL 또는 Not Only SQL

  • 구조화된 질의어를 사용하지 않는 데이터베이스
  • 자료 간의 관계에 초점을 두지 않음
  • 데이터를 구조화하지 않고, 유연하게 저장함

-NoSQL 을 사용하는 이유

  • SQL 을 사용하기 위해서는 데이터를 구조화하는 것이 필수 (DDL) -> 스키마에 정의된 데이터가 아니면 저장할 수 없는 제약이 따름
  • NoSQL을 사용하면 사전작업 없이 데이터 베이스를 사용할 수 있음 -> 데이터베이스 작업에 크게 관여하지 않고 프로젝트를 빠르게 진행할 수 있음

-MySQL(RDB) vs MongoDB(NoSQL)

 

-NoSQL 과 Document DB

: NoSQL은 다양한 종류가 있지만, 대표적으로 자료를 Document(문서) 로 저장하는 Document DB가 일반적

(이 외에, key-value, Graph, large collection 등의 NoSQL DB가 존재)

 

-MongoDB 기본 개념

Database: 하나 이상의 collection을 가질 수 있는 저장소 (SQL에서 database와 유사)

Collection: 하나 이상의 Document가 저장되는 공간 (SQL 에서의 table과 유사)

                   -> 하지만, collection이 document의 구조를 정의하지 않음

Document: MongoDB에 저장되는 자료. (SQL 에서 row와 유사하지만 구조 제약 없이 유연하게 저장 가능)

                    *JSON과 유사한, BSON을 사용하여 다양한 자료형을 지원

Document-ObjectID: 각 document의 유일한 키 값, SQL의 primary key 와 유사. 하나씩 증가하는 값이 아닌 document를 생성할                                      때 자동으로 생성되는 값

                                   (*timestamp + random value + auto increament)

 

-MongoDB 사용 방법

  • MongoDB를 직접 설치하거나 Cloud 서비스를 사용할 수 있음
  • 직접 설치하면 귀찮고 어렵지만 원하는 만큼 얼마든지 데이터를 사용할 수 있음
  • Cloud를 사용하면 쉽고 빠르게 시작 가능하지만, 사용량에 따라 요금이 부과됨

Mongoose ODM

-Mongoose ODM 이란?

Object Data Modeling

   ~MongoDB의 Collection에 집중하여 관리하도록 도와주는 패키지

   ~Collection을 모델화하여, 관련 기능들을 쉽게 사용할 수 있도록 도와줌

 

-Mongoose ODM 을 사용하는 이유

연결관리

  • MongoDB의 기본 Node.js 드라이버는 연결 상태를 관리하기 어려움
  • Mongoose를 사용하면 간단하게 데이터베이스와의 연결 상태를 관리해줌

스키마 관리

  • 스키마를 정의하지 않고 데이터를 사용할 수 있는 것은 NoSQL의 장점이지만, 데이터 형식을 미리 정의해야 코드 작성과 프로젝트 관리에 유용함
  • Mongoose는 Code-Level에서 스키마를 정의하고 관리할 수 있게 해 줌

Populate

  • MongoDB는 기본적으로 join을 제공하지 않음
  • join과 유사한 기능을 사용하기 위해선 aggregate라는 복잡한 쿼리를 해야 하지만, Mongoose는 populate를 사용하여 간단하게 구현할 수 있음

Mongoose ODM 사용하기

-Mongoose ODM 사용 방법

Mongoose ODM 사용 순서

 

  1. 스키마 정의

 

 

Collection 에 저장될 Document의 스키마를 Code-Level에서 관리할 수 있도록 Schema를 작성할 수 있음

 

다양한 형식을 미리 지정하여, 생성, 수정 작업 시 데이터 형식을 체크해주는 기능을 제공함

 

timestamps 옵션을 사용하면 생성, 수정 시간을 자동으로 기록해 줌

 

 

 

 

  2. 모델 만들기

 

 

 

 

작성된 스키마를 mongoose에서 사용할 수 있는 모델로 만들어야 함.

 

모델의 이름을 지정하여 Populate 등에서 해당 이름으로 모델을 호출할 수 있음

 

 

 

 

 

  3. 데이터베이스 연결

 

 

 

Connect 함수를 이용하여 간단하게 데이터베이스에 연결할 수 있음.

 

mongoose는 자동으로 연결을 관리해 주어 직접 연결 상태를 체크하지 않아도 모델 사용 시 연결 상태를 확인하여 사용이 가능할 때 작업을 실행 함

 

 

 

 

 

  4. 모델 사용 

  작성된 모델을 이용하여 CRUD를 수행할 수 있음

 

    간단한 CRUD (CREATE)

 

 

Create 함수를 사용하여 Document 생성

 

Create 함수에는 Document Object나

-> 단일 Document 생성

 

Document Object의 Array 전달 가능

-> 복수 Document 생성

 

create 는 생성된 Document 를 반환해 줌

 

 

 

    간단한 CRUD (FIND-READ)

 

 

 

 

find 관련 함수를 사용하여 Document를 검색

 

query를 사용하여 검색하거나 findById를 사용하면 ObjectID로 Document를 검색할 수 있음

 

 

 

 

 

 

    Query

  • MongoDB에도 SQL의 where와 유사한 조건절 사용 가능
  • MongoDB의 query는 BSON 형식으로, 기본 문법 그대로 mongoose에서도 사용 가능

 

 

 

 

{key: value} 로 exact match

 

$lt, $lte, $gt, $gte 를 사용하여 range query 작성 가능

 

$in 을 사용하여 다중 값으로 검색

 

$or 를 사용하여 다중 조건 검색

 

 

 

 

*Mongoose ODM-$in

Mongoose는 쿼리 값으로 배열이 주어지면 자동으로 $in 쿼리를 생성해 줌

 

  간단한 CRUD (UPDATE)

 

 

 

 

update 관련 함수를 사용하여 Document를 수정

 

find ~함수들은 검색된 Document를 업데이트를 반영하여 반환해 줌

 

mongoose의 update는 기본적으로 $set operator를 사용하여, Document 를 통째로 변경하지 않음

 

 

 

 

    간단한 CRUD (DELETE)

 

 

 

 

 

delete 관련 함수를 사용하여 Document 삭제

 

find ~ 함수들은 검색된 Document를 반환해 줌

 

 

 

 

 

 

    Populate

 

 

 

 

Document 안에 Document 를 담지 않고 ObjectID를 가지고 reference 하여 사용할 수 있는 방법을 제공 함

 

Document에는 reference 되는 ObjectID를 담고, 사용할 때 populate 하여 하위 Document 처럼 사용할 수 있게 해 줌

 

 

 

 

 

Express.js + Mongoose ODM

-Express.js 에서 Mongoose ODM 사용하기

Express.js 는 프로젝트 구조를 자유롭게 구성할 수 있기 때문에 어느 부분에 Mongoose ODM 을 위치시키면 좋을지 적절한 위치를 결정하는 것이 중요

 

-Mongoose ODM 위치 정하기

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

app 객체는 어플리케이션 시작을 의미하는 부분이므로 해당 부분에 데이터베이스 연결을 명시하는 mongoose.connect 를 위치

 

-Mongoose ODM 커넥션 이벤트

Express.js 어플리케이션은 종료되지 않고 동작하기 때문에 계속해서 데이터베이스가 정상적으로 동작하는지를 파악하기 위해 동작 중에 발생하는 데이터베이스 연결 관련 이벤트에 대한 처리를 하는 것이 좋음

 

-Mongoose ODM 커넥션 이벤트

 

 

 

 

connected - 연결 완료

disconnected - 연결이 끊김

reconnected - 재연결 완료

reconnectFailed - 재연결 시도 횟수 초과

 

 

 

 

Sequelize ORM

-Object-Relational Mapping

  • MySQL, PostgreSQL 등의 RDBMS를 이용하는 간단한 방법
  • ODM 이 단순히 모델에 집중하여 관리하는 것에 반해, ORM 은 테이블 관계와 쿼리 등의 기능을 더욱 단순화하는 용도로 주로 사용

-Sequelize ORM 사용하기

디비 연결

  • sequelize도 연결을 관리하는 간단한 방법을 제공
  • mongoose가 MongoDB만 연결이 가능한 데에 반해 sequelize는 MySQL, PostgreSQL, SQLite 등 다양한 RDBMS 에 연결 가능

스키마 작성

 

 

 

 

sequelize는 define을 통해 Schema를 생성

 

mongoose.Schema와 유사하지만,

sequelize는 Schema가 DDL도 생성해 줌

 

 

 

 

 

 

스키마 작성 - 관계 정의

 

 

 

 

sequelize를 이용하면 테이블 간의 관계를 Code-Level로 관리할 수 있음

 

이를 이용하면 외래키 설정과 제약조건까지 DDL로 생성해 줌

 

또한 다대다 관계 설정을 통해 relation table도 자동으로 생성해 줌

 

 

 

쿼리

 

 

 

 

 

Operator를 이용해 SQL 쿼리를 코드로 작성 가능

 

스키마의 관계 설정을 한 경우, include를 사용하여 자동으로 join 쿼리 생성 가능

 

 

 

 

 

Synchronization

define된 model 데이터를 바탕으로 DDL을 자동으로 실행해 줌

-> 직접 데이터베이스에 접속하여 테이블 생성 및 관리를 할 필요가 없음

-> 자동으로 생성된 DDL 을 따르지 않으면 테이블 관리가 어려워 짐

 

-Sequelize ORM 정리

Sequelize ORM 을 사용하면 데이터베이스에 직접 DDL을 하지 않고 JavaScript 코드로 테이블 및 관계를 관리할 수 있음

또한 RDB의 어려운 점 중 하나인 join을 간단하게 사용할 수 있음

'JavaScript' 카테고리의 다른 글

[JS] Node.js 와 MongoDB II  (0) 2022.10.20
[JS] Node.js (2)  (0) 2022.10.13
[JS] Node.js 와 MongDB I  (0) 2022.10.10
[JavaScript] 비동기 (2)  (0) 2022.10.06
[JS] 자료구조와 에러처리  (0) 2022.10.05