튼튼발자 개발 성장기🏋️

[MongoDB] MongoDB의 기본 본문

기타/MongoDB

[MongoDB] MongoDB의 기본

시뻘건 튼튼발자 2025. 3. 3. 21:50
반응형

도큐먼트(Documents)

MongoDB의 핵심은 정렬된 키와 연결된 값의 집합으로 이루어진 도큐먼트라는 것이다. 도큐먼트는 데이터를 저장하는 기본 단위이며, JSON(JavaScript Object Notation)과 유사한 BSON(Binary JSON) 형식으로 저장된다. RDB의 `행`에 해당하는 개념이다. 도큐먼트는 데이터형과 대소문자를 구분한다. 예를들어 { "count": 5 }와 { "count": "5" } 는 서로 다른 도큐먼트로 구분된다. 당연히 키는 중복될 수 없다.

도큐먼트의 특징

1. 키-값(Key-Value)

도큐먼트는 아래와 같이 { "key": value } 형태의 필드로 구성된다.

{
  "name": "dotori",
  "age": 33,
  "email": "dotori@example.com"
}

 

2. 유연한 스키마

RDB와 달리 고정된 스키마가 필요 없으며 필드의 개수, 데이터 타입이 서로 다른 도큐먼트를 같은 컬렉션에 저장이 가능하다. (컬렉션이 무엇인지는 아래 기술한다.)

{ "name": "dotori", "age": 33 }
{ "name": "goliath", "email": "goliath@example.com", "phone": "010-0000-0000" }

 

3. 중첩된 데이터 구조

RDB의 JOIN을 대체할 수 있도록 특정 필드 값으로 다른 도큐먼트를 포함할 수 있도록하여 성능을 향상시켰다.

{
  "name": "dotori",
  "address": {
    "city": "Seoul",
    "zipcode": "12345"
  }
}

 

4. 배열 지원

당연하겠지만, 필드 값으로 배열을 포함할 수 있다.

{
  "name": "dotori",
  "hobbies": ["weight", "develop", "invest"]
}

 

5. 고유한 _id 필드

모든 도큐먼트에는  고유 식별자인 `_id`필드가 자동 생성된다.

{
  "_id": ObjectId("607c191e810c19729de860ea"),
  "name": "dotori",
  "age": 33
}

 

 

컬렉션(Collections)

RDB에서의 테이블과 대응되는 것이 컬렉션이다. 이전에 언급했던 것 처럼 고정된 스키마가 없다는 점이 가장 큰 차이점이다.

컬렉션의 특징

1. 컬렉션 = 도큐먼트의 집합

컬렉션은 도큐먼트의 모음이며, 같은 유형의 데이터를 저장하는 데 사용된다. 예를들어, users 컬렉션에는 사용자 정보가 포함된 도큐먼트가 저장되겠다.

 

2. 스키마가 없는 구조

MongoDB에서는 "동적 스키마를 가진다."라고 이야기 한다. 하나의 컬렉션 내 도큐먼트들이 모두 다른 구조를 가질 수 없다는 의미다. 위 도큐먼트 특징의 [2. 유연한 스키마]와 같은 이야기다.

다른 구조의 도큐먼트라도 같은 컬렉션에 저장할 수 있는데 왜 별도의 컬렉션이 필요한지에 대한 의문을 가질 수 있다. 그 이유는 아래와 같다.

  • 같은 컬렉션에 다른 종류에 도큐먼트를 저장하면 개발자와 관리자에게 번거로운 일이 생길 수 있다. 각 쿼리가 특정 스키마를 고수하는 도큐먼트를 반환하는지, 혹은 쿼리한 코드가 다른 구조의 도큐먼트를 다룰 수 있는지 확실하게 확인해야한다. 예를들어, 블로그 게시물을 쿼리한 데이터 중 작성자 데이터만 제거하려면 상당히 번거로울 것이다. (작성자가 없는 구조의 도큐먼트가 있을 수 있기 때문)
  • 컬렉션 별로 목록을 뽑으면서 한 컬렉션 내 특정 데이터형별로 쿼리해서 목록을 뽑을 때보다 훨씬 빠르다.
  • 같은 종류의 데이터를 하나의 컬렉션에 모아두면 데이터 지역성에도 좋다. 예를들어, 블로그 게시물 여러 개를 뽑을 경우 게시물과 저자 정보가 섞인 컬렉션보다 게시물만 들어있는 컬렉션에서 뽑을 때 디스크 탐색 시간이 훨씬 짧을 것이다.
  • 인덱스를 만들면 도큐먼트는 특정 구조를 가져야한다. 이러한 인덱스는 컬렉션 별로 정의 하므로 같은 형식의 도큐먼트를 하나의 컬렉션에 넣음으로써 컬렉션을 효율적으로 인덱싱할 수 있다. (인덱싱에 대해서는 다음 포스팅에서 작성한다.)

