[Database] NoSQL이란?

나른한 개발자·2026년 1월 19일

f-lab

목록 보기
28/44

NoSQL

보통 'NoSQL 데이터베이스'라는 용어는 일반적으로 모든 비관계형 데이터베이스를 지칭할 때 사용됩니다. 'NoSQL'이라는 용어를 'non-SQL'의 약자로 보기도 하고 'not only SQL'의 약자로 해석하기도 합니다. 어느 쪽이든 NoSQL 데이터베이스가 데이터를 더 자연스럽고 유연한 방식으로 저장한다는 의미는 동일합니다. NoSQL은 SQL과 달리 데이터베이스 관리 방식 전체를 가리키는 반면, SQL은 NoSQL 데이터베이스에서 사용하는 쿼리 언어들과 마찬가지로 단순히 쿼리 언어를 지칭합니다.

NoSQL 데이터베이스는 데이터 모델에 따라 다양한 유형으로 구분됩니다. 주요 유형에는 문서형, 키-값형, 와이드 컬럼형, 그래프형이 있습니다.

문서 지향 데이터베이스

문서 지향 데이터베이스는 JSON 객체와 유사한 문서 형태로 데이터를 저장합니다. 각 문서는 필드와 값의 쌍을 포함합니다. 값은 일반적으로 문자열, 숫자, 불리언, 배열 또는 기타 객체를 비롯한 다양한 유형일 수 있습니다. 문서 데이터베이스는 유연한 데이터 모델을 제공하여 반정형 데이터나 비정형 데이터 집합에 특히 적합합니다. 또한 중첩된 구조를 지원하여 복잡한 관계나 계층적 데이터를 쉽게 표현할 수 있습니다.

대표적인 문서형 데이터베이스로는 MongoDB와 Couchbase가 있습니다. 일반적인 문서는 다음과 같은 형태입니다.

{
  "_id": "12345",
  "name": "foo bar",
  "email": "foo@bar.com",
  "address": {
    "street": "123 foo street",
    "city": "some city",
    "state": "some state",
    "zip": "123456"
  },
  "hobbies": ["music", "guitar", "reading"]
}

키-값 데이터베이스

키-값 저장소는 각 항목이 키와 값으로 이루어진 더 단순한 유형의 데이터베이스입니다. 각 키는 고유하며 하나의 값과만 연결됩니다. 이들은 캐싱과 세션 관리에 사용되며 주로 메모리에 데이터를 저장하기 때문에 읽기 및 쓰기 성능이 우수합니다. Amazon DynamoDB와 Redis를 예로 들 수 있습니다. 키-값 데이터베이스에 저장된 데이터는 다음과 같이 단순하게 표현할 수 있습니다.

Key: user:12345
Value: {"name": "foo bar", "email": "foo@bar.com", "designation": "software developer"}

와이드 컬럼 저장소

와이드 컬럼 저장소는 테이블, 행, 그리고 동적으로 구성되는 컬럼에 데이터를 저장합니다. 데이터는 테이블 형태로 저장되지만 기존 SQL 데이터베이스와 달리 와이드 컬럼 저장소는 서로 다른 행마다 서로 다른 컬럼 집합을 가질 수 있을 정도로 구조가 유연합니다. 이러한 데이터베이스는 컬럼 압축 기법을 활용해 저장 공간을 줄이고 성능을 개선할 수 있습니다. 넓은 행과 컬럼 구조를 통해 희소하면서도 폭이 넓은 데이터를 효율적으로 조회할 수 있습니다. 대표적인 와이드 컬럼 저장소로는 Apache Cassandra와 HBase가 있습니다. 와이드 컬럼 저장소에 데이터가 저장되는 일반적인 예시는 다음과 같습니다.

name | id    | email       | dob | city
---------------------------------------------------
Foo | 12345  | foo@bar.com |          | Some city 
Carn| 34521	 | bar@foo.com |12-05-1972| 	

그래프 데이터베이스

그래프 데이터베이스는 노드와 엣지 형태로 데이터를 저장합니다. 노드는 일반적으로 사람, 장소, 사물처럼 명사에 해당하는 개체 정보를 저장하고, 엣지는 이러한 노드들 사이의 관계 정보를 저장합니다. 이러한 데이터베이스는 관계나 패턴이 처음에는 명확하지 않을 수 있는 고도로 연결된 데이터에 적합합니다. 대표적인 그래프 데이터베이스로는 Neo4J와 Amazon Neptune이 있습니다. MongoDB 역시 집계 파이프라인의 $graphLookup 단계를 사용하여 그래프 탐색 기능을 제공합니다. 아래는 데이터가 저장되는 방식의 예시입니다.

멀티 모델 데이터베이스

