NoSQL (Not Only SQL)
전통적인 관계형 데이터베이스와는 다른 방식으로 데이터를 저장하고 관리하는 시스템이다.
NoSQL은 대량의 데이터를 빠르게 처리하고 복잡하지 않은 쿼리로도 데이터를 효과적으로 조회할 수 있어 빅데이터나 실시간 웹 애플리케이션에 많이 사요한다.
NoSQL은 다양한 데이터 모델을 지원하고 일반적으로 다음 네 가지 유형으로 분류된다.
1. 문서 지향 데이터베이스
대표적으로 MongoDB, CouchDB 등이 있다.
- JSON, BSON 등의 형식으로 데이터를 저장한다.
- 각 문서는 독립된 데이터 구조로 취급되며, 동일한 컬렉션에 저장된 문서라도 서로 다른 필드를 가질 수 있다.
- 관계형 데이터베이스에서의 행과 비슷한 개념이지만, 문서형 데이터베이스에서는 각 문서가 더 복잡한 구조를 가질 수 있다. (중첩된 데이터, 리스트)
- 비정형 데이터를 다루기에 적합하며, 유연한 스키마를 가지고 있어 스키마 변경 시에도 애플리케이션에 영향을 덜 미친다.
- 사용예: 블로그, 전자상거래, SNS
2. 키-값 스토어
Redis, Amazon DynamoDB, Riak 등이 있다.
- 간단한 키-값 쌍으로 데이터를 저장한다. 키는 고유한 식별자이고, 값은 임의의 데이터가 될 수 있다.
- 매우 빠른 조회 속도를 자랑하며, 데이터 구조가 단순하기 때문에 바른 읽기/쓰기 작업에 적합하다.
- 데이터 일관성보다는 가용성과 확장성에 중점을 두고 설계된 경우가 많다.
- 고속 캐싱 시스템에 자주 사용되고, Redis의 경우에는 메모리 내 캐시로 많이 사용된다.
- 사용예: 캐시, 세션 관리, 간단한 구성 정보 저장
3. 열 기반 스토어
Apache HBase, Cassandra 등이 있다.
각 행은 여러 개의 열로 구성되며, 같은 열에 속하는 데이터를 그룹화해서 저장한다.
- 데이터가 열 단위로 분리되어 저장되기 때문에, 특정 열에 대한 데이터 조회가 매우 빠르다.
- 대규모 분산 시스템에서 수평 확장이 용이하다. 데이터가 빠르게 증가하는 환경에서 효과적이다.
- 페타바이트 규모의 데이터 처리에 적합하며, 시간의 흐름에 따라 데이터가 변하는 시계열 데이터에 자주 사용된다.
- 사용예: 로그 수집 시스템, 빅데이터 분석, 시계열 데이터 관리
4. 그래프 데이터베이스
Neo4j, Amazon Neptune 등이 있다.
노드와 엣지를 통해 객체 간의 관계를 표현한다. 노드는 객체, 엣지는 그 객체 간의 관계를 나타낸다.
- 관계 중심 데이터를 매우 효율적으로 처리할 수 있다. 관계형 데이터베이스에서 조인 연산을 대신하는 개념으로, 노드와 엣지를 통해 관계를 직접 탐색할 수 있기 때문에 성능이 매우 우수하다.
- SNS, 추천 시스템, 경로 탐색 등 복잡한 관계를 다뤄야 할 때 효과적이다.
- 사용예: SNS, 추천 엔진, 경로 탐색(네비게이션)
NoSQL의 특징 및 장점
- 유연한 스키마
- 전통적인 RDB와 달리, NoSQL은 고정된 스키마를 강제하지 않는다. 이는 애플리케이션이 발전하는 동안 데이터 구조가 변경되더라도 기존 데이터를 수정할 필요가 없을을 의미한다.
- 수평 확장성
- NoSQL은 수직 확장보다는 여러 서버에 데이터를 분산시키는 수평 확장을 기본적으로 지원한다. 이는 데이터가 커질수록 시스템을 확장하는데 매우 유리하다.
- 대용량 데이터 처리
- NoSQL은 페타바이트 단위의 대용량 데이터를 처리하기에 적합하다. 특히 빠른 읽기/쓰기가 중요한 시스템에서 성능 최적화에 매우 유리하다.
- 고가용성 및 분산 처리
- 대부분의 NoSQL 시스템은 분산 환경에서 데이터 복제와 고가용성을 기본적으로 지원한다. 장애가 발생해도 다른 노드에서 데이터를 제공할 수 있는 구조로 설계되어있다.
NoSQL의 단점
- 트랜잭션 관리
- NoSQL은 RDB와 달리 ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션을 보장하지 않는 경우가 많다. 이로 인해 데이터 일관성을 보장해야 하는 애플리케이션에서는 사용이 제한될 수 있다. 일부 NoSQL 데이터베이스는 이를 보완하기 위해 다양한 방식으로 트랜잭션을 지원한다.
- 복잡한 쿼리 제한
- NoSQL은 RDB처럼 복잡한 조인 연산을 지원하지 않는다. 복잡한 데이터 관계를 처리할 때는 추가적인 데이터 설계와 작업이 필요하다.
- 성숙한 표준화 부족
- NoSQL은 아직 RDB 만큼의 성숙도와 표준화를 이루지 못했다. 각각의 NoSQL 데이터베이스가 제공하는 기능과 쿼리 언어가 다르기 때문에 다른 NoSQL 시스템으로 이관할 때 추가적인 학습과 적응이 필요하다.
결론
NoSQL은 고속 읽기/쓰기 성능이 필요한 애플리케이션, 수평 확장이 중요한 대용량 시스템, 유연한 데이터 모델이 필요한 애플리케이션에 적합하다. 반면, 복잡한 트랜잭션이 필요하고 데이터 일관성이 최우선인 금융, 결제 시스템 같은 경우는 RDB가 더 적합할 수 있다.