NoSQL
NoSQL은 Not only SQL의 약자로, 기존의 관계형 데이터베이스가 아닌 방식으로 데이터를 저장하고 관리하는 데이터베이스 관리 시스템을 말한다. 즉 기존의 관계형 데이터베이스 처럼 특정 스키마를 정의하고 스키마와 같은 구조의 데이터를 저장하는 것이 아니라 스키마가 고정되어있지 않거나 아예 존재하지 않는 데이터베이스를 의미한다.
대표적인 NoSQL 데이터베이스로는 MongoDB, Redis, Neo4j 등이 있으며, 아래와 같은 경우에 NoSQL을 사용하는 것이 적합하다.
- 데이터 구조가 자주 바뀌는 경우
- 대규모의 데이터를 빠르게 처리해야 하는 경우
- 데이터 간의 관계성 보다 속도와 확장성이 중요한 경우
NoSQL은 기존 관계형 데이터베이스로는 충족하기 어려운 요구사항을 해결하기 위해 등장했다. 그러나 그만큼 관계형 데이터베이스의 장점을 일부 포기해야 했기 때문에 단점도 존재한다.
장점
유연한 스키마
데이터를 저장하기 위해 사전에 데이블의 구조를 정의해야 하는 관계형 데이터베이스와 달리, NoSQL은 데이터를 저장하기 위해 스키마를 정의할 필요가 없다. 이로 인해 프로토타이핑 과정에서 스키마 설계 단계가 생략되어 초기 개발 속도가 빠르고, 새로운 필드의 추가 등으로 인해 데이터의 구조가 변경되어도 별도의 마이그래이션을 필요로 하지 않는다.
유연한 수평적 확장
데이터베이스로의 트래픽을 분산하기 위해 샤딩, 레플리카를 통해 수평적 확장에 용이하다. 관계형 데이터베이스는 JOIN이나 트랜잭션으로 인해 수평 확장이 매우 제한적인 반면, NoSQL은 대부분 분산 시스템으로 설계되어 연관관계가 존재하지 않고 트랜잭션을 사용하지 않기 때문에 노드를 추가하여 대량의 트래픽을 처리할 수 있다.
빠른 성능
기존 관계형 데이터베이스의 JOIN이나 트랜잭션 같은 복잡한 기능을 생략하거나 최소화했기 때문에 속도가 빠르다. 단순 key-value형태를 이용한 접근이나 문서 기반 접근을 이용하고, Redis와 같은 일부 NoSQL은 메모리 기반으로 동작하기 때문에 관계형 데이터베이스에 비해 일반적으로 높은 성능을 보인다.
다양한 데이터 모델을 지원
문서 기반(MongoDB, ElasticSearch), key-value 기반(Redis, DynamoDB), 열 지향(Cassandra, HBase), 그래프 기반(Neo4j) 등의 다양한 데이터 형태를 지원한다. 데이터의 형태를 테이블로 만들어야 하는 기존 관계형 데이터베이스와 달리, 요구사항에 맞는 데이터 모델을 선택하여 사용할 수 있다.
분산 저장과 복제
대부분의 NoSQL은 기본적으로 데이터를 여러 노드에 분산하여 저장한다. 따라서 샤딩과 라우팅을 통해 데이터베이스에 발생하는 트래픽을 분산하고, 레플리케이션을 통해 백업과 장애 대응에 유연하게 대처할 수 있다.
단점
트랜잭션 미지원
대부분의 NoSQL은 트랜잭션을 사용하지 않기 때문에 ACID가 보장되지 않는다. 대신 BASE(Basically Available, Soft state, Eventually consistent)모델을 지원하며, 이 중에서 최종적 일관성(Eventually Consistent) 개념을 통해 각 노드가 같은 데이터에 대해 다른 값을 가져도 시간이 지남에 따라 데이터를 일관적으로 유지하는 방법으로 일관성을 보장하지만, 이를 위해 전체 시스템의 데이터 동기화가 완료될 때 까지 기다려야하는 문제가 있다.
복잡한 관계 표현 제한
NoSQL은 JOIN연산이 없기 때문에 연관관계를 저장하는 과정에서 외래키를 통해 연관관계를 지정할 수 없다. 대신 연관되는 데이터를 포함시킨 뒤에 저장하여 데이터의 중복이 발생할 수 있다.
표준 쿼리 언어 부재
SQL이라는 통일된 언어를 사용하는 관계형 데이터베이스와 달리, NoSQL은 DB마다 사용하는 쿼리 방식이 다르다. 따라서 여러 개의 NoSQL 데이터베이스를 사용하는 경우 높은 학습 비용이 요구된다.
MongoDB
대표적인 문서 지향 NoSQL 데이터베이스 관리 시스템이다.
스키마가 존재하지 않으며, 이에 따라 배열, 중첩 문서와 같은 복잡한 구조를 그대로 저장할 수 있는 것이 특징이다.
또한 수평 확장을 지원하여 대규모의 데이터 처리에 대한 성능이 어느 정보 보장되는 편이며, 트랜잭션, JOIN등을 지원하지 않기 대문에 데이터의 조회와 생성 과정에서 빠른 속도를 보여준다.
따라서 데이터의 구조가 정형화 되어 있지 않은 경우, JSON형태의 데이터를 그대로 다루는 경우, 실시간 로그나 채팅 등의 빠른 속도의 데이터 처리가 필요한 경우 등에서 자주 사용된다.
MongoDB는 RDB의 테이블에 대응되는 개념으로 Collection을 사용하며, Row와 대응되는 개념으로는 Document를 사용한다.
즉, RDB에서 데이터베이스를 생성한 뒤에 테이블을 생성하고 Row들에 데이터가 저장되는 것처럼, MongoDB에서는 데이터베이스를 생성한 뒤에 Collection을 생성하고 해당 Collection의 Document로 데이터를 저장한다.