[CS] NoSQL

눈치없어·2025년 4월 8일

RDBMS와의 차이점을 중심으로한 NoSQL의 주요 특징과 다양한 NoSQL 유형의 데이터베이스 동작


RDBMS vs NoSQL: NoSQL의 특징

  • NoSQL = Not Only SQL
  • 테이블의 형태로 레코드를 저장하고 SQL로 다루는 RDBMS와는 달리 레코드를 다양한 형태로 저장할 수 있음
  • SQL 이외의 방법으로 저장된 데이터도 다룰 수 있음
  • 대표적인 NoSQL 데이터베이스 유형:
    - 키-값 데이터베이스
    - 도큐먼트 데이터베이스
    - 그래프 데이터베이스
    - 칼럼 패밀리 데이터베이스

📌 키-값 데이터베이스

  • 가장 단순한 형태의 NoSQL
  • 데이터를 Key: Value 쌍으로 저장
  • 대표 DB: Redis, Memcached
  • 구조가 단순하여 매우 빠른 접근 가능
  • 많은 경우, 데이터를 메모리에 저장
    - 인메모리 데이터베이스(In-memory DB)
  • 주로 캐시나 세션 저장소로 활용됨
  • 보조 데이터베이스로 사용되는 경우도 많음

📌 도큐먼트 데이터베이스

  • 데이터를 도큐먼트 단위로 저장
  • 대표 DB: MongoDB
  • 도큐먼트: = '정형화되어 있지 않은 NoSQL 레코드의 단위'를 통칭하기 위해 사용하는 언어
    - JSON, XML, BSON 형태의 구조화된 데이터
  • 스키마가 자유롭다 → 도큐먼트마다 구조가 달라도 무방
  • 하나의 도큐먼트 = 하나의 JSON 객체 = RDBMS의 행(Row)
  • 도큐먼트들의 집합 = 컬렉션(Collection) → RDBMS의 테이블과 유사

MongoDB에서 도큐먼트로 활용되는 'JSON 형태의 데이터'를 정확히 말하면 BSON(Binary JSON)이라고 함
형태는 JSON과 같음


📌 그래프 데이터베이스

  • 데이터를 노드(Node)간선(Edge)으로 표현
  • 대표 DB: Neo4j
  • 데이터 간의 관계를 빠르고 효율적으로 표현
  • 방향 그래프 기반 구조
  • SNS 친구 관계, 교통망, 추천 시스템 등
    - 연결성과 관계성이 중요한 데이터에 적합

📌 칼럼 패밀리 데이터베이스

  • 대표 DB: Cassandra, HBase
  • RDBMS처럼 행(Row)과 열(Column) 개념 존재
  • Row key로 레코드를 식별
  • 열(Column)이 동적으로 추가 가능 → 고정된 스키마가 없음
  • 열의 집합 → 칼럼 패밀리(Column Family)
  • 칼럼 패밀리의 집합 → 키스페이스(Keyspace) (DB의 최상위 단위)

📌 RDBMS vs NoSQL 차이점 요약

항목RDBMSNoSQL
데이터 구조테이블(정형화된 스키마)유연한 구조 (JSON, 키-값 등)
확장 방식수직적 확장(Scale-up)수평적 확장(Scale-out)
트랜잭션ACID 원칙 엄격히 준수일부만 보장 or 약한 일관성
쿼리 언어SQLSQL 외 다양한 방식
데이터 무결성높음낮을 수 있음
유형 예시MySQL, PostgreSQLRedis, MongoDB, Cassandra 등
적합한 용도금융, ERP, 정형데이터로그, 캐시, 비정형 데이터 등

NoSQL이 적합한 경우

  • 데이터 구조가 자주 변경되거나 비정형적일 때
  • 대규모 사용자 트래픽을 처리해야 할 때
  • 높은 확장성과 가용성이 필요한 서비스
  • 빠른 읽기/쓰기 성능이 요구되는 캐시, 실시간 분석, 세션 저장소 등

RDBMS이 적합한 경우

  • 정형화된 데이터를 안정적으로 관리해야 할 때
  • 데이터 무결성과 일관성이 중요한 경우 (예: 금융 시스템)
  • 복잡한 조인과 트랜잭션이 필요한 경우

NoSQL은 유연성과 성능에 초점을 맞춘 DB
RDBMS는 일관성과 안정성에 초점을 맞춘 DB
→ 둘 중 하나만 고집하기보다, 서비스 상황에 따라 유연하게 선택하는 것이 실무에서 중요



다양한 NoSQL: MongoDB와 Redis 맛보기

NoSQL 유형 중 사용 빈도가 높은 유형은 키-값 데이터베이스, 도큐먼트 데이터베이스

각각을 대표하는 RedisMongoDB의 데이터 삽입/수정/삭제/조회


MongoDB

  • MongoDB는 데이터를 도큐먼트(Document) 단위로 저장함
  • 도큐먼트들이 모여 컬렉션(Collection)을 이루고,
  • 컬렉션들이 모여 데이터베이스(Database)를 구성함

📌 주요 명령어

-- 데이터베이스 생성/사용
use mydb

-- 컬렉션 생성
db.createCollection("mycollection")

-- 데이터베이스 목록 확인
show dbs

-- 현재 DB의 컬렉션 목록 확인
show collections

-- 컬렉션 삭제
db.mycollection.drop()

📌 단일 레코드 삽입

db.mycollection.insertOne({ name: "Kim", age: 20 })

-- 실행결과
{
	acknowledged: true,
    insertedId: ObjectId('5vhai384jf89wzcn8') # 예시
}

