SQL과 NoSQL에 대한 간단한 기초 개념, 그리고 각각의 장단점에 대해 알아보자.
"Structured Query Language"
관계형 데이터베이스를 조작하고 액세스하는 데 사용되는 구조화된 쿼리 언어
즉, SQL은 데이터베이스 자체를 나타내는 것이 아니라, 특정 유형의 데이터베이스와 상호 작용하는 데 사용되는 쿼리 언어이다.
데이터를 관리하는 시스템인 DBMS 중에 RDBMS(Relational DBMS)라고 부르는 관계형 데이터베이스 관리 시스템이 있다. SQL을 사용하여 RDBMS를 이용할 수 있다.
이러한 관계형 데이터베이스에는 핵심적인 두 가지 특징이 있다.
"Not Only SQL"
테이블 형식으로 구성되지 않고 테이블 형식이 없는 비 관계형 형식의 데이터를 관리하는 방법을 제공하는 데이터베이스.
관계형 데이터 모델을 사용하지 않고 SQL을 사용하지 않는 그 이외의 모든 데이터베이스 시스템 또는 데이터 스토어를 일컬어 NoSQL이라고 칭한다.
빅데이터를 다룰 때 RDBMS로만 트래픽을 감당하기 어려워져 이를 해결하기 위해 탄생하였다.
NoSQL의 가장 큰 특징은 확장성과 기용성, 높은 성능, 그리고 다양한 데이터 형태를 수용할 수 있다는 것이다.(SQL의 특징과 반대로 스키마가 없고, 관계도 없기 때문이다.)
NoSQL은 무한에 가까운 확장성을 제공하는데, 이를 위해 NoSQL 데이터베이스는 단순한 키와 값의 쌍으로 이루어져 있다. 인덱스와 데이터는 분리되어 별도로 운영되며 고정된 스키마도 없다. RDBMS와 다르게 테이블 스키마가 유동적이라 다양한 형태들의 데이터를 유연하게 처리할 수 있다. 대신 분산형 구조이기 때문에 분산 시스템의 특징을 반영한다.
운영 데이터베이스 모델 | DBMS 예시 |
---|---|
Key-value store | Redis, MemcacheDB |
Columnar database | Cassandra, Apache HBase |
Document store | MongoDB, Couchbase |
Graph database | OrientDB, Neo4j |
어떠한 데이터를 다루는지, 어떤 애플리케이션에서 사용되는가에 따라 선택을 고려해야 한다.
그리고, 애플리케이션을 만들 때 한 가지 데이터베이스만 사용하는 것이 아니므로, 알맞은 곳에 알맞게 사용하면 된다.
"Object-realational Mapping"
데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 도구.
객체 지향 프로그래밍은 클래스를 사용하고 관계형 데이터 베이스는 테이블을 사용한다. 여기서 객체 모델과 관계형 모델 간에 불일치가 존재하는데, 이 객체 간의 관계를 바탕으로 SQL을 자동 생성하여 불일치를 해결한다.
예를 들어, Node.js에서 많이 사용되고 있는 ORM인 Sequelize는 자바스크립트 구문을 알아서 SQL로 바꾸어 RDBMS를 간편하게 다룰 수 있도록 해준다.
관계도를 그려보자면,
Object <=> 매핑 <=> DB데이터 이런 관계에서 ORM이 매핑의 역할을 수행하고 있다.
"Object Document Mapping"
NoSQL에서 Document Database를 지원하기 위해 데이터를 변환하는 도구.
Node.js에서 MongoDB를 사용하다 보면 mongoose라는 라이브러리를 자주 사용하는데, 이것이 바로 ODM이다. mongoose는 DB에서 문서를 조회할 때 자바스크립트 객체로 바꿔주는 등의 역할을 한다.
즉, document based DB(에 대한 자세한 설명)와 프로그램 사이 데이터를 변환해 주는 도구가 ODM이다.
DBMS에 대한 종속성이 줄어들어 DBMS 변경 시 드는 비용이 줄어든다.
객체 지향적인 코드로 가독성이 향상된다.
프로젝트의 복잡성이 커질수록 ORM, ODM의 추상화라는 장점이 오히려 단점이 될 수 있다.
결국 프로젝트가 커질수록 SQL을 사용해야 한다.
참고자료
SQL vs NoSQL
https://devuna.tistory.com/25
https://ko.myservername.com/sql-vs-nosql-exact-differences
https://smoh.tistory.com/371
https://edu.goorm.io/learn/lecture/557/%ED%95%9C-%EB%88%88%EC%97%90-%EB%81%9D%EB%82%B4%EB%8A%94-node-js/lesson/174384/mongodb%EB%9E%80
ORM, ODM
https://donghunee.github.io/study/2019/09/07/etc/
https://velog.io/@namezin/ODM-ORM
https://velog.io/@alskt0419/ORM%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C...-iek4f0o3fg