티스토리 뷰

Development/Database

[Database]mongoDB 튜토리얼

Vagabund.Gni 2023. 4. 3. 11:04
728x90
반응형

목차

     

    개인 프로젝트를 진행하면서 이름만 많이 듣던 Reactive mongo DB를 사용하고 있다.

     

    잘 모르는 채로 더듬더듬 쓰면서 경험치가 쌓이다 보니, 이제야 전반적인 개념이 궁금해져서 정리 시작.

     

    MongoDB

     

    몽고 디비는 HUMONGOUS DB를 줄인 표현이다. 그 이름대로 대용량 환경에 대응하기 위해 개발되었다.

     

    또한 몽고디비는 대표적인 NoSQL DB 중 하나이며, 문서 지향(Document-Oriented) 데이터 모델을 사용하고

     

    JSON과 비슷한 동적 스키마형 도큐먼트(몽고DB에서는 이를 BSON이라 부른다)로 데이터를 저장 및 조회한다.

     

    이베이, 뉴욕 타임스, 구글, 페이스북 등이 이 몽고디비를 주력으로 사용하고 있으며, 메모리 내에서 작업하도록

     

    설계되어 있기 때문에 같은 조건에서 RDBMS보다 굉장히 빠르다는 장점이 있다.

     

    이외에도 굉장히 많은 특징이 있는데, 가능한 많이, 가능한 간결하게 정리해 보자.

     

    1. Schemaless
      위에 언급했듯 몽고DB는 고정된 스키마가 없고, 대신 JSON과 비슷한 BSON이라는 동적 스키마 도큐먼트를 사용한다.
      이는 직렬화와 역직렬화에 드는 시간과 비용을 아낄 수 있어 전체적인 성능을 향상하는 효과를 가져온다.
      몽고DB에선 가장 기본적인 데이터, 즉 Row 한 줄을 Document라 부르고, 그 집합을 Collection이라 부른다.
      따라서 Collection = RDBMS에서의 테이블(Table)이라고 보면 크게 틀리지 않으며, 이 Collection이 모여 DB를 이룬다.
    2. Query
      Repository 클래스에서 SQL을 쓰는 JPA와 유사한 쿼리를 지원한다. 물론 복잡한 쿼리를 하려면 MongoTemplate이
      필수이지만, 기초적인 개발 단계에선 JPA를 사용하는 감각과 비슷하게 사용할 수 있다.
      또한 'Geospatial Query'라 부르는, 공간 데이터를 저장하고 처리하기 위한 기능을 제공하며, 이를 위한 쿼리 기능으로는
      Geo Index(위치 정보 인덱싱), Location Query(위치 정보 기반 쿼리를 위한 연산자 제공),
      Spatial Anaysis(인덱스를 활용한 데이터의 위치 및 거리 계산)등이 있다. 
    3. 고성능
      위에 적었듯 메모리에서 작업을 수행하도록 설계되었을 뿐 아니라, 데이터를 인덱싱 하고 캐시를 사용하도록 되어있어
      높은 성능과 빠른 응답 시간을 제공한다.
    4. 대용량 데이터 처리 기능
      몽고DB는 대용량 데이터를 처리하기 위한 MapReduce, Aggregation Pipeline 등 별도의 기능을 제공한다.
    5. 확장성
      수평적 확장을 지원하기 때문에 데이터의 양이 많아지더라도 성능에 영향을 끼치지 않는다. 이는 처음부터 분산형 아키텍처를
      기반으로 하기 때문인데, 클러스터를 추가하거나 서버 노드를 추가하여 데이터베이스를 확장하는데 유리하다.
      또한 데이터 안정성을 위해 레플리카와 샤딩을 지원하는데, 여기서 레플리카란 하나의 클러스터에 여러 복제본을 생성하는
      것이고, 샤딩이란 여러 클러스터에 데이터를 분산하여 보관하는 것을 가리킨다.
    6. ACID 트랜잭션
      기존의 몽고DB는 트랜잭션을 지원하지 않아 데이터 정합성에 문제가 있었다. 하지만 버전 4.0 이후로는 ACID 트랜잭션을
      지원하며, 분산환경에서도 데이터의 무결성과 정합성을 보장할 수 있게 되었다.
    7. 기타 유틸리티
      데이터 백업 및 복원을 위한 mongodump, mongostore, 모니터링을 위한 mongostat, mongotop 등의
      유틸리티 프로그램을 제공한다.

     

    요약하면 몽고디비는 유연성, 고성능, 확장성, 대용량 데이터 처리기능, 데이터 정합성등을 골고루 갖춘 강력한 DB이다.

     

    또한 가장 인기 있는 NoSQL DB이며, 위와 같은 특징 때문에 대규모 웹 앱, IoT, 빅데이터, 머신러닝 등에 사용된다.

     

    추가로 NoSQL의 특성상 스프링부트와 함께 사용할 때 RDBMS처럼 외래키를 통한 연관관계를 설정하지 않으며

     

    Embeded, @DBRef, @DocumentReference 등의 방식으로 다른 컬렉션의 Document를 참조한다.

     

    Reactive mongoDB

     

    리액티브 몽고디비는 몽고디비에 비동기 논블로킹 방식을 적용한 데이터베이스이다.

     

    기존의 몽고디비는 스레드 블로킹 방식과 동기적인 방식을 사용하여 데이터를 처리했다.

     

    이는 대용량 데이터를 처리할 때 그만한 스레드를 생성해야 하기 때문에 성능이 떨어질 수밖에 없었고,

     

    특히 대용량 I/O블로킹이 발생하면 소프트웨어가 그만큼 대기해야 하기 때문에 문제가 될 수 있었다.

     

    해서 이를 해결하기 위해 나온 것이 리액티브 몽고디비이다.

     

    리액티브 몽고디비는 당연하다면 당연하게도 비동기, 논블로킹 방식을 사용하여 제한된 스레드로

     

    더 많은 요청을 처리할 수 있어 확장성과 성능이 좋다. 또한 리액티브 스트림 API를 준수하기 때문에,

     

    이를 구현한 프레임워크들, 예를 들자면 WebFlux등과 궁합이 좋다.

     

    요약하면 비동기, 논블로킹 방식을 차용해 기존의 몽고디비보다 확장성과 높은 성능을 보장하게 된다.

     

    그리고 끝으로 하나 더.

     

    위에 잠시 언급한 참조 관계는 리액티브 몽고 디비에서 지원하지 않는다.

     

    처음부터 공식문서를 읽었어야 했는데, 무턱대고 덤비다가 이걸로 일주일 날려먹었다..

     

    빡치지만 내 잘못이니 할 말은 없음..

     

    내가 잘못 이해한 것이 아니라면 이때문에 리액티브 몽고디비를 사용할 땐 손으로 참조관계를 설정해주어야 한다..

     

    어쨌거나 몽고디비, 리액티브 몽고디비 튜토리얼, 끝!

    반응형

    'Development > Database' 카테고리의 다른 글

    [Database]MariaDB  (0) 2023.05.10
    [Database]WebFlux에서 R2DBC 기본설정  (0) 2023.05.06
    [Database]SQLite  (0) 2023.04.07
    [Database]B+Tree, B*Tree  (0) 2023.03.26
    [Database]Index에 대하여 + B-Tree  (2) 2023.03.20
    [Database]Inner Join, Outer Join, 그리고  (0) 2023.03.16
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/05   »
    1 2 3 4
    5 6 7 8 9 10 11
    12 13 14 15 16 17 18
    19 20 21 22 23 24 25
    26 27 28 29 30 31
    글 보관함