실행 결과에 ObjectId는 도큐먼트마다 부여되는 고유한 값으로, 특정 도큐먼트를 식별할 수 있는 정보


JSON 형태의 도큐먼트는 변수 형태로도 사용 가능

var mydoc = { name: "Lee", age: 21, gender: "male" }
db.mycollection.insertOne(mydoc)

-- 실행결과
{
	acknowledged: true,
    insertedId: ObjectId('65y38bgt3489hg372') # 예시
}

도큐먼트를 mydoc에 저장하여 활용


-- 전체 조회
db.mycollection.find()

-- 조건 조회
db.mycollection.find({ name: "Kim" })

특정 컬렉션의 조회


📌 다중 레코드 삽입

MongoDB는 스키마가 유연해서, 필드 구성이 다른 레코드도 함께 저장 가능함

db.mycollection.insertMany([
  { name: "Park", age: 30 },
  { name: "Kang", age: 52, address: "Seoul" },
  { name: "Jang", hobbies: ["reading", "traveling"], age: 28 },
  { name: "Choi", gender: "male" }
])

📌 도큐먼트 갱신 (Update)

단일 도큐먼트 갱신

db.컬렉션이름.updateOne(
  { 조건 },                   // 어떤 도큐먼트를 바꿀지
  { $set: { 필드: 새값 } }     // 어떤 내용을 바꿀지
)

이름이 "Kang"인 도큐먼트의 age를 30으로 변경

db.mycollection.updateOne(
  { name: "Kang" },
  { $set: { age: 30 } }
)

여러 도큐먼트 갱신

db.컬렉션이름.updateMany(
  { 조건 },
  { $set: { 필드: 새값 } }
)

age가 20 이상인 도큐먼트의 status를 "active"로 변경

db.mycollection.updateMany(
 { age: { $gte: 20 } },
 { $set: { status: "active" } }
)
  • $gte는 "greater than or equal" (크거나 같다)
  • 해당 필드가 없으면 새로 생성됨

필드 삭제
특정 필드를 도큐먼트에서 제거하고 싶을 때 사용

age가 10 이상인 도큐먼트에서 status 필드 제거

db.mycollection.updateMany(
  { age: { $gte: 10 } },
  { $unset: { status: "" } }
)

📌 도큐먼트 삭제

단일 도큐먼트 삭제

db.컬렉션이름.deleteOne(
  { 조건 }
)

name이 "Lee"인 도큐먼트 삭제

db.mycollection.deleteOne({ name: "Lee" })

여러 도큐먼트 삭제

db.컬렉션이름.deleteMany(
  { 조건 }
)

age가 20 이상인 도큐먼트 모두 삭제

db.mycollection.deleteMany({ age: { $gte: 20 } })

📌 MongoDB의 연산자

MongoDB에서는 다양한 도큐먼트를 효율적으로 다루기 위해 다양한 연산자를 제공


Redis

  • Redis는 대표적인 키-값 기반 NoSQL 데이터베이스이자, 데이터를 메모리에 저장하는 인메모리 데이터베이스
  • 다양한 자료형을 지원하며, 기본적인 데이터는 Key : Value 형태로 저장됨
  • 주로 캐시, 세션 관리, 실시간 처리에 자주 사용됨


📌 Redis 문자열 타입의 값 대표적인 명령


문자열 저장

127.0.0.1:6379> SET k1 "Thank You"
OK

키가 있을 경우 저장 실패 (SETNX)

127.0.0.1:6379> SETNX k1 "For Reading This Book"
(integer) 0   # 저장 실패

127.0.0.1:6379> SETNX k2 "For Reading This Book"
(integer) 1   # 저장 성공

키 조회

127.0.0.1:6379> GET k1
"Thank You"

127.0.0.1:6379> MGET k1 k2
1) "Thank You"
2) "For Reading This Book"

키 삭제

127.0.0.1:6379> DEL k2
(integer) 1

127.0.0.1:6379> GET k2
(nil)

📌 Redis 리스트 타입의 값 대표적인 명령


요소 추가

127.0.0.1:6379> LPUSH 1k "Computer"
(integer) 1

127.0.0.1:6379> LPUSH 1k "This was"
(integer) 2

127.0.0.1:6379> RPUSH 1k "Science"
(integer) 3

결과 리스트: ["This was", "Computer", "Science"]


리스트 전체 조회

127.0.0.1:6379> LRANGE 1k 0 -1
1) "This was"
2) "Computer"
3) "Science"

리스트 길이 확인

127.0.0.1:6379> LLEN 1k
(integer) 3

앞쪽 요소 제거 (LPOP)

127.0.0.1:6379> LPOP 1k
"This was"

127.0.0.1:6379> LRANGE 1k 0 -1
1) "Computer"
2) "Science"

뒤쪽 요소 제거 (RPOP)

127.0.0.1:6379> RPOP 1k
"Science"

127.0.0.1:6379> LRANGE 1k 0 -1
1) "Computer"


Redis vs MongoDB 비교

항목RedisMongoDB
저장 구조Key : Value도큐먼트 (JSON)
속도매우 빠름 (메모리 기반)상대적으로 느림 (디스크 기반)
주 용도캐시, 세션, 임시 저장일반 데이터 저장, 복잡한 구조
자료형문자열, 리스트 등자유로운 JSON 구조
확장성좋음 (수평 확장 용이)좋음 (샤딩 지원)



참고: 북스터디 - 이것이 취업을 위한 컴퓨터 과학이다 (Chapter 6-6)

profile
dock 사이즈 다르잖아

0개의 댓글