Post

8. 최신 트렌드

8. 최신 트렌드

NoSQL

NoSQL이란?

1
2
3
4
Not Only SQL
- 관계형 모델(테이블)이 아닌 다양한 데이터 모델 사용
- 대규모 분산 환경에서의 확장성과 유연성에 초점
- 스키마가 유연하거나 없음 (Schema-less / Schema-flexible)

RDBMS vs NoSQL

구분RDBMSNoSQL
데이터 모델테이블 (행/열)문서, Key-Value, 컬럼, 그래프
스키마고정 (정의 후 사용)유연 (동적 변경)
확장 방식수직 확장 (Scale-Up)수평 확장 (Scale-Out)
트랜잭션ACID 보장BASE (Eventual Consistency)
조인지원제한적 / 미지원
일관성강한 일관성최종 일관성 (설정 가능)
적합 분야복잡한 관계, 트랜잭션대용량, 빠른 읽기/쓰기

NoSQL 유형

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
31
32
33
34
35
36
1. Key-Value Store
   - 가장 단순한 모델: (key, value) 쌍
   - 빠른 읽기/쓰기, 캐시에 적합
   - 예: Redis, Amazon DynamoDB, Memcached

   SET user:1001 "{'name':'홍길동','dept':'CS'}"
   GET user:1001

2. Document Store
   - JSON/BSON 형태의 문서 저장
   - 문서마다 다른 구조 가능 (유연한 스키마)
   - 예: MongoDB, CouchDB

   {
     "_id": "1001",
     "name": "홍길동",
     "dept": "CS",
     "courses": ["DB", "OS", "Network"]
   }

3. Column-Family Store
   - 행 키 + 컬럼 패밀리로 데이터 구성
   - 대규모 데이터 분석에 적합
   - 예: Apache Cassandra, HBase

   RowKey: user1001
     personal: {name: "홍길동", age: 22}
     academic: {dept: "CS", grade: 4}

4. Graph Database
   - 노드(Node)와 엣지(Edge)로 관계 표현
   - 소셜 네트워크, 추천 시스템에 적합
   - 예: Neo4j, Amazon Neptune

   (홍길동)-[:FRIEND]->(김영희)
   (홍길동)-[:ENROLLED]->(DB수업)

Redis

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
- 인메모리 Key-Value Store
- 매우 빠른 읽기/쓰기 (마이크로초 단위)
- 다양한 자료 구조 지원: String, List, Set, Hash, Sorted Set

주요 사용:
  - 캐시 (가장 일반적)
  - 세션 저장
  - 실시간 랭킹/리더보드
  - 메시지 큐 (Pub/Sub)
  - 분산 락

기본 명령어:
  SET key value
  GET key
  DEL key
  EXPIRE key seconds    -- TTL 설정
  HSET hash field value -- Hash 타입
  LPUSH list value      -- List 타입
  SADD set member       -- Set 타입
  ZADD sorted_set score member  -- Sorted Set

주의:
  - 메모리 기반 → 메모리 용량 제한
  - 영속성: RDB 스냅샷, AOF 로그 (설정에 따라)
  - 단일 스레드 (6.0부터 I/O 멀티스레딩)

MongoDB

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
31
32
33
34
35
36
37
38
39
40
41
42
- 문서(Document) 기반 NoSQL
- JSON 유사 형태 (BSON으로 저장)
- 유연한 스키마: 같은 컬렉션의 문서가 다른 필드를 가질 수 있음

구조:
  RDBMS     →  MongoDB
  Database  →  Database
  Table     →  Collection
  Row       →  Document
  Column    →  Field
  JOIN      →  Embedded / $lookup

기본 CRUD:
  // 삽입
  db.students.insertOne({
    name: "홍길동",
    dept: "CS",
    grade: 4
  });

  // 조회
  db.students.find({ dept: "CS" });
  db.students.find({ grade: { $gte: 3 } });

  // 수정
  db.students.updateOne(
    { name: "홍길동" },
    { $set: { grade: 4 } }
  );

  // 삭제
  db.students.deleteOne({ name: "홍길동" });

  // 집계
  db.students.aggregate([
    { $match: { dept: "CS" } },
    { $group: { _id: "$grade", count: { $sum: 1 } } }
  ]);

