비관계형 데이터베이스
비관계형 데이터베이스가 무엇인지, 어떤종류가 있는지, 왜 필요한지에 대해서 다룹니다.
또한 주요 사용사례를 학습하여 추후 NoSQL Database를 도입할 판단 근거를 마련합니다.
등장 배경
전통적인 관계형 데이터베이스는 정형화된 구조로 데이터를 저장하고 SQL로 표준화된 언어로 데이터를 관리할 수 있었습니다.
높은 정합성을 제공하고 쿼리를 인관성있게 처리하기에 뛰어난 성능을 보였습니다.
하지만 웹, 모바일 환경등 다양한 환경으로 서비스가 확장되고 데이터의 양이 폭발적으로 증가하면서 여러 문제가 발생했습니다.
확장성 요구
기존 RDBMS는 주로 수직적 확장에 주로 의존했습니다.
하지만 비용과 안정성 측면에서 수평적 확장의 필요성이 늘어났고 비관계형 DB는 수평적 확장에 열려있다는 장점이 대두되었습니다.
데이터의 다양성, 유연한 스키마
정형화된 데이터를 다룰때 RDBMS는 굉장히 강점이 있었지만 현대 애플리케이션은 요구사항이 빈번하게 바뀌고 비정형 데이터가 넘쳐나는 문제가 발생했습니다.
웹 서비스에서는 사용자 프로필 정보가 매일 달라지고, 로그나 데이터, 소셜 미디어게시물과 같이 데이터의 구조가 가지각색인 경우가 많습니다.
이런경우 문서기반 저장소나 키값 기반 비관계형 DB는 데이터를 스키마 정의 없이 저장하거나 유연하게 변경하면서 문제를 해결할 수 있습니다.
고성능 실시간 처리
실시간 분석, 캐싱, 세션 관리등의 요청을 처리할 때 밀리세컨드 단위 읽기/쓰기 성능이 요구되었습니다.
키값 저장소는 메모리 기반 접근을 통해서 고속 처리가 가능합니다.
따라서 사용자들이 새로고침 할 때마다 DB 접근할 필요없이 메모리에 있는 데이터를 반환할 수 있습니다.
복잡한 관계분석 요구
SNS, 추천엔진, 경로탐색과 같은 기능을 구현하려면 데이터간의 관계를 효율적으로 탐색하는 방법이 중요했습니다.
RDBMS로 그래프 탐색을 구현하려면 복잡하고 성능이 떨어지기 때문에 Neo4j등의 그래프 데이터베이스가 필요했습니다.
빅데이터 처리
데이터 양이 천문학적으로 증가하고 실시간에 가깝게 처리해야하는 요구사항이 생겼습니다.
Cassandra 등등의 DB는 구글의 BigTable을 시초로 분산환경, 수평확장을 전제로 설계되었습니다.
특정 컬럼을 기준으로 빠른 접근이 가능하도록 만들어졌습니다.
NoSQL 종류 소개
키-값 저장소 (Key-Value Store)
설명:
- 가장 단순한 형태이며 키와 그에 대응하는 값 한쌍으로 데이터를 관리합니다.
- 스키마가 정해져있지 않고 조회속도가 빠르며 대규모 확장이 쉽습니다.
사용사례:
- 캐시 시스템
- 게임랭킹, 실시간 통계
구현체: Redis, Memcached
문서 저장소 (Document Store)
설명:
- Json과 같은 반정형 문서 형태의 데이터를 저장합니다.
- 문서의 구조가 유연하여 스키마가 자주변하거나 정형화하기 어려운 경우 유용합니다.
사용사례:
- 사용자 프로필 관리
- 컨텐츠 별 구조가 유동적인 CMS(Contents Management System) 환경
구현체: MongoDB, CouchDB, Amazon DocumentDB(mongo db 호환)
칼럼 저장소 (Column-Family Store)
설명:
- 데이터를 칼럼 패밀리 기반으로 저장합니다.
- 컬럼 단위로 데이터를 압축, 저장, 접근이 가능합니다.
- 대규모 분산환경에 최적화되어 있습니다.
사용사례:
- 로그 데이터 저장 및 분석
- 시계열 데이터 처리
구현체: Apache Cassandra, HBase
그래프 저장소 (Graph Store)
설명:
- 노드와 엣지, 그래프 구조로 데이터를 표현합니다.
- 노드간 관계를 탐색하는 연산에 최적화되어 있습니다.
사용사례:
- 소셜 네트워크 친구 추천
- 추천 시스템 (연관 검색어, 연관 상품)
구현체: Neo4j, JanusGraph(titan 계열)
벡터 데이터베이스 (Vector Database)
설명:
- 텍스트, 이미지 등 다양한 형태의 데이터를 고차원 벡터로 변환한 뒤 저장합니다.
- 벡터 공간 상에서 유사도를 빠르게 검색하는데 최적화 되어있습니다.
사용사례:
- LLM 응용 분야
- 추천 시스템
- 의미 기반 검색
구현체: ChromaDB, Pinecone, Weaviate, Qdrant
연습예제 (chatgpt)
• 한 온라인 게임 회사에서 글로벌 서비스 중인 RPG 게임의 실시간 랭킹 정보를 처리하려 한다.
• 전 세계 플레이어들의 전투 점수가 매초 업데이트되고, 상위 100위 플레이어 리스트를 거의 실시간으로 보여줘야 한다.
• 읽기와 쓰기가 모두 빈번하며, 트래픽이 매우 높다.
• 데이터 구조는 비교적 단순하고, 빠른 접근 속도가 중요하다.
나의 답변과 판단 근거
읽기와 쓰기가 모두 빈번한점, 트래픽이 많고 빠른 접근 속도가 중요하다는 점을 고려해서
NoSQL데이터베이스를 선택합니다.
NoSQL중에서는 다루려는 데이터 구조가 단순하기 때문에 반정형화된 구조가 필요없어
Document Store보다는 Key-Value Store가 적합해보입니다.