NoSQL이란?

NoSQL 데이터베이스는 클라우드 애플리케이션의 요구 사항을 지원하는 한편 기존의 관계형 데이터베이스(RDBMS)가 지니고 있던 확장성, 성능, 데이터 모델 및 데이터 분산 측면에서의 한계를 극복할 수 있도록 설계되었습니다.

NoSQL에 대하여

NoSQL 데이터베이스를 이해하기 위해 먼저 그 대안인 관계형 데이터베이스에 대해 알아보겠습니다. SQL 프로그래밍 언어는 관계형 데이터베이스를 간편하게 쿼리하고 수정하려는 목적으로 설계되었습니다. SQL을 이러한 방식으로 사용하는 관계형 데이터베이스를 SQL 데이터베이스라고 부릅니다. SQL 데이터베이스는 1970년 초부터 사용되었는데, 당시에는 데이터 저장소가 매우 비쌌습니다. 그래서 관계형 데이터베이스 내 테이블 간의 중복 데이터는 최소화되었습니다. SQL 데이터베이스는 치밀한 구조를 갖췄지만 그로 인해서 유연성이 극히 떨어지며 수정하기도 어렵습니다. 또한 SQL 데이터베이스를 생성하려면 사전에 상당한 시간과 노력을 들여서 설계를 고민해야 합니다.


하지만 시간이 지나 데이터 저장 비용이 급격히 줄어들면서 중복 데이터를 제거하기 위해 시간과 자원을 투입해야 할 필요성도 훨씬 줄었습니다. 반면 개발 시간의 비용은 급격하게 불어났습니다. NoSQL 데이터베이스는 개발자의 생산성을 극대화할 수 있는 데이터베이스로서, 유연성이 뛰어나고 사용이 간편하며 테이블 형태로만 제한되지 않습니다. 또한 동일한 데이터 구조로 모든 데이터 유형을 저장하거나 그에 액세스할 수 있습니다.


NoSQL의 개발과 도입을 촉진한 또 다른 핵심 요인은 바로 데이터의 양과 다양성이 폭증했다는 점입니다. 1990년대에 인터넷이 등장한 이후로 서로 다른 유형과 크기의 데이터가 쏟아져 나왔으며 데이터의 양은 계속 불어나기만 했습니다. 오늘날의 데이터 소스는 인터넷 상호작용, 모바일 기기, 전자상거래 결제, 소셜 미디어, 동영상, 오디오, 디지털 이미지, IoT 센서, 데이터 분석, 날씨 데이터, AI, 머신 러닝에 이르기까지 정말 다양합니다. 이렇게 끊임없이 다양한 유형의 데이터 소스가 등장하는 현재의 환경에 경직적인 테이블 형식의 관계형 데이터베이스는 더 이상 적합하지 않습니다. 기업은 SQL을 대체할 데이터베이스 솔루션이 필요했습니다. 모든 유형의 정형 및 비정형 데이터를 다룰 수 있는 유연성을 갖추었으며 비용 효율적인 확장성을 바탕으로 막대한 양의 데이터도 안전하게 저장할 수 있는 데이터베이스 말이죠.


Amazon, Google, Facebook과 같은 일류 인터넷 기업들은 2000년대 초반에 이러한 필요성을 먼저 인식했습니다. 그리고 더 이상 관계형 데이터베이스에 의존하지 않고서도 데이터를 저장하고 그에 액세스할 수 있는 NoSQL(not-only-SQL 또는 non-SQL) 방식을 고안했습니다. 거대 기술 기업은 수십억 명의 사용자들에게 충분한 성능과 가용성을 제공할 수 있으며, 세계 어디에서든 데이터를 읽고 쓸 수 있고, 거대한 확장성까지 갖춘 데이터베이스 관리 시스템이 필요했습니다. 클라우드 컴퓨팅과 빅데이터의 중요성이 계속 부각되는 오늘날에는 대부분의 조직이 고객 경험을 개인화할 수 있는 대규모 애플리케이션을 제공할 수 있어야 합니다. NoSQL은 그러한 시스템을 구현할 때 선택할 수 있는 데이터베이스 기술입니다.


아래의 그림에서 묘사한 것처럼 관계형 데이터베이스와 NoSQL 데이터베이스의 중요한 차이점 중 하나는 바로 확장성입니다. 표준적인 관계형 데이터베이스는 수직 확장만이 가능하기 때문에 용량을 늘리려면 기존 서버의 RAM, CPU, SSD 등을 늘리거나 더욱 규모가 크고 비싼 서버로 마이그레이션을 해야만 합니다. 반면 NoSQL 데이터베이스는 수평적으로 확장할 수 있습니다. 따라서 값비싼 하드웨어를 업그레이드할 필요없이 상용 서버나 클라우드 인스턴스를 추가하는 방식으로 저렴하게 확장할 수 있습니다.

