ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8장 MeanStack 의 또 다른 조각 MongoDB 를 알아보자
    MeanStack (deprecated) 2016. 6. 13. 21:53


    이번엔 MeanStack 의 또 다른 조각인 mongoDB에 대하여 알아보자.

    1장에서 MongoDB를 설치하며 기본적인 사용법은 알 수 있었지만, 이번에는 제대로 동작방식 까지 알아보자. 

    먼저 흔히 알고 있는 관계형데이터베이스 (RDBMS) 들과 기본적인 차이점을 알아보자면 기본적으로 RDBMS는 

    데이터는 다양한 테이블에 저장된다. 

    나중에는 몇몇 계층적인 객체 표현으로 데이터를 배열할 목적으로 다양한 SQL 문을 사용해 모델을 재 구성 

    할 것이다. 

    하지만 문서중심 데이터베이스는 다르게 처리한다. 기본적으로 키 - 값 으로 이루어진 저장소 솔루션이며 

    JSON 이나 XML 같은 표준 형태로 계층적인 문서를 저장한다.


    이를 이해하기 위해 간단항 예를 들면, 기본적인 블로그 글을 예로 살펴보자. 

    기존 RDBMS로 이를 설계 하려면 



    그림과 같이 Posts Table 과 Comments Table 등 최소 2개의 테이블을 사용해야 한다.

    이번엔 문서기반 데이터베이스 의 관점에서 보자. 만약 JSON 형식으로 문서를 저장한다면 

      "title" : "First Blog Post",

      "comments" : [ 

       ]

    }


    이런식으로 저장될 것 이다.

    이를 보면 문서형 데이터 베이스와 관계형 데이터베이스 사이의 주된 차이점을 보여준다. 

    RDBMS는 에플리케이션이 테이블 레코드를 사용해 객체를 조립한다. 하지만 데이터를 통으로 저장하면

    더 빠른 읽기 연산이 가능하다. 매번 읽을 때마다 객체를 재구성할 필요가 없기 때문이다. 

    거기다 한가지 더 장점을 더한다면 모델의 변경이 용이하다는 것 이다.

    만약 Posts Table에 컬럼을 추가하고 싶어한다면 , RDBMS 에서는 컬럼을 추가하려하지만 , 기존 데이터가

    있기에 기존의 모든 데이터가 변경되어야 한다. 이는 추가적인 검증절차로 코드를 검토해야만 한다는 사실을

    의미한다.


    하지만 문서기반 데이터베이스에는 스키마가 없다. 이는 데이터베이스에서 아무런 변경 없이 단일 

    객체 모음에 다양한 객체를 저장할 수 있음을 의미한다.

    NoSQL 솔루션이 캐시와 확장을 둘러싼 다양한 개발 문제를 해결하는 동안, 문서중심 데이터베이스는

    급속도로 NoSQL 운동을 이끄는 리더가 되었는데 , 이 중 가장 인기많은 NoSQL 솔루션이 바로 MongoDB 이다.

    (최근들어 다시 RDBMS로 많은 개발자들이 돌아가고 있지만, 여전히 NoSQL은 쓸만하다.)


    MongoDB 의 특징을 간략하게 설명하면 JSON과 유사한 BSON형식으로 데이터를 저장한다. 

    Binary JSON을 나타내는 BSON은 JSON 과 유사한 다큐먼트의 이진 인코딩된 직렬화 형식으로서 , 크기와 

    속력면에서 더 효율적이다. 

    1장에서 봤듯이 BSON은 일차 키 방식으로 _id 필드에 유일한 식별자를 생성한다. 

    하지만 이런 키값만으로는 원하는 데이터를 찾기 너무너무 힘들다. 

    이를 보완하기 위해 MongoDB는 RDBMS에서 사용하는 LIKE 문을 지원한다. 


    SELECT * FROM Posts WHERE Title LIKE '%mongo%';


    이 단순한 SQL문을 MongoDB에서 표현하면


    db.posts.find({ title : /mongo/ }); 


    이런식으로 표현이 된다.

    여기서 더하여 MongoDB는 색인 기능 역시 지원을 한다. 

    예를 들면 

    {

    "_id" : ObjectId("52d02240e4b01d67d71ad577"),

    "title" : "First Blog Post",

    "comments" : [

    ],

    "commentsCount" : 12 

    }

    이런식으로 정의되어있는 데이터 중에서 commentsCount 가 10이 넘는 데이터를 찾고 싶다면 

    db.posts.find ({ commentsCount: { $gt: 10 } });

    이런식으로 검색을 하게 된다. 그냥 검색하게 되면 MongoDB는 모든 글을 뒤져서 commentsCount 가

    10이 넘는 데이터를 찾게 될 것이다. 이는 불필요한 데이터를 검색하기에 효율성이 떨어진다.

    만약 여기서 commentsCount 를 index 로 정의 해 놓았다면 MongoDB는 index 에서 commentsCount

    10이 넘는 데이터가 무엇인지 점검하기만 하면 된다. 


    그럼 이제 또 다른 의문이 생긴다. 트랜잭션 처리는 어떻게 할 것 인가? 

    데이터의 중복과 개선된 가용성을 제공하기 위해 MongoDB는 복제 집합이라는 아키텍처를 사용한다. 



    간단하게 설명하면 위 그림처럼 데이터가 들어있는 Main Instance 가 있고 이를 복제한 Sub Instance 가 2개 

    존재한다. 데이터를 읽고 쓰는 것 은 Main Instance 만 가능하며 , 만약 Write , Read 연산이 일어 났을 때 

    복제 집합 일원 중 하나라도 10초가 지나도 Main Instance 에 도달하지 못 하면 자동으로 선출 작업을 시작해

    Sub Instance 중 하나를 Main 으로 승격시키고, 예전 Main Instance 가 돌아오면 이는 Sub Instance 로 강등되며

    복제 집합에 다시 참여하게 된다. 


    간략하게 알아봤으니 이제 MongoDB의 질의문에 대하여 알아보자.


    https://docs.mongodb.com/manual/crud/  


    ...... 너무 많아 적기가 힘들기에 깔끔하게 공식홈페이지를 참조하자. 히히


    이번 장에서는 간단하게 MongoDB를 알아봤으며 다음 장에서는 mongoose (몽구스) 모듈을 활용하여 express 

    에서 mongoDB 에 연결을 해보자. 



    (끝)


    (이번 장은 추가 파일, 폴더 없음).

     



    댓글