🖥️ NoSQL

등장 배경

2000년대 초반 빅데이터와 클라우드 컴퓨팅의 확산

✔ 전통적인 관계형 데이터베이스는 데이터 스키마가 고정되어 있고, 대규모 데이터를 실시간으로 처리하는데에 한계가 있음 → 더 유연하고 확장성이 좋은 데이터베이스가 필요하게 되면서 NoSQL이 주목받기 시작함

개념

Not Only SQL, 비정형 데이터, 큰 규모의 데이터, 빠른 쓰기와 읽기 처리 성능 등을 지원하기 위해 설계

고성능 비관계형 데이터 저장소

사용 편의성, 스케일링 기능, 복원력 및 가용성이 탁월 (RDBMS도 되긴 함)

정규화된 데이터의 테이블을 조인하는 대신 비정형 또는 반전형 데이터를 키-값 쌍 또는 JSON 문서에 저장

일반적으로 단일 데이터베이스 파티션의 범위를 벗어나는 ACID 보증을 제공하지 않음 (기본적으로는 제공한다 하지만 RDBMS에 비해서는 떨어진다)

1초 미만의 응답 시간이 필요한 대용량 서비스는 NoSQL 데이터 저장소 선호

NoSQL이 필요한 이유

  1. 유연한 데이터 모델
    • 스키마가 없기 때문에 데이터를 자유롭게 저장한다
  2. 확장성
    • 데이터를 분산 저장 (샤딩)
  3. 고성능
    • 분산 환경에서 대규모 데이터를 처리하는데 유리하다
  4. 비정형 데이터
    • 문서, 이미지, 소셜 미디어 데이터 등의 저장 및 처리를 지원하는데 최적화

사용 영역

  1. 빅데이터 처리
    • 비정형 데이터를 빠르게 처리하는 데 강점
  2. 실시간 웹 애플리케이션
  3. 사물 인터넷(IoT)
    • 마찬가지로 실시간 데이터 저장 및 처리
  4. 클라우드 네이티브 애클리케이션

사용 사례

  • MongoDB
    • 문서 지향 데이터베이스, JSON 유사 형식의 데이터 처리
  • Cassandra
    • 대용량 데이터 분산 처리
  • Redis
    • 키-값 저장소
  • DynamoDB
    • AWS에서 제공하는 관리형 NoSQL

Azure 등등 암튼 많음

클라우드에서 NoSQL 역할

클라우드 환경에서 뛰어난 유연성과 확장성 제공

특히, AWS의 DynamoDB, Firestore(Google), Cosmon DB(Azure)와 같은 클라우드 기반 NoSQL 서비스는 서버리스 아키텍처와 결합되어 높은 가용성과 낮은 운영 비용 제공

클라우드에서 자동화된 백업, 복제, 글로벌 배포 기능 → 안정적이고 신뢰성 있는 데이터 관리 지원

클라우드 네이티브 애플리케이션에서 필요한 빠른 데이터 처리와 유연한 데이터 구조 지원해서 애플리케이션 확장에 용이함


🌿 MongoDB

오픈소스 NoSQL 데이터베이스, JSON과 유사한 도큐먼트 모델을 사용해 데이터 저장

문서 지향 데이터베이스, 데이터를 JSON과 유사한 BSON(Binary JSON) 형식으로 저장

스키마를 변경할 수 있어 데이터 구조의 변경이나 확장이 용이하다

Documnet(문서)

  • 기본 단위
{
  "name": "홍길동",
  "address": {
    "city": "서울",
    "zipcode": "12345"
  }
}
  • JSON과 비슷한 구조, 필드와 값의 쌍

  • 각 문서는 고유한 _id 필드를 가진다 → 해당 문서 식별에 사용

  • 스키마가 고정되어 있지 않다 → 같은 컬렉션에 속한 문서라도 필드의 개수가 다르거나 필드 타입이 다를 수 있다!

Collection(컬렉션)

  • RDBMS의 테이블과 유사, 여러 문서들을 그룹화한 것
db.student.insertMany([
  { "name": "Alice", ...}, 
  { ... }
]);

Student 컬렉션, 컬렉션 내에 학생의 정보가 문서로 저장

  • 스키마를 강제하지 않음, 문서 구조가 동일하지 않아도 된다

  • 컬렉션을 명시적으로 생성할 필요 없이, 문서를 처음으로 삽입할 때 자동으로 생성된다

Database(데이터베이스)

  • 여러 데이터 베이스를 가질 수 있다

  • 여러 컬렉션 포함, 데이터베이스가 컬렉션과 문서를 포함하는 상위 단위

  • 각 데이터베이스는 독립적으로 관리

