NoSQL 데이터베이스란?
NoSQL(Not Only SQL) 데이터베이스는 관계형 데이터베이스의 제약을 벗어나 다양한 형태의 데이터를 저장하고 처리할 수 있는 데이터베이스입니다. 스키마가 유연하고 수평 확장이 가능하여 대용량 데이터 처리에 적합합니다.
NoSQL 데이터베이스는 데이터 모델에 따라 5가지 주요 유형으로 분류됩니다. 각 유형은 고유한 특성과 최적화된 사용 사례를 가지고 있어, 애플리케이션의 요구사항에 따라 적절한 선택이 중요합니다.
핵심 개념
1. 키-값 데이터베이스 (Key-Value)
키-값 데이터베이스는 가장 단순한 NoSQL 모델로, 고유한 키와 값의 쌍으로 데이터를 저장합니다.
// Redis를 활용한 키-값 저장 예시
interface UserSession {
userId: string;
loginTime: number;
preferences: object;
}
class SessionStore {
private redis: RedisClient;
async setSession(sessionId: string, data: UserSession): Promise<void> {
await this.redis.setex(sessionId, 3600, JSON.stringify(data));
}
async getSession(sessionId: string): Promise<UserSession | null> {
const data = await this.redis.get(sessionId);
return data ? JSON.parse(data) : null;
}
}
주요 특징:
- 매우 빠른 읽기/쓰기 성능
- 단순한 구조로 높은 처리량 지원
- 메모리 기반 저장으로 낮은 지연 시간
활용 사례: 세션 저장, 캐시, 실시간 순위, 장바구니 데이터 대표 제품: Redis, Amazon DynamoDB, Riak
2. 문서 지향 데이터베이스 (Document)
문서 지향 데이터베이스는 JSON, BSON, XML 형식으로 반구조화된 데이터를 저장합니다.
// MongoDB를 활용한 문서 저장 예시
interface BlogPost {
_id?: string;
title: string;
content: string;
author: {
name: string;
email: string;
};
tags: string[];
createdAt: Date;
comments: Array<{
author: string;
content: string;
timestamp: Date;
}>;
}
class BlogRepository {
async createPost(post: BlogPost): Promise<string> {
const result = await db.collection('posts').insertOne({
...post,
createdAt: new Date()
});
return result.insertedId.toString();
}
async findPostsByTag(tag: string): Promise<BlogPost[]> {
return await db.collection('posts')
.find({ tags: { $in: [tag] } })
.sort({ createdAt: -1 })
.toArray();
}
}
주요 특징:
- 유연한 스키마 구조
- 복잡한 중첩 데이터 표현 가능
- 쿼리 언어로 복잡한 검색 지원
활용 사례: 콘텐츠 관리, 사용자 프로필, 카탈로그 시스템 대표 제품: MongoDB, CouchDB, Amazon DocumentDB
3. 열 지향 데이터베이스 (Column Family)
열 지향 데이터베이스는 데이터를 열 단위로 저장하여 대량 데이터 처리에 최적화되어 있습니다.
// Cassandra를 활용한 열 지향 저장 예시
interface TimeSeriesData {
sensor_id: string;
timestamp: Date;
temperature: number;
humidity: number;
location: string;
}
class IoTDataRepository {
async insertSensorData(data: TimeSeriesData): Promise<void> {
const query = `
INSERT INTO sensor_data (sensor_id, timestamp, temperature, humidity, location)
VALUES (?, ?, ?, ?, ?)
`;
await cassandraClient.execute(query, [
data.sensor_id,
data.timestamp,
data.temperature,
data.humidity,
data.location
]);
}
async getRecentData(sensorId: string, hours: number): Promise<TimeSeriesData[]> {
const query = `
SELECT * FROM sensor_data
WHERE sensor_id = ? AND timestamp > ?
ORDER BY timestamp DESC
`;
const cutoffTime = new Date(Date.now() - hours * 60 * 60 * 1000);
const result = await cassandraClient.execute(query, [sensorId, cutoffTime]);
return result.rows;
}
}
주요 특징:
- 대량 데이터 처리에 특화
- 행마다 다른 열 구조 허용
- 뛰어난 압축률과 분석 성능
활용 사례: 로그 수집, 대용량 데이터 분석, IoT 데이터 저장 대표 제품: Apache Cassandra, HBase, Amazon SimpleDB
4. 그래프 데이터베이스 (Graph)
그래프 데이터베이스는 노드와 엣지로 구성된 그래프 구조로 복잡한 관계를 효율적으로 표현합니다.
// Neo4j를 활용한 그래프 데이터 예시
interface User {
id: string;
name: string;
email: string;
}
interface Relationship {
type: 'FOLLOWS' | 'LIKES' | 'SHARES';
properties?: Record<string, any>;
}
class SocialNetworkService {
async createUser(user: User): Promise<void> {
const query = `
CREATE (u:User {id: $id, name: $name, email: $email})
RETURN u
`;
await neo4jSession.run(query, user);
}
async createFollowRelationship(followerId: string, followeeId: string): Promise<void> {
const query = `
MATCH (follower:User {id: $followerId})
MATCH (followee:User {id: $followeeId})
CREATE (follower)-[:FOLLOWS {createdAt: datetime()}]->(followee)
`;
await neo4jSession.run(query, { followerId, followeeId });
}
async findMutualFriends(userId1: string, userId2: string): Promise<User[]> {
const query = `
MATCH (u1:User {id: $userId1})-[:FOLLOWS]->(mutual)<-[:FOLLOWS]-(u2:User {id: $userId2})
RETURN mutual
`;
const result = await neo4jSession.run(query, { userId1, userId2 });
return result.records.map(record => record.get('mutual').properties);
}
}
주요 특징:
- 복잡한 관계 쿼리에 최적화
- 그래프 알고리즘 내장 지원
- 관계 중심의 데이터 모델링
활용 사례: 소셜 네트워크, 추천 시스템, 사기 탐지, 지식 그래프 대표 제품: Neo4j, Amazon Neptune, ArangoDB
5. 시계열 데이터베이스 (Time Series)
시계열 데이터베이스는 시간에 따라 변화하는 데이터를 효율적으로 저장하고 분석합니다.
// InfluxDB를 활용한 시계열 데이터 예시
interface MetricPoint {
measurement: string;
tags: Record<string, string>;
fields: Record<string, number>;
timestamp?: Date;
}
class MetricsService {
async writeMetric(point: MetricPoint): Promise<void> {
const writePoint = Point
.measurement(point.measurement)
.timestamp(point.timestamp || new Date())
.tag('host', point.tags.host)
.tag('region', point.tags.region)
.floatField('cpu_usage', point.fields.cpu_usage)
.floatField('memory_usage', point.fields.memory_usage);
await influxWriteApi.writePoint(writePoint);
}
async getAverageMetrics(
measurement: string,
timeRange: string,
groupBy: string
): Promise<any[]> {
const query = `
from(bucket: "metrics")
|> range(start: -${timeRange})
|> filter(fn: (r) => r._measurement == "${measurement}")
|> group(columns: ["${groupBy}"])
|> aggregateWindow(every: 1m, fn: mean)
`;
const result = await influxQueryApi.collectRows(query);
return result;
}
}
주요 특징:
- 시간 기반 인덱싱 최적화
- 자동 데이터 압축 및 보관 정책
- 시계열 분석 함수 내장
활용 사례: 모니터링, IoT 데이터 수집, 금융 데이터 분석, 성능 메트릭 대표 제품: InfluxDB, Prometheus, TimescaleDB
정리
| 데이터베이스 유형 | 주요 특징 | 최적 사용 사례 | 대표 제품 |
|---|---|---|---|
| 키-값 | 단순한 구조, 빠른 성능 | 캐시, 세션, 실시간 데이터 | Redis, DynamoDB |
| 문서 | 유연한 스키마, JSON 저장 | CMS, 사용자 프로필, 카탈로그 | MongoDB, CouchDB |
| 열 지향 | 대량 데이터 처리 특화 | 로그 분석, 빅데이터 처리 | Cassandra, HBase |
| 그래프 | 관계 중심 모델링 | 소셜 네트워크, 추천 시스템 | Neo4j, Neptune |
| 시계열 | 시간 기반 최적화 | 모니터링, IoT, 금융 데이터 | InfluxDB, Prometheus |
각 NoSQL 데이터베이스 유형은 서로 다른 강점을 가지고 있습니다. 프로젝트의 요구사항에 따라 적절한 유형을 선택하거나, 복합적인 시스템에서는 여러 유형을 조합하여 사용할 수 있습니다. 특히 실시간 채팅과 같은 애플리케이션에서는 Redis(메시지 브로커)와 MongoDB(영구 저장)를 함께 활용하는 것이 효과적입니다.