인덱스:
  db.students.createIndex({ name: 1 });     // 단일 인덱스
  db.students.createIndex({ dept: 1, grade: -1 }); // 복합 인덱스

CAP 정리

CAP 정리란?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
분산 시스템에서 다음 3가지를 동시에 만족할 수 없다 (최대 2가지):

C (Consistency, 일관성)
  - 모든 노드가 같은 시점에 같은 데이터를 봄
  - 읽기는 항상 최신 쓰기의 결과를 반환

A (Availability, 가용성)
  - 모든 요청이 (성공/실패) 응답을 받음
  - 장애가 없는 노드는 항상 응답

P (Partition Tolerance, 분할 허용)
  - 네트워크 분할(노드 간 통신 불가)이 발생해도 시스템이 동작

실제로는 네트워크 분할(P)은 피할 수 없으므로
C와 A 중 하나를 선택:
  CP: 일관성 우선 (일부 요청 거부 가능)
  AP: 가용성 우선 (일시적 불일치 허용)

CAP 분류

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CP 시스템 (일관성 + 분할 허용):
  - 분할 발생 시 일관성을 위해 일부 요청 거부
  - 예: MongoDB (Primary 장애 시 선출까지 쓰기 불가)
  - 예: HBase, Zookeeper

AP 시스템 (가용성 + 분할 허용):
  - 분할 발생 시 가용성을 위해 일시적 불일치 허용
  - 예: Cassandra, DynamoDB, CouchDB
  - 최종 일관성 (Eventual Consistency)

CA 시스템 (일관성 + 가용성):
  - 분할을 허용하지 않음 → 단일 노드 시스템
  - 예: 전통적 RDBMS (단일 서버)
  - 분산 환경에서는 사실상 불가능

BASE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NoSQL의 일관성 모델. ACID의 대안.

BA (Basically Available)
  - 기본적으로 가용: 항상 응답을 반환
  - 일부 노드 장애에도 시스템은 동작

S (Soft State)
  - 시간이 지남에 따라 상태가 변할 수 있음
  - 외부 입력 없이도 데이터 변경 가능 (동기화)

E (Eventually Consistent)
  - 최종적 일관성: 충분한 시간이 지나면 모든 복제본이 일치
  - 일시적 불일치 허용

ACID vs BASE:
  ACID → 강한 일관성, 트랜잭션 보장 (금융, 결제)
  BASE → 높은 가용성, 최종 일관성 (SNS, 로그, 캐시)

분산 데이터베이스

분산 DB 개념

1
2
3
4
5
6
7
8
9
10
11
데이터를 여러 노드에 분산 저장하고 관리하는 시스템

장점:
  - 수평 확장 (Scale-Out): 노드 추가로 성능/용량 증가
  - 고가용성: 복제를 통해 단일 장애점 제거
  - 지역성: 사용자 가까운 노드에서 서비스

단점:
  - 일관성 유지 어려움
  - 네트워크 지연
  - 설계/운영 복잡도 증가

데이터 분산 전략

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
1. 샤딩 (Sharding) = 수평 분할
   - 데이터를 여러 노드에 나누어 저장
   - 각 노드가 데이터의 일부(샤드)를 담당

   샤딩 키 기준으로 분배:
   ├── 범위 기반 (Range): id 1~1000 → 노드1, 1001~2000 → 노드2
   ├── 해시 기반 (Hash): hash(id) % N → 노드 결정
   └── 디렉토리 기반: 매핑 테이블로 관리

   해시 샤딩 vs 범위 샤딩:
   - 해시: 균등 분배, 범위 쿼리 어려움
   - 범위: 범위 쿼리 용이, 핫스팟 가능

2. 복제 (Replication)
   - 같은 데이터를 여러 노드에 복제
   ├── 마스터-슬레이브: 쓰기는 마스터만, 읽기는 슬레이브도
   ├── 마스터-마스터: 여러 노드에서 쓰기 가능 (충돌 해결 필요)
   └── Quorum 기반: W + R > N이면 일관성 보장

   Quorum:
     N = 전체 복제본 수
     W = 쓰기 시 응답 필요한 노드 수
     R = 읽기 시 응답 필요한 노드 수
     W + R > N → 강한 일관성
     예: N=3, W=2, R=2 → 항상 최신 데이터 읽기 보장