관계형 확장 vs NoSQL 확장

NoSQL과 관계형 데이터베이스 비교

NoSQL과 RDBMS 데이터베이스(SQL 등)는 서로 다른 애플리케이션 요구 사항을 지원하며, 기업에서는 각 사용 사례별로 그에 맞는 데이터베이스를 활용하는 경우가 많습니다. 이 둘에 관한 기술적 의사결정을 내릴 때 고려해야 할 주요한 기준은 다음과 같습니다.

관계형 데이터베이스

NoSQL

사용 사례

중앙집중식 단일 애플리케이션

뛰어난 확장성을 갖춘 분산식 마이크로서비스 애플리케이션

가용성

적당한 수준에서 높은 수준까지

연속적 가용성, 다운타임 없음

속도

적당한 속도의 데이터

높은 속도의 데이터(기기, 센서 등)

데이터 유형

주로 정형 데이터

정형, 반정형, 비정형

트랜잭션

복잡/중첩된 트랜잭션과 조인

단순한 트랜잭션과 쿼리

읽기 및 쓰기

읽기 확장

읽기와 쓰기 모두 확장

확장성

세로 확장('수직 확장성')

가로 확장('수평 확장성')

다양한 유형의 NoSQL 데이터베이스

NoSQL에도 몇 가지의 데이터베이스 유형이 존재하므로 데이터 특성과 목적에 따라 가장 적합한 유형을 유연하게 선택할 수 있습니다. 주요 유형은 다음과 같습니다.

키/값 데이터베이스

키-값 데이터베이스

키-값 데이터베이스는 모든 데이터가 인덱스된 키와 값으로 구성되어 있어서 NoSQL 데이터베이스 중에서도 그 구조가 가장 단순한 편입니다. 키-값 데이터베이스는 키가 주어졌을 때 그에 연동된 값을 신속하게 찾을 수 있는 해시 메커니즘을 사용합니다. 해시 메커니즘은 일정한 시간의 액세스를 제공하므로 대규모 데이터베이스에서도 높은 수준의 성능을 유지할 수 있습니다. 어떤 유형의 오브젝트도 키가 될 수 있지만 대개는 스트링이 키가 됩니다. 값은 일반적으로 불투명 Blob입니다(예: 데이터베이스가 해석하지 않는 바이트 시퀀스). 값은 대량의 데이터를 간편하게 저장하고 lookup 쿼리를 신속하게 수행하게 해줍니다.

개발 예제

  • Redis
  • Amazon DynamoDB
  • Riak
  • Oracle NoSQL

Cassandra 같은 일부 테이블 형식 NoSQL 데이터베이스 또한 키-값 형식을 제공할 수 있습니다.

문서 데이터베이스

문서 데이터베이스

문서 데이터베이스는 키-값 저장소와 기본적 아이디어가 비슷합니다. 하지만 '문서'는 데이터를 포함하며, 각 문서에는 문서를 검색할 때 사용되는 고유의 키가 할당된다는 점에서 그 구조가 조금 더 복잡합니다. 문서 데이터베이스는 주로 JSON으로 저장되는 문서 기반 정보를 저장하고, 검색하고 관리하기 위한 목적으로 설계되었습니다. 각 문서는 다양한 유형의 데이터를 포함할 수 있습니다. 이때 문서의 모음을 컬렉션이라고 부릅니다. 컬렉션 내의 각 문서는 구조가 서로 다를 수 있습니다.

문서 데이터베이스는 문서의 내용을 살펴볼 수 있으므로 추가적인 검색 프로세스를 수행할 수 있습니다. 정적 스키마가 필요한 RDBMS와는 달리 문서 데이터베이스는 문서의 내용에 따라 정의되는 유연한 스키마를 갖습니다.

개발 예제

  • MongoDB
  • CouchDB

단순한 문서 저장소가 아닌, Cassandra를 비롯한 일부 RDBMS와 NoSQL 데이터베이스도 JSON 문서를 저장하고 쿼리할 수 있다는 점을 알아두세요.

테이블 형식 데이터베이스

테이블 형식 데이터베이스

테이블 형식 데이터베이스는 데이터를 로우와 컬럼으로 배열하지만 RDBMS와는 차이점이 있습니다. 와이드 컬럼 저장소 또는 파티션 로우 저장소라고도 알려진 테이블 형식 데이터베이스는 서로 연관된 로우를 파티션으로 조직하여 동일한 레플리카에 저장할 수 있는 옵션을 제공하여 쿼리의 속도를 높여줍니다.

또한 RDBMS보다는 테이블 형식이 유연합니다. 예를 들어 Apache Cassandra™에서는 테이블의 모든 로우가 모든 컬럼에 대한 값을 포함하지 않아도 됩니다. 테이블 형식 데이터베이스는 키-값 및 문서 데이터베이스처럼 해시를 사용하여 테이블에서 로우를 검색합니다.

