일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- framework
- 애자일프로그래밍
- 스프링
- cleancode
- spring boot
- 그리디
- Elasticsearch
- 프레임워크
- mongoDB
- 읽기쉬운코드
- 코딩테스트
- Baekjoon
- JPA
- 개발자
- 코딩
- Spring
- 데이터베이스
- API
- ES
- Java
- 코드
- database
- 백준
- 개발
- 애자일기법
- 클린코드
- 알고리즘
- 엘라스틱서치
- 그리디알고리즘
- Today
- Total
튼튼발자 개발 성장기🏋️
[MongoDB] MongoDB의 기본 본문
도큐먼트(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 |