분산 트랜잭션

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2PC (Two-Phase Commit):
  준비 단계 (Prepare): 코디네이터가 참여자에게 커밋 준비 요청
  커밋 단계 (Commit): 모든 참여자가 준비 완료하면 커밋 명령

  ┌────────────┐         ┌────────────┐
  │ Coordinator│         │ Participant│
  │            │ Prepare │            │
  │            │────────→│            │
  │            │  Ready  │            │
  │            │←────────│            │
  │            │ Commit  │            │
  │            │────────→│            │
  │            │  ACK    │            │
  │            │←────────│            │
  └────────────┘         └────────────┘

  단점: 코디네이터 장애 시 블로킹, 성능 오버헤드
  → 분산 환경에서는 Saga 패턴 등 대안 사용

NewSQL

1
2
3
4
5
6
7
8
9
10
11
12
RDBMS의 ACID + NoSQL의 확장성을 결합

특징:
  - SQL 인터페이스 (기존 RDBMS와 호환)
  - ACID 트랜잭션 보장
  - 수평 확장 가능 (분산 아키텍처)

예시:
  - Google Spanner: 글로벌 분산, 외부 일관성
  - CockroachDB: Spanner 영감, PostgreSQL 호환
  - TiDB: MySQL 호환, Raft 기반 복제
  - VoltDB: 인메모리, 고성능 트랜잭션

핵심 정리

1
2
3
4
5
6
7
1. NoSQL: Key-Value, Document, Column-Family, Graph
2. Redis: 인메모리 캐시, 다양한 자료 구조
3. MongoDB: 문서 기반, 유연한 스키마
4. CAP 정리: C/A/P 중 최대 2개 (실질적으로 CP 또는 AP 선택)
5. BASE: 최종 일관성 (ACID의 대안)
6. 샤딩: 수평 분할 (해시/범위), 복제: 가용성/읽기 성능
7. NewSQL: ACID + 수평 확장 (Spanner, CockroachDB)

면접 포인트

자주 나오는 질문

Q1. RDBMS와 NoSQL의 차이는?

  • RDBMS: 테이블 기반, 고정 스키마, ACID, 복잡한 JOIN 가능
  • NoSQL: 다양한 모델, 유연한 스키마, BASE, 수평 확장 용이
  • 정답은 없음 → 요구사항에 따라 선택 (트랜잭션 중요 → RDBMS, 확장성/속도 → NoSQL)

Q2. CAP 정리를 설명하라.

  • 분산 시스템에서 일관성(C), 가용성(A), 분할 허용(P) 중 최대 2가지만 만족
  • P는 불가피 → 실질적으로 CP(일관성 우선) vs AP(가용성 우선) 선택
  • CP: MongoDB, HBase / AP: Cassandra, DynamoDB

Q3. Redis를 주로 어디에 사용하는가?

  • 캐시: DB 앞에서 자주 조회되는 데이터 캐싱
  • 세션 저장: 웹 애플리케이션 세션 관리
  • 실시간 랭킹: Sorted Set으로 리더보드
  • 메시지 큐: Pub/Sub, Stream
  • 주의: 메모리 기반이므로 용량 제한, 영속성 설정 필요

Q4. 샤딩이란?

  • 데이터를 여러 노드에 수평 분할하여 저장
  • 샤딩 키에 따라 각 데이터가 어느 노드에 저장될지 결정
  • 해시 샤딩: 균등 분배, 범위 쿼리 어려움
  • 범위 샤딩: 범위 쿼리 용이, 핫스팟 위험

Q5. 최종 일관성(Eventual Consistency)이란?

  • 일시적으로 복제본 간 데이터가 다를 수 있지만, 충분한 시간이 지나면 동일해짐
  • SNS 게시글, 좋아요 수 등 즉시 일관성이 필요 없는 경우에 적합
  • 강한 일관성보다 가용성과 성능이 우수

Q6. RDBMS를 언제 선택하고 NoSQL을 언제 선택하는가?

  • RDBMS: 데이터 관계가 복잡, 트랜잭션 필수, 일관성 중요 (금융, 주문)
  • NoSQL: 대용량 데이터, 빠른 읽기/쓰기, 스키마 변경 빈번 (로그, SNS, IoT)
  • 하이브리드: RDBMS + Redis 캐시 조합이 실무에서 흔함
This post is licensed under CC BY 4.0 by the author.