// university 데이터베이스 사용
use university;

// 컬렉션에 데이터 삽입
db.student.insert({ "name": "David", ... });

BSON

  • BSON 형식을 바이너리로 변환하여 저장한 것 → 더 효율적인 데이터 처리를 위해 설계

  • JSON의 확장된 바이너리 형태, 더 많은 데이터 타입 지원하며 효율적인 저장, 빠른 검색

JSON 데이터는 인간이 읽기 쉬운 데이터, 이것이 바이너리 데이터로 변환되어 컴터가 읽음. 그런데 BSON은 변환 과정을 따로 거치지 않고 애초에 바이너리 형태로 변환해서 저장함 → 당연히 더 빠르겟죵?

Schema Flexibility (스키마 유연성)

  • 스키마가 고정되지 않은 비정형 데이터베이스

  • 스키마 변경이 필요한 경우 데이터 마이그레이션 없이 유연하게 대응 가능

  • 다양한 데이터 구조를 쉽게 다를 수 있으며, 데이터의 모델 변경 사항에도 유연하게 대응 가능

  • 개발 초기 단계나 데이터 구조가 자주 바뀌는 환경에서 MongoDB가 큰 장점이 될 수 있다 (ㄹㅇ ㅇㅈ)

특징

수평 확장성 - 샤딩을 통해 데이터베이스를 여러 서버로 분산 저장

고성능

복제 및 가용성

쿼리 언어

활용되는 분야

  • 비정형 또는 반정형 데이터를 다룰 때

  • 대규모 데이터를 분산 저장하고 처리해야 할 때

  • 빠르게 변화하는 데이터를 유연하게 관리해야 할 때

  • 실시간 분석이나 대량의 읽기/쓰기 작업이 피룡한 애플리케이션

🐵 MongoDB Atlas

MongoDB, Inc.에서 제공하는 완전 관리형 클라우드 데이터베잉스 서비스

주요 클라우드 플랫폼에서 쉽게 MongoDB 클러스터를 배포, 운영, 확장할 수 있게 해준다

특징

  1. 자동화된 관리
    • Atlas는 데이터베이스 운영의 많은 부분을 자동화 → 사용자가 성능 최적화, 확장, 백업, 복구 등을 쉽게 사용
  2. 고가용성
  3. 보안
  4. 확장성
  5. 통합 및 분석
  6. 백업 및 복구

기능

  • 클러스터 관리
  • 데이터베이스 사용자 관리 - 역할 기반 접근 제어(RBAC)를 통해 데이터베이스 사용자 관리
  • 보안 설정
  • 백업 및 복구
  • 모니터링 및 알림
  • 자동화된 업그레이드

🐒 MongoDB 기본 명령문

🌿 CRUD

1. Create

데이터베이스 삽입

insertOne() | insertMany()

db.collection.insertOne({name:"짱구", ...});	-- 단일 도큐먼트 삽입
db.collection.insertMany([{}, {}, ...]);	-- 여러 도큐먼트 동시 삽입 

삽입된 도큐먼트는 _id 필드를 자동으로 생성하거나 사용자가 제공할 수 있다

2. Read

데이터베이스 조회

find() | findOne()

db.users.find({age: {$gte: 30}});	
-- age가 30 이상인 모든 도큐먼트 조회

db.users.find({age: {$gte: 30}}, {name: 1, age: 1, _id: 0});	
--name과 age 필드만 반환

컬렉션에서 여러 도큐먼트를 조회할 때 사용

반환된 도큐먼트는 커서(cursor) 객체로 관리
조건에 맞는 여러 도큐먼트를 가져와야 할 때 적합

🌿 Index

기본인덱스 생성

createIndex()

db.collection.createIndex({name: 1});

복합인덱스

  • 여러 필드에 대해 인덱스를 생성할 수 있다
db.collection.createIndex({name: 1, age: -1});

고유인덱스

  • 중복값을 허용하지 않는 인덱스
db.collection.createIndex({email: 1}, {unique: true});

🌿 집계 프레임워크

aggregate()

파이프라인 단계를 통해 데이터 처리를 정의한다!

주요 집계 연산자

  • $match : 조건에 맞는 문서를 필터링
  • $group : 그룹화하여 집계 결과 생성
  • $sort : 정렬
  • $project : 출력할 필드 선택
  • .$limit, .$skip : 결과 문서의 수르 제한하거나 건너뜀
  • .$lookup : 다른 컬렉션과 조인

본 포스팅은 글로벌소프트웨어캠퍼스와 교보DTS가 함께 진행하는 챌린지입니다

profile
영차영차 😎

0개의 댓글