개발 예제

  • Cassandra
  • HBase
  • Google Bigtable
그래프 데이터베이스

그래프 데이터베이스

그래프 데이터베이스는 데이터 간의 관계를 활용하는 그래프 방식을 통해 데이터를 저장합니다. 이때 그래프의 노드는 각 데이터 항목을 나타내며, 간선은 데이터 항목 간의 관계를 나타냅니다. 그래프 데이터베이스는 아주 복잡하고 고도로 연결된 데이터를 다루며, RDBMS를 뛰어넘는 수준의 관계 및 조인 기능을 갖추고 있습니다. 때로 그래프 데이터베이스는 대규모 데이터 세트에서의 공통점 또는 이상점을 찾아내는 데 탁월한 능력을 발휘하기도 합니다.

개발 예제

  • DataStax Graph
  • Neo4J
  • JanusGraph
  • Amazon Neptune
멀티 모델 데이터베이스

멀티 모델 데이터베이스

멀티 모델 데이터베이스는 NoSQL과 RDBMS 시장 모두에서 떠오르고 있는 트렌드입니다. 이는 하나의 통합된 백엔드에서 복수의 데이터 모델을 지원하도록 설계된 데이터베이스입니다. 대다수 데이터베이스 관리 시스템은 하나의 데이터 모델에 입각해 데이터를 조직하고 저장하고 활용합니다. 반면 멀티 모델 데이터베이스에서는 기업이 시스템 데이터의 각 부분을 서로 다른 데이터 모델로 저장할 수 있으므로 애플리케이션 개발이 용이해집니다.

NoSQL의 장점

NoSQL 데이터베이스는 주로 클라우드 애플리케이션을 대상으로 하는 분산형 시스템을 지원하려는 목적으로 설계되었습니다. Cassandra와 같은 NoSQL 데이터베이스는 다른 데이터베이스 관리 시스템에 비해 일반적으로 다음과 같은 장점이 있습니다.

유연성

유연성

사전에 정의된 스키마가 필요 없습니다. 새로운 데이터 유형과 필드를 즉석에서 추가할 수 있습니다.

꾸준한 가용성

꾸준한 가용성

최악의 인프라 운영 중지 상황이 발생하더라도 온라인 상태를 유지할 수 있는 데이터베이스입니다.

지리적 분산성

지리적 분산성

어디서든 데이터를 완벽하게 활성화할 수 있습니다.

운영상의 저지연성

운영상의 저지연성

무거운 운영 클라우드 애플리케이션에 대해서도 신속하게 응답할 수 있습니다.

선형적 확장성

선형적 확장성

예측 가능한 수평 및 수직 확장을 통해 클라우드 애플리케이션에 필요한 데이터 처리 능력을 확보할 수 있습니다.

기능적 일관성

기능적 일관성

혼합 워크로드와 다양한 데이터 모델을 일관되게 통합하여 상호운용성을 확보할 수 있습니다.

완성도 높은 운영성

완성도 높은 운영성

기업에서 클라우드 애플리케이션의 데이터 관리용으로 활용하기에 적합합니다.

낮은 총소유비용

낮은 총소유비용

전용 하드웨어나 보조 소프트웨어가 필요하지 않습니다.

NoSQL 데이터베이스의 종류별 차이점

시장에는 다양한 NoSQL 데이터베이스가 존재하며 종류별로 다음과 같은 주요한 차이점이 존재합니다.

데이터 모델

NoSQL 데이터베이스는 지원하는 데이터 모델에 따라 분류할 수 있습니다. 일부는 와이드 로우 테이블 형식 저장소를 지원하며, 문서 기반, 키-값, 그래프 모델을 지원하는 부류도 있습니다. 아래에서 자세한 내용을 소개하겠습니다.

개발 API

NoSQL은 그 유연성과 간편함 때문에 개발자들에게 인기가 있습니다. NoSQL의 이러한 특성은 애플리케이션 프로그래밍 인터페이스(API)에 대한 접근법에서 잘 나타납니다. 개발자들은 NoSQL이 제공하는 다양한 종류의 API를 통해 데이터와 간편하게 상호작용할 수 있으며, 데이터를 쉽게 수정할 수 있습니다. 키-값, 문서, 테이블 형식, 그래프와 같은 NoSQL 데이터 모델은 각각의 API 세트를 갖고 있습니다. 또한 다양한 NoSQL 데이터베이스는 서로 다른 개발 API까지도 지원하므로 선택의 폭이 한층 넓습니다. Cassandra는 SQL과 유사한 언어인 Cassandra 쿼리 언어를 지원하며, REST나 GraphQL과 같은 API는 현재 개발 중입니다.

아키텍처

