01_NoSQL
📍 NoSQL
Not Only SQL
비관계형 데이터베이스
대규모 데이터 처리나 빠른 읽기/쓰기가 필요한 경우에 사용
다양한 데이터 모델 처리
| 유형 | 예시 DB | 예시 상황 |
| 키-값 | Redis | 로그인 세션 저장 |
| 문서 | MongoDB | 상품 상세페이지 정보 |
| 컬럼 기반 | Cassandra | 센서 로그, 시계열 데이터 |
| 그래프 | Neo4j | “친구의 친구 추천” 기능 |
특징
유연한 스키마
키-값, 문서, 컬럼, 그래프 등 다양한 데이터 모델 지원
서버 증설로 성능 향상 용이(수평적 확장)
여러 서버에 데이터를 분산하여 안정적인 서비스 유지
대량의 비정형 데이터 처리에 최적화
RDBMS와 NoSQL DBMS 비교
- RDBMS
- 테이블 형식으로 데이터 저장(행-열 구성)
- 저장 전에 미리 정의된 스키마 따라야 하므로 스키마 변경이 어려움
- 데이터를 테이블 간의 관계로 연결(외래 키를 사용하여 조인)
- 수직적 확장 방식
- 고도로 정형화된 데이터를 다루거나 복잡한 트랜잭션과 조인이 필수적인 경우
- NoSQL DBMS
- 고정된 스키마 없이 자유롭게 데이터 저장
- 데이터 구조를 동적으로 변경하고 새로운 데이터 추가 용이
- 조인 없이 데이터 중복 저장 허용
- 수평적 확장 방식
02_MongoDB
📍 MongoDB
문서 지향(Document-oriented) 데이터베이스
BSON(Binary JSON) 형식으로 데이터 저장

