MongoDB, 어렵지 않게 시작하기

2020. 3. 15. 23:36BACKEND/Database

반응형

안녕하세요 〰️ 

오늘은 Mongodb를 사용하는 예제를 통해 mongodb사용하는 방법에 대해서 알아볼 예정입니다!

간단한 to-do-list를 만들면서 쓰임새를 알아보도록 하겠습니다 〰️ 

 

일단, mongDB를 사용하기 전에 왜 사용하는지를 먼저 알아봐야겠죠? 

어떤 특징이 있는지, 언제 사용할 때 사용성을 극대화시킬 수 있을 지 알아보겠습니다. 

 

mongoDB, 왜 사용할까?

대중적으로 많이 알려져 사용되고 있는  MySQL은 RDBMS( Relational DataBase Management System )입니다. 

이 때, MySQL은 대표적으로 SQL(Structured Query Language)을 사용합니다.

SQL은 관계형 데이터베이스의 기본이며 이 둘을 혼용하여 사용하는 경우도 다분합니다. 

 

SQL의 가장 대표적인 특징은 바로, 정형화된 형태(structure)입니다. 

SQL은 정해진 DB 내부에 정해진 Table만을 사용하여 데이터를 불러오거나 저장, 수정, 삭제 등을 수행하곤 하죠.

 

반대로, mongDB는 대표적인 NoSQL입니다.

NoSQL이라는 의미는 "관계형 데이터베이스가 아니다"라는 의미입니다. 위의 SQL과는 다른 개념을 사용합니다.

정형적이지 않은 형태를 취하는 데이터베이스입니다. 

 

아직 와닿지 않는 분들이 많을 테니, 더 깊게 각 분야별로 형태를 그려 예시를 들어보겠습니다.

 

 

차이가 좀 보이시나요?

 

SQL에서는 데이터베이스 내에 정확한 구조가 있습니다. 마치 의미가 분명한 excel에 해당하는 데이터를 적어두는 느낌이죠.

Table 내부에 RowColumn의 structure로 해당 칸이 의미하는 Record(데이터)들이 넣어지죠.

중요한 점은, SQL에서는 Relationship을 통해 데이터들이 연결되어 있다는 점입니다.

주로 서로 다른 테이블에 분산된 데이터가 있을 때, 서로의 관계를 통해 연결되어집니다. 이 때 주로 Index를 통한 연결이 이어집니다.

 

 

NoSQL(Not Only SQL)에서는 데이터베이스 내에 정확한 구조가 없습니다

마치 docs에 나름대로 생각한 구조를 적어두는 느낌이죠.

 

Collection은 SQL에서의 Table과 동일한 의미를 지닙니다. 데이터들의 이름표죠.

NoSQL은 SQL과는 다르게 '관계'가 없기때문에, JOIN이라는 개념이 없습니다.

NoSQL은 Key부분의 타입만 동일하고, mandatory(생략되지 않는) 필드로 지정하면 값에 해당 하는 컬럼은 어떤 타입이든, 어떤 이름이 오든 허용됩니다.

또 ID 필드는 공통이지만, 데이터를 저장하는 컬럼은 각기 다른 이름과 다른 데이터 타입을 가질 수 있습니다.

 

지금까지 SQL과 NoSQL의 차이를 중점적으로 NoSQL에 대한 특징을 살펴보았습니다. 이해가 좀 되시나요?

아, SQL에 대해서는 지난 번 데이터베이스를 포스팅한 내용에서 참고하셔도 좋을 것 같습니다.

 

 

그렇다면, 데이터 모델링은 어떤식으로 해야할까요?

NoSQL 데이터 모델링은 어떤 특징이 있는 지, 모델링 개념에 대해서 알아보도록 합시다!

 

 

NoSQL 데이터 모델링 ? 

1. Denormalization, 비정규화

데이터 중복 허용합니다.

사용자의 데이터를 특정한 데이터 모델에 맞추기 위해서 같은 데이터를 여러 도큐먼트나 테이블에 복제하여 중복하는 것을 허용합니다.

 

비정규화는 쿼리 수행을 위한 모든 데이터를 한곳에 모아놓고 쿼리를 수행하기 때문에, 쿼리 수행을 위한 I/ O 숫자를 줄여 전체 성능을 향상시킬 수 있습니다. 하지만 이로인해 도큐먼트나 테이블에 중복 저장되기 때문에 사이즈는 필연적으로 증가할 수 밖에 없어집니다.

 

 

2. Aggregates, 유연한 스키마

Value와 데이터에 대한 제약 조건 없습니다.

Key를 디자인할 때, 조합키(composite key)를 활용 하여 다수의 레코드를 하나의 항목(entity)로 구성이 가능합니다.

JOIN이 불필요하게 만들고, 복잡하고 다양한 데이터들을 담을 수 있는 장점이 있습니다.

 

 

 

 

3.  Application Side Joins

MongoDB는 Application Side Join을 하기때문에 JOIN을 제공하지 않습니다.

 

대용량 데이터에 대해 빠른 응답 성능과 확장성, 가용성을 최우선 목적으로 합니다.

따라서 쿼리 타임 조인을 최대한 피하여 데이터 모델을 구성하는 것을 가정합니다.