NoSQL 데이터베이스는 복수의 서버에 데이터 복사본을 남겨서 데이터를 항상 사용할 수 있게 합니다. 이는 데이터베이스 서버 1개에 장애가 발생해도 데이터 손실이 발생하지 않게 막아주는 역할을 합니다. NoSQL 데이터베이스와 함께 사용하는 복제 아키텍처로는 주/보조 방식과 피어투피어 방식이 있습니다.

대표적으로 MongoDB가 사용하는 주/보조 방식에서는 하나의 주 복제 노드와 다수의 보조 노드를 포함하는 복제 세트가 만들어집니다. 이때 주 노드만이 데이터 업데이트와 쓰기 요청을 처리할 수 있으며 주 노드에서의 변경 사항은 이후 보조 노드에 재차 반영됩니다. 주 노드가 모든 업데이트를 처리하고 전달하는 동안에는 프로세스가 지연될 수 있습니다. 만약 주 노드에서 문제가 생긴다면 보조 노드 중 하나가 주 노드를 대신하게 됩니다. 다만 해당 프로세스는 10초 이상 소요될 수 있습니다.

Cassandra, Couchbase 등은 피어투피어 복제 아키텍처를 사용합니다. 피어투피어 방식에서는 데이터베이스 클러스터의 모든 노드가 동일한 지위를 지닙니다. 즉, 모든 노드가 데이터를 읽고 씁니다. 따라서 그중 하나가 소실되어도 다른 노드가 이를 처리할 수 있기 때문에 다운타임이 발생하지 않습니다. 또한 노드를 추가하기만 하면 성능을 간단하게 향상할 수 있습니다. 피어투피어 복제 방식의 주요 단점은 비일관성입니다. 변경 사항이 모든 노드로 확산되므로 아직 업데이트되지 않은 노드들과는 데이터가 일치하지 않을 수 있기 때문입니다. 그뿐만 아니라 복수의 서로 다른 노드에서 동일한 레코드에 대한 쓰기 업데이트를 동시에 수신하면 충돌이 발생할 수 있습니다.

데이터 분산 모델

NoSQL 데이터베이스는 아키텍처가 다르기 때문에 데이터 읽기, 쓰기, 배포를 지원하는 방식도 다릅니다. Cassandra와 같은 NoSQL 플랫폼은 클러스터의 모든 노드에서 쓰기와 읽기를 지원하며, 여러 데이터 센터와 클라우드 공급자들 간에 데이터를 복제하거나 동기화할 수 있습니다.


또한 'NewSQL' 데이터베이스라고 알려진 새로운 데이터베이스는 NoSQL 데이터베이스에 의해 도입된 분산 시스템 아키텍처 원리를 상당 부분 도입하면서도 기존 RDBMS의 관계형 의미론을 지원하려 하고 있습니다. NewSQL 데이터베이스에는 Google Cloud Spanner나 Cockroach DB가 있으며, 이들은 Cassandra를 비롯한 NoSQL 데이터베이스에 새로운 상충관계의 집합을 제공합니다.

NoSQL 데이터베이스의 벤치마크 확인하기

NoSQL 구현을 위한 다양한 옵션

실제로 NoSQL로 시스템을 바꾸어 애플리케이션을 구현하려면 어떻게 해야 할까요? NoSQL 데이터베이스를 도입하는 방법은 크게 세 가지가 있습니다.

새로운 애플리케이션

새로운 애플리케이션

상당수 조직이 NoSQL을 새로운 클라우드 애플리케이션에 적용해 처음부터 시작하는 방법을 선택합니다. 이러한 방식은 애플리케이션 다시 쓰기와 데이터 마이그레이션을 해야 하는 수고를 덜어줍니다.

보강

보강

일부 조직은 NoSQL 컴포넌트를 추가하여 기존 시스템을 보강하는 방식을 취합니다. 이는 애플리케이션의 규모가 커져서 RDBMS의 확장성으로는 감당할 수 없거나 혹은 가용성을 향상해야 할 때 활용되는 방식입니다.

전면 교체

전면 교체

점점 비용이 증가하고 있는 시스템 또는 동시 사용자, 데이터 속도, 데이터양이 늘어나면서 그 부하로 인해 심각한 문제가 발생하고 있는 시스템은 NoSQL 데이터베이스로의 전면 교체를 진행합니다.

NoSQL에 대해 계속 학습하세요

비용 효율적이며 수평 확장이 가능합니다. 다운 타임이 없습니다. 모든 데이터 유형을 다룰 수 있는 유연성을 갖췄으며 즉석에서 데이터를 변경할 수 있습니다. 몇 개의 데이터베이스 유형으로 다양한 사용 사례를 처리할 수 있습니다. NoSQL 데이터베이스에는 이렇게 다양한 장점이 있습니다. 이는 여러분의 데이터 환경과 조직 목표에 부합하는 데이터베이스인가요?