메인 콘텐츠로 건너뛰기
Deep Thought
← 목록으로
Backend

NoSQL 데이터베이스의 5가지 유형과 활용 사례

신중선-- views
nosqldatabasebackenddata-storagescalability

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(영구 저장)를 함께 활용하는 것이 효과적입니다.

References