이러한 특징으로 빠르고 유연한 기능들을 사용할 수 있겠지만, 필연적으로 다대다관계를 갖거나 데이터가 수시로 변하는 경우에는 어떻게 해야 할까요?

 

바로 Application 측에서 처리를 해주는 것입니다. Application에서 첫 번째 Document의 키를 가져와, 다른 Document의 데이터를 가지고 옵니다. 결론적으로 두 데이터 뭉치를 리턴하는 것입니다.

비슷하게 Server Side Joins가 있는데, NoSQL 서버에서 JOIN을 시킨 후 리턴 시키는 것입니다.

 

 

자, 이제 어느정도는 NoSQL이 무엇인지, 느낌을 아시겠나요? 

이론적인 공부도 좋지만, 이론 적인 공부에는 한계가 있으니 직접 만들어 보면서 완전히 자신의 것으로 흡수하는 것이 더 좋다고 생각합니다.

보고 이해만 하지말고, 직접 따라해보면서 자신의 것으로 만들어 봅시다 ❗️

 


 

이젠 같이 발맞추어 만들어보겠습니다.

 

MongoDB 실행

1. mongoDB Setting 

#설치 ,  #실행 ,  #사용

 

일단, mongoDB를 설치해봅시다! 설치하는 과정은 공식 홈페이지를 통해 따로 확인해주세요 〰️

참고로, mac OS는 아래와 같은 명령어를 사용하여 쉽게 설치할 수 있습니다. ( 제가 mac이라 다른 건 못해보네요 🤣 )

 

$ brew update
$ brew install mongodb

 

만약, brew install 이 안된다면 brew tap을 사용해서 설치하실 수 있습니다. ( 버전은 2020년 3월 기준입니다. 버전은 적지않아도 됩니다 )

 

$ brew tap mongodb/brew
$ brew install mongodb-community@4.2

 

만약, 권한 문제 ( The following directories are not writable by your user ) 가 발생한다면 chwon 명령을 통해 디렉토리의 권한을 바꾸면 됩니다! 

에러를 잘 따라가면 금방 설치하실 수 있으실 거에요❗️

 

다음엔, mongdb를 실행시켜주세요!

 

$ brew services start mongodb-community@4.2
// using mongodb 
$ mongo

> 

 

 

다음으로는 사용할 데이터베이스를 생성해보려고 합니다.

데이터베이스를 생성하기 전에는 꼭 해야하는 일이 하나 있습니다.

 

바로, 모델링이죠!

 

 

2. Modeling

 

정말 간단한 모델이 생성되었습니다 〰️ 

지금은 배우는 단계이니 아주 간단하고 복잡하지 않은 모양으로 시작해보는 게 좋겠죠 😆

이 모델을 기반으로 데이터를 추가시킬 예정입니다 ❗️ 

 

👉🏻  참고   👈🏻

todoIdx는 선택입니다. 상황에 따라 달라질텐데요, 사실 쓰지 않아도 mogoose에서는 '_id'라는 값을 default를 반환해줍니다.

굉장히 복잡한 문자들로 이루어져있죠. 

만약, 깔끔한 정수형태의 idx가 필요하다면 위처럼 Idx를 따로 만드시면 됩니다 〰️ 

 

 

여기서 알아둬야할 점❗️ 

MongoDB는 따로 형태가 없기 때문에 어떤 것을 넣어도, 어떤 형태를 넣어도 됩니다. 

이게 장점이 될 수도 있고 단점이 될 수 있는데요. 그래서 mongoose library에서는 'schema'라는 개념을 도입해 어느정도의 틀을 잡아주게 됩니다.

 

따라서, 실제 데이터베이스에는 collection을 만들어 두기만 하고, 프로젝트에서 데이터베이스를 접근할 때 규칙에 맞게 다뤄주면됩니다.

일단, mongoDB에 데이터베이스와 collection을 하나 만들어보겠습니다. 

 

 

// start mongoDB
$ mongo

// Database 생성 - use {database_name}
> use todolist
switched to db todolist

// 현재 사용중인 databases 확인
> db
todolist

// Document 생성 - db.createCollection("document_name", {options})
> db.createCollection("todos")
{ "ok" : 1 }

// 생성된 documents 확인
> show collections
todos

 

간단한 명령어들이기 때문에 한 번에 입력해보았습니다. 명령어들을 전부 다룰 수 없는 점이 아쉽네요 ㅜㅜ 

다음에 시간이 된다면, 명령어들을 다루는 시간을 가져보겠습니다.

 

아, 한가지 추가적으로 알아두면 좋은 점은... express에서 mongoDB를 연결할 때에 굳이 collection을 만들지 않아도, 없는 collection이면 알아서 만들어 줍니다 〰️ 한마디로 위의 과정은 생략해도 좋죠.

하지만, 형식상 만들어주는 것이 좋을 듯 싶어 포스팅에 추가했습니다❗️ 

 

위의 주석처리된 대로 따라와 주시면 됩니다 〰️ 

따로 언급하자면, Document를 생성할 때에는 option을 추가할 수가 있습니다.

 

 

이어서 'Express + MongoDB, 간단한 프로젝트 만들기'로 만나겠습니다!

반응형