NoSQL이란?
NoSQL은 Not Only SQL의 약자로 단순히 기존 관계형 DBMS가 갖고 있는 특성뿐만 아니라, 다른 특성들을 부가적으로 지원한다는 것을 의미한다.
관계형 데이터베이스가 테이블 간의 관계를 기반으로 데이터를 저장하는 방식과 달리, NoSQL은 빠르게 바뀌는 대량의 비정형 데이터를 처리하는 데 적합한 구조를 제공한다.
과거에는 회원 정보나 매출 기록처럼 일정한 형식과 구조를 가진 정형 데이터만 처리했기 때문에, RDBMS로 데이터를 쉽게 관리할 수 있었다. 그러나 문서, 이미지, 동영상 파일, SNS 데이터 등 고정된 형식이 없는 비정형 데이터가 많아지면서, 더 유연한 스키마를 제공하는 NoSQL이 필요하게 되었다.
NoSQL의 특징
1. 비정형 데이터 저장
NoSQL은 구조화되지 않은 비정형 또는 반정형 데이터를 저장하는 데 적합하다. 비정형 데이터는 고정된 형식이나 구조가 없는 데이터를 의미한다.
예를 들어 고객 정보를 저장할 때 RDBM는 필드를 먼저 정의하고 이 필드에 맞춰 데이터를 입력해야 한다.
| 고객ID | 이름 | 이메일 |
|--------|--------|--------------------|
| 1 | 홍길동 | hong@example.com |
| 2 | 이영희 | lee@example.com |
그러나 소셜 미디어 게시물처럼 데이터가 다양한 형태를 가질 때는 문제가 생긴다. 게시물마다 텍스트만 포함할 수도 있고, 텍스트와 이미지, 해시태그가 함께 포함될 수도 있다. 이를 JSON 형식으로 쉽게 저장할 수 있다.
RDBMS를 써본 사람이라면 다양한 필드에 대해 어떻게 테이블을 정의하고 정규화해야 하는지 고민한 적이 있을 것이다.
NoSQL은 이를 JSON 형식으로 저장할 수 있다.
{
"postId": 1,
"text": "오늘 날씨가 좋다!",
"tags": ["날씨", "행복"]
}
{
"postId": 2,
"text": "맛있는 저녁 식사!",
"image": "dinner.jpg"
}
이처럼 NoSQL은 서로 다른 구조의 데이터를 유연하게 저장할 수 있다.
NoSQL 데이터베이스는 키-값 저장소, 도큐먼트 저장소, 컬럼 기반 저장소, 그래프 저장소 등 다양한 데이터 모델을 지원한다.
2. 수평적 확장성
RDBMS가 서버 성능을 향상시키기 위해 수직적 확장(하드웨어 업그레이드)을 필요로 하는 반면,
NoSQL은 수평적 확장(서버 추가)으로 여러 서버에 데이터를 분산하여 대규모 데이터를 처리할 수 있다.
이는 분산 컴퓨팅 환경에서 특히 강력한 성능을 보인다.
ex) "블랙프라이데이"처럼 트래픽이 폭증하는 상황에서는 서버를 추가하고 데이터를 분산해 성능 저하 없이 대규모 트래픽을 처리할 수 있다.
하지만 이 분산 시스템의 특성상 일관성을 유지하기 어렵다. 수많은 서버에 데이터를 분산해 저장했을 때, 특정 서버에서 업데이트가 발생하면 모든 서버에 실시간으로 전파하기 쉽지 않기 때문이다.
NoSQL은 이 문제를 해결하기 위해 관계형 데이터베이스의 "ACID 원칙"대신 Eventual Consistency
를 허용한다.
Eventual Consistency
일정 시간이 지나면 데이터가 최종적으로 일관된 상태가 된다는 의미다. 즉, 모든 업데이트가 즉시 반영되지는 않지만, 시간이 지나면서 결국 일관성을 유지하게 될 것이니 "업데이트가 되기 전까지는" 가지고 있는 최신의 데이
터를 반환한다.
3. 스키마 유연성
NoSQL은 엄격한 스키마(데이터 구조)를 요구하지 않기 때문에데이터 변경에 유연하게 대처할 수 있다.
학교의 학생 정보를 저장하는 테이블이 "학번", "이름", "생년월일", "주소" 필드를 갖고 있을 때, 새로운 필드를 추가하려면 테이블 전체를 수정해야 한다.
그러나 NoSQL에서는 별도의 수정 없이 데이터를 추가할 수 있다
{
"studentId": 1,
"name": "김철수",
"birthdate": "2000-05-20"
}
{
"studentId": 2,
"name": "박영희",
"birthdate": "2001-11-15",
"hobby": "피아노",
"sns": "@younghee123"
}
이처럼 새로운 필드를 추가하거나 데이터 구조를 변경해도 데이터베이스 전체에 영향을 미치지 않는다.
4. 고성능 및 높은 가용성
NoSQL은 데이터를 여러 스토리지에 복제 및 분산하여 고성능과 고가용성을 유지한다.
넷플릭스와 같은 글로벌 스트리밍 서비스는 각 지역의 여러 서버에 데이터를 복제하여 저장해 놓기 때문에 특정 지역의 서버에 장애가 발생하더라도 다른 서버가 데이터를 제공해 서비스가 중단되지 않게 한다.
CAP 이론
CAP 이론은 일관성(Consistency), 가용성(Availability), 네트워크 분할 허용(Partition Tolerance)의 세 가지 속성 세 가지를 동시에 완벽하게 만족할 수 없음을 나타낸다.
분산 시스템은 이 중 두 가지 속성을 선택하고, 나머지 하나는 포기할 수밖에 없다.
1. 일관성(Consistency)
모든 노드가 같은 시간에 동일한 데이터를 보여줘야 한다.
ex) 예를 들어 분산된 은행 시스템에서 고객이 계좌 잔고를 조회할 때, 모든 지점에서 동일한 금액이 나타나도록 보장해야 한다.
2. 가용성(Availability)
시스템이 항상 요청에 응답해야 한다. 특정 노드에 장애가 발생해도 서비스는 계속 제공되어야 한다.
ex) 대규모 전자상거래 사이트에서 서버에 문제가 발생하더라도 고객이 항상 상품을 검색할 수 있도록 서비스를 제공해야 한다.
3. 분산 허용(Partition Tolerance)
노드간에 통신 문제가 생겨도 시스템이 작동해야 한다.
ex) 위에서 설명한 넷플리스를 예로 지역 간 네트워크 연결이 끊어져도 각 지역에서 서비스가 계속 제공될 수 있어야 한다.
NoSQL 데이터베이스의 종류
1. 키-값 저장소 (Key-Value Stores)
키와 값을 매핑하여 데이터를 저장하는 형태로, 빠른 조회가 필요할 때 유용하다.
ex) Redis, Amazon DynamoDB
2. 도큐먼트 저장소 (Document Stores)
key/value의 확장된 형태로 value에 문서(JSON, XML 등)를 저장한다.
ex) MongoDB, CouchDB
3. 컬럼 기반 저장소 (Column-Family Stores)
RDBMS가 데이터를 행 단위로 저장하는 것과 달리, NoSQL은 열 단위로 데이터를 그룹화해 저장한다.
예를 들면 RDBMS의 학생 정보를 저장하는 테이블에서 데이터는 한 행에 모든 데이터가 함께 저장된다.
| 학생ID | 이름 | 나이 | 전공 |
|--------|-------|------|---------|
| 1 | 홍길동| 20 | 컴퓨터공학 |
| 2 | 이영희| 22 | 물리학 |
즉, 하나의 행(홍길동의 행)에 모든 필드(홍길동의 정보)가 함께 저장된다.
NoSQL의 컬럼 기반 저장소에서는 데이터가 열 단위로 저장된다.
Column Family: 기본 정보
학생ID: [1, 2]
이름: [홍길동, 이영희]
나이: [20, 22]
Column Family: 학과 정보
전공: [컴퓨터공학, 물리학]
즉 학생ID 한 묶음, 이름 한 묶음, 나이 한 묶음 이렇게 컬럼을 열 단위로 묶어저장한다.
이는 특정 열만 선택하여 읽을 때 매우 효율적이다(학생들의 나이만 조회하기)
ex) Apache Cassandra, HBase
4. 그래프 데이터베이스 (Graph Databases)
노드와 엣지로 구성된 그래프 구조를 기반으로 데이터를 저장하며, 복잡한 관계를 쉽게 쿼리 할 수 있다.
역시 key/value 형태로 저장되고 모든 노드는 끊기지 않고 연결되어 있다.
ex) Neo4j, Amazon Neptune
언제 NoSQL을 사용해야 하나?
- 대량의 데이터가 빠르게 생성되고 수평적 확장이 필요할 때
- 데이터 구조가 자주 변경되거나 비정형 데이터를 저장해야 할 때
- 분산 시스템을 활용해 높은 가용성과 성능이 요구될 때
- 빠른 읽기 및 쓰기가 필요한 실시간 애플리케이션에서
'👶🏻 CS > Database' 카테고리의 다른 글
인덱스(B-Tree, B+Tree) (0) | 2024.11.19 |
---|---|
정규화와 비정규화 (0) | 2024.11.17 |
트랜잭션 - ACID 원칙, Problem 3가지 (0) | 2024.11.11 |