멀티 모델 데이터베이스는 두 가지 이상의 NoSQL 데이터 모델을 지원하여 개발자가 애플리케이션 요구 사항에 맞는 방식을 선택할 수 있도록 합니다. 이러한 데이터베이스는 단일 데이터베이스 인스턴스 안에서 여러 데이터 모델을 처리할 수 있는 통합 엔진을 제공합니다. 예로는 CosmosDB와 ArangoDB를 들 수 있습니다.

NoSQL 데이터베이스의 특징

NoSQL 데이터베이스는 유연성과 확장성 및 분산 구조를 갖춘 데이터베이스입니다. NoSQL 데이터베이스의 유형에 따라 각각 고유한 특징이 있습니다.

  • 분산 컴퓨팅
  • 확장성
  • 유연한 스키마와 풍부한 쿼리 언어
  • 개발자 친화적인 사용 편의성
  • 파티션 내결함성
  • 높은 가용성

BASE 원칙

NoSQL 데이터베이스는 BASE 원칙을 따릅니다. 즉 기본 가용성(Basic Availability), 소프트 상태(Soft state), 궁극적 일관성(Eventual Consistency)을 의미합니다.

  • 기본 가용성: 시스템이 항상 응답을 제공한다는 의미입니다. 일부 노드에 장애가 발생하거나 네트워크 문제가 생겨도, 시스템 전체가 멈추지 않고 계속 작동합니다. 완벽한 데이터를 보장하지 못하더라도 일단 서비스는 살아있다는 거죠. 예를 들어 쇼핑몰에서 일부 상품 정보가 최신이 아닐 수 있어도, 사이트 자체는 계속 접속되고 작동합니다.
  • 유연한 상태: 시스템의 상태가 시간에 따라 변할 수 있고, 외부 입력이 없어도 변화할 수 있다는 의미입니다. 데이터가 여러 노드에 복제되면서 동기화되는 과정에서 일시적으로 서로 다른 값을 가질 수 있습니다. 상태가 딱딱하게 고정되어 있지 않고 부드럽게 유동적이라는 뜻입니다.
  • 궁극적 일관성: 즉시 모든 노드가 동일한 데이터를 갖지는 않지만, 충분한 시간이 지나면 결국 일관된 상태에 도달한다는 것입니다.

왜 BASE를 선택했을까

ACID는 데이터의 정확성과 일관성을 최우선으로 하지만, 그 대가로 성능과 확장성을 희생합니다. 모든 노드가 동기화될 때까지 기다려야 하고, 분산 환경에서는 비용이 매우 큽니다.

BASE는 정반대의 선택입니다. 완벽한 일관성을 조금 포기하는 대신, 빠른 응답 속도와 높은 가용성, 그리고 수평 확장성을 얻습니다. 페이스북의 좋아요 수가 잠깐 다르게 보이는 것은 큰 문제가 아니지만, 서비스가 다운되는 것은 심각한 문제니까요.

RDBMS와 NoSQL 데이터베이스의 차이점

데이터 구조의 차이

관계형 DB는 데이터를 테이블, 행, 열의 엄격한 구조로 저장합니다. 각 테이블은 미리 정의된 스키마를 가지며, 데이터를 입력하기 전에 어떤 컬럼이 있고 각 컬럼의 데이터 타입이 무엇인지 명확히 정의해야 합니다. 반면 NoSQL은 훨씬 유연합니다. 문서 형태, 키-값 쌍, 그래프, 컬럼 패밀리 등 다양한 방식으로 데이터를 저장할 수 있고, 스키마가 없거나 유연해서 필요에 따라 구조를 바꿀 수 있습니다.

관계와 조인

관계형 DB의 이름에서 알 수 있듯이, 테이블 간의 관계를 정의하고 조인을 통해 여러 테이블의 데이터를 연결해서 조회하는 것이 핵심입니다. 예를 들어 사용자 테이블과 주문 테이블을 외래키로 연결하고, 필요할 때 조인해서 사용자의 모든 주문 내역을 가져올 수 있습니다. NoSQL은 일반적으로 조인을 지원하지 않거나 매우 제한적입니다. 대신 관련된 데이터를 하나의 문서나 레코드에 함께 저장하는 방식을 선호합니다.

확장성

관계형 DB는 주로 수직 확장, 즉 서버의 성능을 높이는 방식으로 확장합니다. 더 강력한 CPU, 더 많은 메모리를 가진 단일 서버로 업그레이드하는 것이죠. 반면 NoSQL은 수평 확장, 즉 서버를 여러 대 추가하는 방식으로 설계되었습니다. 데이터를 여러 서버에 분산시켜 저장하고 처리할 수 있어서 대규모 트래픽과 데이터에 유리합니다.

트랜잭션과 일관성