구조
- Document
- RDBMS의 행(row)에 해당. 키-값 쌍으로 구성된 데이터 저장 기본 단위
- Collection
- RDBMS의 테이블에 해당. Document들의 집합
- Database
- Collection들의 집합
- _id
- RDBMS의 기본 키에 해당. 각 Document를 고유하게 식별하는 값
📍 BASE(Basically Available, Soft state, Eventual consistency)
ACID보다 느슨한 일관성 모델로, 높은 가용성과 분산 시스템에 적합한 성능이 목표
1. Basically Available
시스템은 항상 응답을 제공하며 일시적인 고장이나 네트워크 지연에도 높은 가용성 유지
2. Soft state
시스템의 상태는 시간에 따라 변할 수 있으며 일관성이 항상 보장되지 않음
3. Eventual consistency
시스템은 일정 시간이 지난 후에야 최종적으로 일관된 상태를 달성
📍 MongoDB 문법
초기 설정
- build.gradle
implementation ‘org.springframework.boot:spring-boot-starter-data-mongodb'
- application.yml
data:
mongodb:
host: localhost
port: 27017
database: db_name
데이터베이스 및 컬렉션
- 데이터베이스 생성 및 선택
use database_name // 데이터베이스 선택, 없다면 새로 생성
- 컬렉션 생성
db.createCollection("collection_name")
- 컬렉션 삭제
db.collection_name.drop()
문서 삽입
- 단일 문서 삽입
db.collection_name.insertOne({
key1: "value1", k
key2: "value2",
})
- 여러 문서 삽입
db.collection_name.insertMany([
{key1: "value1",key2: "value2"},
{key1: "value3",key2: "value4"}
])
문서 조회
문서 조회 find()에서 첫 번째 인자는 필터 조건, 두 번째 인자는 조회할 필드
- 모든 문서 조회
db.collection_name.find()
- 조건문 문서 조회
db.collection_name.find({key: "value"})
- 특정 필드만 조회
db.collection_name.find({}, {key1: 1, key2: 1})
문서 수정
문서 수정 updateOne(), updateMany()에서 첫 번째 인자는 필터 조건, 두 번째 인자는 업데이트할 필드
- 단일 문서 업데이트
db.collection_name.updateOne(
{filter_key: "filter_value"},
{$set: {key_to_update: "new_value"}}
)
- 여러 문서 업데이트
db.collection_name.updateMany(
{filter_key: "filter_value"},
{$set: {key_to_update: "new_value"}}
)
문서 삭제
- 단일 문서 삭제
db.collection_name.deleteOne({key: "value"})
- 여러 문서 삭제
db.collection_name.deleteMany({key: "value"})
인덱스 생성
- 단일 필드 인덱스 생성
db.collection_name.createIndex({key: 1}) // 오름차순 인덱스
- 복합 인덱스 생성
db.collection_name.createIndex({key1: 1, key2: -1}) // key1 오름차순, key2 내림차순 인덱스
집계 파이프라인
- 기본적인 집계 쿼리
db.collection_name.aggregate([
{$match:{key: "value"}}, // 조건(filter)
{$group:{_id: "$group_key", total:{$sum: "$amount"}}} // 그룹화 및 합계
]);
MongoDB에는 RDBMS의 JOIN과 같은 기능이 기본적으로 없음
집계 파이프라인의 $lookup 연산자를 사용해 다른 컬렉션의 데이터를 참조할 수 있음
// orders 컬렉션
[
{"_id": 1,"customer_id": 1,"amount": 100},
{"_id": 2,"customer_id": 2,"amount": 200},
{"_id": 3,"customer_id": 3,"amount": 150}
]
// customers 컬렉션
[
{"_id": 1,"name": "Alice"},
{"_id": 2,"name": "Bob"}
// 고객 ID3의 정보는 없음
]
db.orders.aggregate([
{
$lookup:{
from: "customers", // 조인할 컬렉션 이름
localField: "customer_id", // orders 컬렉션의 필드
foreignField: "_id", // customers 컬렉션의 필드
as:"customer_info" // 결과에 추가할 필드 이름
}
},
{
$unwind:{
path: "$customer_info", // 조인된 결과를 펼침
preserveNullAndEmptyArrays: true
// 고객 정보가 없는 경우에도 포함
}
}
])
📍 스키마 설계
application 관점에서 수행되는 query의 성능을 고려해 유연한 설계를 할 것
함께 조회되는 데이터는 한 곳에
읽기 전용 데이터와 쓰기 전용 데이터 분리
- Reference: 다른 컬렉션의 문서를 _id를 통해 참조하는 방식 (데이터 정규화)
- Embed: 관련된 문서를 통째로 내장하는 방식 (데이터 비정규화)
- 적은 Many는 Embed
- 관계의 수가 적은 One-to-Many 관계일 경우, 문서 내에 배열 형태로 다른 문서를 Embed하는 방식이 효과적
- 많은 Many는 Reference
- 관계의 수가 많은 Many-to-Many 관계일 경우, Embed 방식은 문서의 크기를 지나치게 키울 수 있음
- 별도의 컬렉션에 문서를 두고 Reference하는 것이 바람직함
03_Redis
📍 Redis
Remote Dictionary Server
키-값(Key-Value) 구조의 데이터를 저장하고 관리하는 비관계형 데이터베이스
인메모리 방식(데이터 저장과 처리를 디스크가 아닌 RAM에서 수행)
캐시, 세션 저장소, 메시지 브로커, 실시간 분석 및 통계, 분산 락에서 사용
구조
- Key
- 데이터에 접근하는 기본 단위(각 키는 고유함)
- Value
- 각 키에 연결된 실제 데이터
- 문자열, JSON, 바이너리 데이터 등 다양한 형식으로 저장할 수 있음
- DB
- Redis는 여러 개의 데이터베이스를 생성할 수 있음
📍 Redis 설치 (Mac)
- 설치
brew instal redis
- 서버 시작
redis-server
- 서버 확인
redis-cli ping (PONG 응답을 받으면 정상적으로 작동 중)
- 서버 정지
redis-cli shutdown
- CLI 접속
redis-cli -h {접속할 호스트} -p {접속할 포트} -a {비밀번호}
초기 설정
- build.gradle
implementation ‘org.springframework.boot:spring-boot-starter-data-redis'
- application.yml
cache:
type: redis
data:
redis:
host: localhost
port: 6379
'Back-end > DB' 카테고리의 다른 글
| [데이터베이스] SQL 질의 - 조인(JOIN), 부속질의(Subquery), 집합 연산 (0) | 2024.05.30 |
|---|---|
| [데이터베이스] 데이터 조작어(DML) - INSERT, UPDATE, DELETE, SELECT (0) | 2024.04.29 |
| [데이터베이스] 데이터 정의어(DDL) - CREATE, ALTER, DROP (0) | 2024.04.29 |
| [데이터베이스] SQL 개요, 데이터베이스 명령어 - CREATE, SHOW, USE, DROP (0) | 2024.04.29 |
| [SQL] 테이블에서 데이터 검색 - SELECT, DECS, 행 열 지정, 연산자, LIKE (0) | 2023.11.24 |