NoSQL의 정의
NoSQL
은 Not Only SQL의 약자로, Not Only의 뜻을 생각해봤을 때 RDBMS만 고집하지 말고 필요에 따라 다른 특성의 데이터베이스로 사용해봐라~ 이런 뜻으로 해석하면 된다.
NoSQL은 관계 데이터 모델과 SQL을 사용하지 않는 데이터베이스 시스템이다. RDBMS가 일관성에 초점을 맞췄다면, NoSQL은 가용성
과 확장성
에 초점을 맞춘 데이터베이스이다.
NoSQL의 등장
기존의 RDBMS는 정형화된 데이터를 저장하기 때문에 데이터의 형태/크기를 미리 정하고 테이블 단위로 구분하여 데이터를 저장할 수 있다. 또한, 트랜잭션
을 통해 데이터를 안전하게 관리할 수 있고, 조인 연산
을 사용한 검색도 가능하다.
하지만 기술이 발전함에 따라 단순 텍스트 이외에도 이미지, 동영상과 같은 다양한 데이터를 저장할 필요가 생겼고, 클러스터 환경에서의 확장성을 충족시키기 위해 NoSQL이 등장하게 됐다.
NoSQL의 특징
- 저렴하다.
NoSQL은 트랜잭션을 통한ACID
(Atomicity, Consistency, Isolation, Durability)을 제공하지 않는 대신 저렴한 비용으로 여러 대의 컴퓨터에 데이터를 분산/저장/처리할 수 있다.
- 융통성 있다.
NoSQL은 스키마가 없이 동작하기 때문에 데이터의 구조를 미리 정의할 필요가 없고, 언제든 그 구조를 변형시킬 수 있기 때문에비정형 데이터
(ex. JSON, XML)를 저장하기에 용이하다.
- 확장성 있다.
RDBMS는 하나의 큰 컴퓨터에서 작동하기 유리하도록 설계되었다. 따라서 오늘날의 클러스터 환경에는 적합하지 않다.
NoSQL은 이 문제를 해결하고자 등장했기 때문에 RDBMS에 비해 훨씬 확장성 있는 데이터베이스 시스템이다.
CAP 이론
NoSQL은 RDBMS의 완전 대체제가 아니다. 상황에 따라 적합한 데이터베이스를 선택하면 되는데, 그 기준에 사용되는 것이 CAP 이론
이다.
CAP 이론은 분산 시스템에서 일관성(Consistency)
, 가용성(Availability)
, 파티션 허용(Partition Tolerance)
의 세 가지 조건을 모두 만족하는 것은 불가능하다는 이론으로, 세 가지 중 두 가지를 택하라는 것으로 많이 알려졌다.
RDBMS는 C
, A
를 만족하는 데이터베이스이고,
NoSQL은 A
, P
를 만족하는 데이터베이스이다.
일관성(Consistency)
일관성이란 어떤 노드에 연결되었는지와 무관하게 모든 클라이언트가 동시에 동일한 데이터를 볼 수 있음을 의미한다.
이러한 상황이 발생하려면, 데이터가 하나의 노드에 기록될 때마다 이 데이터는 쓰기가 ‘성공’으로 간주되기 전에 시스템의 다른 모든 노드로 즉시 전달되거나 복제되어야 한다.
가용성(Availability)
가용성이란 하나 이상의 노드가 작동 중지된 경우에도 데이터를 요청하는 클라이언트가 응답을 받음을 의미한다.
다시 말해, 분산 시스템의 모든 작업 중인 노드는 예외 없이 모든 요청에 대해 유효한 응답을 리턴해야 한다.
파티션 허용(Partition Tolerance)
파티션이란, 분산 시스템 내의 통신 단절, 즉 두 노드 간의 연결이 유실되거나 일시적으로 지연된 상태를 말한다.
파티션 허용이란, 시스템의 노드 간에 다수의 통신 단절에도 불구하고 클러스터가 계속해서 작동해야 함을 의미한다.
NoSQL의 종류
-
Key-Value
가장 기본적인 형태의 NoSQL으로,<키, 값>
쌍으로 데이터가 저장된다. 키와 값이라는 두 개의 열만 있는 관계형 데이터베이스와 같다고 보면 된다.
키만 알면 값을 바로 조회할 수 있으므로 질의 처리 속도가 굉장히 빠르다. 하지만 키를 이용해 값 전체를 검색하는 것과 같은 복잡한 질의가 불가능하다.
대표적으로 아마존의 DynamoDB, Oracle, 그리고 트위터 등에서 사용되는 Redis가 있다.
- Document based(Key-Document)
키-값 모델의 확장된 형태로,<키, 문서>
쌍으로 데이터가 저장된다. 키-문서 모델이라고 생각하면 좀 더 이해가 쉽다.
문서 기반 데이터베이스에서의문서
는 객체지향에서의객체
의 개념과 유사하며, 단일한 값이 아닌트리 형태의 계층적 구조
가 존재하는 JSON, XML 등과 같은 반정형 형태이다.{ "Name" : "forest", "Address" : "Seoul", "Email" : "forest@gmail.com", "Contact" : "12345" }
대표적으로 MongoDB와 CouchDB가 있다.
-
Column based(Key-Column)
컬럼 기반 데이터 모델은<키, 컬럼 패밀리>
쌍으로 구성되어있다. 컬럼 패밀리는 관련 있는 컬럼 값들이 모여서 구성되고, 테이블에서 1개의 행을 구성하는 속성들의 모임으로 생각할 수 있다.
RDBMS와의 차이점은 1) 다양한 형태의 데이터를 저장할 수 있다는 것과 2) 행마다 컬럼의 구성을 다르게 할 수 있다는 것이다.
RDBMS의 row-store과 비교해보면 row-store은 데이터의 추가/수정이 쉽다. 하지만 불필요한 column까지 다 읽어와야 한다는 단점이 있다.
반면 column-store은get('1234','name')
와 같이 읽고 싶은 데이터만 읽어올 수 있다는 장점이 있다. Column based에는 대표적으로 구글의 BigTable, 카산드라 등이 있다.
- Graph based
그래프 데이터 모델은 관계 데이터 모델처럼 데이터 간의 관계
를 표현하는 데 적합하다.
노드
에 데이터를 저장하고 간선
으로 데이터 간의 관계를 표현하는 방향 그래프
의 형태로, 노드에 저장된 데이터는 <키, 값>
쌍의 집합이다. 질의는 그래프 순회 과정을 통해 처리하며 다른 모델들과 달리 트랜잭션을 통한 ACID
를 지원한다.
소셜 네트워크의 친구 찾기나 배달과 같은 위치 기반 서비스, 추천 시스템에 사용하기 적합하다.
대표적으로 Neo4J, OrientDB, Apache Giraph 등이 있다.
🤔 Graph based 모델과 기존 관계형 데이터베이스의 차이는 뭘까?
우선 관계형 데이터베이스는 데이터의 구조를 미리 알고 있기 때문에 방대한 양의 레코드를 처리할 때 더 빠르다. 따라서 메모리 설치 공간도 줄어들게 된다.
반면 그래프 데이터베이스에는 데이터에 대한 미리 정의된 구조가 없기 때문에 데이터 구조를 결정하기 위해 쿼리 중에 각 레코드를 개별적으로 검사해야 한다. 따라서 방대한 데이터를 저장하기에는 비효율적이다.
하지만 그래프 데이터베이스는 고도로 연결된 데이터에 초점을 맞추고 있기 때문에 복잡한 관계를 표현하기에 적합하다.
반면 관계형 데이터베이스는 외래키와 조인 연산으로 관계를 표현해야 하기 때문에 연산에 있어 비용이 많이 들고, 복잡한 관계를 표현하기에는 부적합하다.