관계형 DB는 ACID 속성을 강력하게 보장합니다. 원자성, 일관성, 격리성, 지속성이 모두 엄격하게 지켜지므로 은행 거래 같은 중요한 작업에 적합합니다. 여러 작업이 모두 성공하거나 모두 실패하도록 보장할 수 있습니다. NoSQL은 대신 BASE 모델을 따르는 경우가 많습니다. 기본적으로 가용성을 우선시하고, 앞서 말한 궁극적 일관성을 채택해서 성능과 확장성을 얻는 대신 즉각적인 일관성은 포기합니다.

사용 사례

관계형 DB는 데이터 구조가 명확하고 변하지 않으며, 복잡한 쿼리와 트랜잭션이 필요한 경우에 적합합니다. 전자상거래, ERP, 회계 시스템 등이 대표적입니다. NoSQL은 데이터 구조가 유연하게 변할 수 있고, 대량의 데이터를 빠르게 읽고 쓰며, 수평 확장이 필요한 경우에 유리합니다. 소셜 미디어, 실시간 분석, IoT 데이터 수집, 콘텐츠 관리 시스템 등에서 많이 사용됩니다.
결국 어느 것이 더 좋다기보다는, 각자의 장단점이 명확하므로 프로젝트의 요구사항에 맞춰 선택하는 것이 중요합니다.

NoSQL 데이터베이스에 대한 오해

1. 관계형 데이터는 관계형 데이터베이스에 가장 적합하다

흔히 하는 오해 중 하나는 NoSQL 데이터베이스, 즉 비관계형 데이터베이스는 관계형 데이터를 제대로 저장하지 못한다는 것입니다. 그러나 NoSQL 데이터베이스도 관계형 데이터를 저장할 수 있으며 단지 관계형 데이터베이스와는 다른 방식으로 저장할 뿐입니다.

실제로 관계형 데이터베이스와 비교했을 때 많은 사람들이 NoSQL 데이터베이스에서 관계형 데이터를 모델링하는 것이 더 쉽다고 느낍니다. 그 이유는 서로 관련된 데이터를 여러 테이블로 분리할 필요가 없기 때문입니다. NoSQL 데이터 모델은 관련 데이터를 하나의 데이터 구조 내에 중첩시킬 수 있습니다.

2. NoSQL 데이터베이스는 ACID 트랜잭션을 지원하지 않는다

또 다른 일반적인 오해는 NoSQL 데이터베이스가 ACID 트랜잭션을 지원하지 않는다는 것입니다. 그러나 MongoDB와 같은 일부 NoSQL 데이터베이스는 실제로 ACID 트랜잭션을 지원합니다.

NoSQL 데이터베이스의 데이터 모델링 방식에 따라 많은 사용 사례의 경우 다중 레코드 트랜잭션이 필요하지 않을 수 있습니다. 앞서 예로 들었던 사용자와 그 사용자의 취미 정보를 각각 관계형 모델과 문서 저장소에 저장한 사례를 떠올려 봅시다. 관계형 데이터베이스에서 사용자와 사용자의 취미 정보를 함께 업데이트하려면 두 개의 테이블에 있는 기록을 하나의 트랜잭션으로 묶어 업데이트해야 합니다. 문서 저장소에서 동일한 작업을 수행하려면 단일 문서만 업데이트하면 되므로 여러 기록을 포함하는 트랜잭션이 필요하지 않습니다.

NoSQL은 비관계형 데이터베이스이다. 데이터 모델에 따라 도큐먼트형, 키밸류형, 와이드 컬럼형, 그래프형이 있다. NoSQL은 기본적으로 높은 가용성과 확장성, 유연성을 최우선으로 제공하는 것을 목적으로 하고 있다. NoSQL은 RDBMS와는 달리 테이블을 연결할 필요가 없다. 그래서 join을 지원하지 않는다. 중첩구조를 활용해서 유연하게 표현할 수 있다. 그리고 수직, 수평 확장을 모두 지원하여 대규모 트래픽과 데이터를 다루는데 유리하다. 또한 RDBMS는 ACID 트랜잭션을 지원하는 반면 NoSQL에서는 BASE 규칙을 따르는 경우가 많다. 완벽한 일관성은 약간 포기하는 대신 높은 가용성과 빠른 응답 속도를 보장하고, 결국엔 모든 노드들이 일관된 데이터 상태를 가지도록 하는 것이다. 이처럼 RDBMS은 데이터 일관성과 정확성을 최우선으로 하는 대신에 성능과 확장성에는 약한 반면, NoSQL은 궁극적 일관성을 지향하여 높은 가용성과 수평확장성을 확보한다. 따라서 대규모 트래픽이나 유연한 데이터 구조가 필요하다면 NoSQL이 좋은 선택지가 될 수 있다.

profile
Start fast to fail fast

0개의 댓글