MongDB의 기본 개념과 기능들

sentimental time·2023년 9월 16일

NoSQL

목록 보기
2/3
post-thumbnail

[1]. Document

  • MongoDB에서 데이터를 저장하는 단위는 Document이다.
  • 어떤 데이터가 들어와도 상관없다.
  • RDBMS에서의 Row를 MongoDB의 Document라고 한다.
  • Document의 형식은 미리 지정되어 있지 않다.
  • 같은 Collection에 속한 Document라고 해서 모두 같은 형식을 따를 필요 없다.
    [설명] : 하나의 Document가 자신의 데이터에 대해서 완결성을 가진다.
  • Document에 가지는 필드나 값은 BSON Type을 따른다.
  • 대신 꼭 필요한 하나가 있는데, _id 필드는 각 document의 Primary Key로서 반드시 가져야 한다.

[2]. id 필드와 ObjectId

  • 모든 Document는 고유 값을 뜻하는 _id 필드를 반드시 가진다.
  • _id는 직접 지정할 수도 있고, 지정하지 않으면 ObjectId 형식의 데이터가 자동으로 생성되어 데이터 생성(삽입) 시점에 할당된다.

직접 _id를 지정하지 않고 ObjectId를 쓴다면 다음과 같은 장점이 있다 (ObjectID의 장점) :

  • ObjectId.getTimestamp()를 통해서 필드없이 생성 시점을 가져올 수 있다.
  • ObjectID의 맨 앞이 timestamp로 되어 있어서, 그 ObjectId로 정렬하면 (대략적인) 시간순 정렬이 된다.

[3]. Bson

  • JSON 스타일의 바이너리 포맷이라고 생각하면 된다. 대신 데이터베이스용이니까 정렬도 하고, 필터도 해야하니 상세한 타입이 필요하다.
  • 실제로 가질 수 있는 데이터 타입은 JSON보다 상세하다.

[4]. Collection

  • Document를 저장하기 위한 논리적인 묶음.
  • RDBMS에서 테이블과 유사하다고 생각하면 된다.
  • Collection 단위에서 같은 형식(필드, 이름, 값의 데이터 타입 등)을 가지도록 제약을 걸 수 있다.
    [설명] : 맞지 않는 데이터가 들어오면 들어오지 않도록 Schema Vaildation으로 제약을 걸 수 있다).

[5]. Database

  • 하나의 MongoDB 서버 혹은 클러스터에서 논리적으로 Database를 구분할 수 있다.
  • 주로 사용하는 서비스, client user 등을 구분하고, 접속에 제한을 두기 위해 사용한다.

[6]. Schema와 성능

  • MongoDB는 BSON의 형식에 따라서 하나의 필드가 BSON Object(Json Object)를 가질 수 있다. 즉, 필드 안에 또 필드가 있을 수 있다. 그리고 이 오브젝트에 대해서 검색도 가능하다.
  • 다만, 이렇게 계속 Inner field를 가지는 식으로 데이터를 검색하면 검색, 집계 연산에서 속도가 느려진다. 따라서 데이터를 저장할 때 편의성만 생각하는 것이 아닌, 검색에서의 효율성 또한 고려하며 Document의 형식을 정하는 것이 좋다.
  • 하지만 데이터가 많지 않으면 큰 차이가 나지는 않는다. 시스템이나 서비스의 규모가 작다면 아직 발생하지 않는 성능 문제에 이것 저것 고려하지 않고 객체지향 모델에 맞게 Document를 저장하고 사용할 수 있는 장점을 살려서 개발 속도를 끌어올리는 방법도 좋다. 나중에 문제가 되면(데이터가 많아졌을 상황) 그 때 튜닝이나 리팩토링을 하는 것도 늦지 않다.

[설명] : MongoDB 기술이 많이 발전했기 때문에 데이터가 많지 않으면 큰 차이는 없다. 우린 시스템이나 서비스 규모가 작다. 개발하면서 변경 사항이 많다라고 한다면 MongoDB를 사용해서 개발 속도를 끌어올리는 것이 좋다. Mysql은 데이터 변경하려면 테이블 변경해야 하고, 테이블 변경할 때 스키마 안 맞으면 데이터 마이그레이션도 해야하고.. 전체적으로 번거롭다.

[7]. Database-Reference

  • RDBMS에서 Foriegn Key를 지정하는 것처럼 다른 DB나 Collection의 특정 Document를 참조하고 싶어하는 분들이 있어 MongoDB가 그 기능들을 만들었다. 어떤 기능을 사용하던지 RDBMS처럼 Cascading을 제공하지 않기 때문에 Atomicity를 완벽하게 제공할 수 없지만 두 가지 기능을 제공한다.

[7-1]. Manual References

  • 참조하고 싶은 Document의 _id 필드에 해당하는 값을, 다른 Document의 특정 필드의 값에 놓고, 직접 찾는 것이다. 결국 참고하고 싶은 데이터를 가져오려면 두 번 쿼리를 날려야 한다.

[7-2]. DB Refs

  • Document를 참조할 수 있는 convenition을 제공한다. 참조하고 싶은 Document의 Collection, _id database, another fields와 기타 정보를 객체로 담는다.
    단, 각 언어의 클라이언트마다 지원 여부와 기능의 정도가 다르니 확인하고 사용해야 한다.

[8]. Transaction

  • MongoDB에서 기본적으로 하나의 Document에 대해서 하나의 operation만 Atomic operation을 제공한다. Transaction을 이용하면 하나 이상의 document에 대해서, 두 번 이상을 operation에 대해서 Atomicity를 제공할 수 있다.
  • 다만, 모든 Collection, Document에서 Transaction을 제공하지는 못하고 일부 제약 사항이 있다. production level로 Transaction을 사용하려면 문서에서 한정하는 범위나 기능을 정확하게 파악하고 사용해야 한다.
profile
공부할 땐 센치하게

0개의 댓글