DB) MongoDB , Nosql을 활용해서 DB를 사용해보자!!

백준우·2021년 11월 27일
0

DB

목록 보기
3/8
post-thumbnail

1. No SQL에 대해서

1.1 No SQL에 대해

2. Mongo DB에 대하여

3. Mongo DB 사용하기

3.1 기본 환경설정

3.2 VS코드 & 환경설정


1. No SQL에 대해서

1. No SQL과 SQL의 차이

  1. No SQL에 대해
  • 전통적인 관계형 데이터베이스인 SQL보다 훨씬 자유성이 높은 일관성 모델을 이루는 데이터저장을 이룬다.
  • 단순 검색 및 추가 작업을 위한 매우 최적화된 키값 저장공간이다.
  • SQL은 수직적 확장성을 가지나 수평적 확장성을 가진다.

따라서, 은행과 주식프로그램 DB의 경우 형식에 중점을 둔 SQL을 많이 사용한다.

TIP) 다양한 NoSQL 데이터베이스
1. 와이드 컬럼 스토어: H베이스, 아큐물로, 카산드라
2. 도큐먼트: 몽고DB, 카우치베이스
3. 키 값: 다이나모DB, 리악, 레디스, 프로젝트 볼드모트
4. 그래프: Node4J, AgensGraph, 알레그로그래프, 버투오소
<출처: wiki>

2. Mongo DB에 대하여

오늘은 다양한 NoSQL중에서 MongoDB(이하 몽고DB)를 활용해서 DB를 활용해 보겠다.
몽고DB는 JavaScript를 활용한 크로스 플랫폼 도큐먼트 지향 데이터베이스 시스템이며 몽고DB는 JSON과 같은 동적 스키마형 도큐먼트(BSON)들을 선호함에 따라 전통적인 테이블 기반 관계형 데이터베이스 구조의 사용을 지향한다.

  • 몽고DB의 구성요소
  1. DataBase: 각 파일 시스템에 여러파일들이 저장되는곳, Collection들의 집합이다.

  2. Collection: Document들이 합쳐져서 하나의 Collection을 이루고 있습니다. RDMS의 Table과 비슷한 개념이며 차이점은 Schema를 따로 가지고 있지 않습니다.(Doucment들이 동적인 Schema를 가짐)

  3. Document: 모든 MongoDB 도큐먼트는 모든 도큐먼트가 _id 필드를 기본값으로 반드시 가지고 있어야 하며 이 _id 필드의 값은 각 Document를 구별하는 역할을 합니다.
    Document 내부의 필드와 값이 똑같다 할지라도, _id 값이 다르면 서로 다른 Document로 간주합니다.
    반면에 Document 내 필드와 값이 다르다고 하더라도, _id 값이 같다고 하면 서로 같은 Document로 여겨 에러를 발생시킵니다.
    Document는 동적(dynamic)의 schema 를 갖고있으며 같은 Collection 안에 있는 Document 끼리 다른 schema 를 갖고 있을 수 있다.
    Key-Value로 구성되어 있으며 샘플은 아래와 같다.
<Document 예제>
{
"name" : "Baek"
"title" : "Learn_MongoDB"
"age" : 30
}
  • MongoDB의 장점
  1. RDBMS보다 속도가 굉장히 빠르다(100배이상)
  2. schema관리가 따로 필요가 없다.
  3. 복잡한 JOIN이 따로 없다.
  • MongoDB의 단점
  1. 메모리 사용량이 큰편이다.
  2. SQL을 완전히 이전할 수 없다.
  3. JOIN이 없어서 복잡한 쿼리를 사용할 수 없다.

TIP) JSON VS BSON


<JSON의 올바른 예시>