3. 네이밍

컬렉션은 이름으로 식별된다. UTF-8 문자열이면 사용할 수 있지만 아래 제약조건이 있다.

  • 빈 문자열은 유효하지 않다.
  • \0(null)는 사용할 수 없다. (\0은 컬렉션 명의 끝을 나타내는 문자열이기 때문)
  • `system`으로 시작하는 컬렉션 명은 사용할 수 없다. (시스템 컬렉션에서 사용하는 예약어이기 때문)
  • `$`를 포함할 수 없다. (예약어이기 때문)

MongoDB는 `서브컬렉션`을 사용해서 컬렉션을 체계화할 수 있다. 네임스페이스에 `.`(마침표)를 사용한다. 예를들어 `blog.dotori`처럼 말이다. 이는 `blog`라는 컬렉션과 `blog.dotori`라는 컬렉션은 아무런 관련이 없다. 단지 체계화를 하기 위함이다.

데이터베이스(Databases)

MongoDB는 컬렉션에 도큐먼트를 그룹화할 뿐 아니라 데이터베이스에 컬렉션을 그룹 지어 놓는다. MongoDB의 단일 인스턴스는 여러 개의 데이터베이스를 호스팅할 수 있으며, 각 데이터베이스를 완전히 독립적으로 취급할 수 있다.

MongoDB의 기본 데이터베이스로써 3가지가 존재한다.

  • admin : admin 데이터베이스는 인증과 권한 부여 역할을 한다.
  • local: local 데이터베이스는 단일 서버에 대한 데이터를 저장한다. 복제셋(replica set)에서 local은 복제 프로세스에 사용된 데이터를 저장한다.
  • config: 샤딩된 몽고DB 클러스터는 config 데이터베이스를 사용해 각 샤드의 정보를 저장한다.

 

MongoDB 시작

나는 아래와 같이 docker를 사용해서 컨테이너를 실행했다.

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    restart: always
    ports:
      - "27017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: admin
    volumes:
      - mongodb_data:/data/db

 

또는 아래와 샅이 셸을 통해 실행해볼 수 있으며 MongoDB 인스턴스와 상호작용하는 javascript shell을 제공한다.

$ mongo
MongoDB server version: 4.4.18
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	https://docs.mongodb.com/
Questions? Try the MongoDB Developer Community Forums
	https://community.mongodb.com
	
	
> x = 200
200
> x / 5;
40
> Math.sin(Math.PI / 2)
1
> new Date("2025-03")
ISODate("2025-03-01T00:00:00Z")

MongoDB 클라이언트

셸은 독자적으로 사용이 가능하며 시작할 때 서버의 `test` 데이터베이스에 연결하고, 데이터베이스 연결을 전역 변수에 db에 할당한다. 셸에서는 주로 이 변수를 통해 MongoDB에 접근한다.

 

데이터 형

MongoDB는 JSON 성질을 유지하면서 추가적인 데이터 형을 지원한다.

  • null: 값이 존재하지 않은 필드를 표현 하는데 사용한다.
  • boolean: true/false
  • number: 셸은 64비트 부동 소수를 기본으로 사용한다.
  • string: 어떤 UTF-8 문자열이든 문자열형으로 표현 가능
  • date: 1970년 1월 1일 부터 시간을 1/1000초 단위로 나타내는 64비트 정수로 날짜 표현, 표준 시간대는 저장하지 않는다.
  • regular expression: 쿼리는 자바스크립트 정규 표현식 문법을 사용할 수 있다.
  • array: set, list 형태로 표현할 수 있다.
  • 내장 도큐먼트: {"x" : {"foo": "bar"}} 도큐먼트는 부모 도큐먼트의 값으로 내장된 도큐먼트 전체를 포함할 수 있다. (상기 도큐먼트 특징의 [3. 중첩된 데이터 구조] 참고)
  • 객체 ID: 도큐먼트용 12 바이트 ID
  • 이진 데이터: 이진 데이터는 임의의 바이트 문자열이며 셸에서는 조작이 불가능하다. 이진 데이터는 데이터베이스에 UTF-8이 아닌 문자열을 저장하는 유일한 방법이다.
  • 코드: {"x": function() {....}} 쿼리와 도큐먼트 임의의 자바스크립트 코드를 포함할 수 있다.
반응형

'기타 > MongoDB' 카테고리의 다른 글

[MongoDB] 특수 인덱스  (0) 2025.03.17
[MongoDB] 인덱싱 #2  (0) 2025.03.16
[MongoDB] 인덱싱 #1  (0) 2025.03.15
[MongoDB] 도큐먼트 생성, 갱신, 삭제  (0) 2025.03.06
[MongoDB] MongoDB란?  (0) 2025.03.01