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

MongoDB에서 도큐먼트로 활용되는 'JSON 형태의 데이터'를 정확히 말하면 BSON(Binary JSON)이라고 함
형태는 JSON과 같음
| 항목 | RDBMS | NoSQL |
|---|---|---|
| 데이터 구조 | 테이블(정형화된 스키마) | 유연한 구조 (JSON, 키-값 등) |
| 확장 방식 | 수직적 확장(Scale-up) | 수평적 확장(Scale-out) |
| 트랜잭션 | ACID 원칙 엄격히 준수 | 일부만 보장 or 약한 일관성 |
| 쿼리 언어 | SQL | SQL 외 다양한 방식 |
| 데이터 무결성 | 높음 | 낮을 수 있음 |
| 유형 예시 | MySQL, PostgreSQL | Redis, MongoDB, Cassandra 등 |
| 적합한 용도 | 금융, ERP, 정형데이터 | 로그, 캐시, 비정형 데이터 등 |
NoSQL이 적합한 경우
RDBMS이 적합한 경우
NoSQL은 유연성과 성능에 초점을 맞춘 DB
RDBMS는 일관성과 안정성에 초점을 맞춘 DB
→ 둘 중 하나만 고집하기보다, 서비스 상황에 따라 유연하게 선택하는 것이 실무에서 중요
NoSQL 유형 중 사용 빈도가 높은 유형은 키-값 데이터베이스, 도큐먼트 데이터베이스
각각을 대표하는 Redis와 MongoDB의 데이터 삽입/수정/삭제/조회
-- 데이터베이스 생성/사용
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" }
])
단일 도큐먼트 갱신
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에서는 다양한 도큐먼트를 효율적으로 다루기 위해 다양한 연산자를 제공



문자열 저장
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)

요소 추가
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 | MongoDB |
|---|---|---|
| 저장 구조 | Key : Value | 도큐먼트 (JSON) |
| 속도 | 매우 빠름 (메모리 기반) | 상대적으로 느림 (디스크 기반) |
| 주 용도 | 캐시, 세션, 임시 저장 | 일반 데이터 저장, 복잡한 구조 |
| 자료형 | 문자열, 리스트 등 | 자유로운 JSON 구조 |
| 확장성 | 좋음 (수평 확장 용이) | 좋음 (샤딩 지원) |
참고: 북스터디 - 이것이 취업을 위한 컴퓨터 과학이다 (Chapter 6-6)