<BSON의 올바른 예시>

  • JSON은 읽기가 쉽고 많은 개발자들이 활용하는 형태를 가집니다. 하지만, JSON은 텍스트 형식이기 때문에 파싱이 늦고 메모리 사용에 비효율 적입니다.
  • BSON은 컴퓨터 언어에 가까운 이진법을 기반으로 둔 표현법입니다.따라서 JSON보다 효율적이고 유연한 방법입니다.
    MongoDB는 JSON형식으로 작성되는 무엇이든 데이터베이스에 추가할 수 있고 조회할 수 있지만 내부에서는 효율성과 속도를 위해 BSON으로 데이터를 저장하고 사용한다.

3. Mongo DB 사용하기

  1. 기본 환경설정
    몽고DB를 사용하려면 먼저 사이트로 가서 로그인 후 DB를 만들어야 한다.(https://www.mongodb.com/)
    몽고DB는 딱! 한개의 Free DB를 제공한다.
    DB를 다 생성하면 아래와 같은 화면이 나오게 된다.

여기에서 Connect를 선택하면 하나의 창이 나타나게 된다.

이번에는 위 3가지 방법중 두번째 방법을 통해 접속을 해보겠다.
두번째 방법을 들어가면 Driver와 version을 선택하라는 창이 뜨게된다.
자신의 환경에 맞춰 설정을 한 뒤 아래의 코드를 이용해서 vscode를 통해 구현해보겠다.

mongodb+srv://Baek:<password>@cluster0.jolds.mongodb.net/myFirstDatabase?retryWrites=true&w=majority
  1. VS코드 & 환경설정
  1. 코드를 짜기전 환경설정을 위해 MongoDB를 먼저 설치해주겠다
$ npm install mongodb
  1. 코드설정
const { MongoClient } = require('mongodb') // MongoDB를 불러온다
const Password = User의 패스워드
const Database_Access_User_Name = User의 이름을 설정
const ClusterName = 본인이 만든 cluster의 이름을 설정
//url변수에 MongoDB연결 
const url = `mongodb+srv://${Database_Access_User_Name}:${Password}@${ClusterName}.jolds.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`
//client 변수에 mongodb를 연결하여 준다. 2개의 
const client = new MongoClient(url, {
  useNewUrlParser: true, //최신 MongoDB에는 새로운 파서를 사용하기 위한 옵션들
  useUnifiedTopology: true, /
})
async function main(){
// client.connect()을 통해 만들어진 본인의 MongoDB에 연결한다.  
    await client.connect()   
// 'school'이라는 DataBase에 users라는 collection을 만들어준다. 
    const users = client.db('school').collection('users')
    await users.deleteMany({}) // 데이터베이스를 실행할때마다 비우기위한 문장
    await users.insertMany([ //데이터베이스에 아래정보를 넣어준다.
        {
            name: 'Base'
        },
        {
            name: 'Lee'
        },
        {
            name: 'Kim'
        }
    ])
// 본래 조건채워 필요한 정보를 불러오지만 지금은 모든데이터를 찾아야하니 비워든다.
    const cursor = users.find({조건}) 
// 찾은 정보들을 출력 위해 console.log를 통해 결과를 확인한다.
    await cursor.forEach(el=>console.log(el)
// 데이터베이스를 종료한다.                         
    await client.close()
}
// 데이터베이스 생성함수를 실행하여 DataBase를 생성한다.
main()

결과

위와같이 결과가 나왔다.
_id라는 구별점을 가지고 있으며 안에 key:value값으로 name과 값이 있는것 볼 수 있다.
위와 같이 특정형식없이 JSON형식으로 데이터를 저장하여 편하게 불러올 수 있다.

느낀점

  • 본인이 개발하는 프로젝트에 맞춰 SQL과 NOSQL를 선택하여 데이터베이스를 구축해야겠다.
  • 다양한 데이터베이스 라이브러리를 사용해보고 나니 앞으로 좀더 심도 있게 공부를 해야 할거 같다.
  • MongoDB의 경우 형식이 없어서 편하게 데이터를 저장하기 편하지만 개발자 나름의 형식은 가지고 있어야지 호출,수정,삭제가 용이할것으로 보인다.
profile
이게 되네?

0개의 댓글