Spring은 주로 MySQL을, Node.js에서는 주로 MongoDB를 사용하지만, DB의 설정은 단순히 프레임워크에 따라 결정하는 것이 아니다.
SQL(관계형 데이터베이스)와 NoSQL(비관계형 데이터베이스)의 차이를 알고, DB를 선택하는 것이 옳은 방법이다.
SQL은 '구조화 된 쿼리 언어 (Structured Query Language)'의 약자이다. 구조화된(Structured) 쿼리는 RDBMS
에게만 보낼 수 있는 쿼리 언어를 의미하고, 관계형 DB는 SQL사용이 필수이다. 하지만 SQL
을 관계형 데이터베이스
라고 부르기도한다.
정해진(엄격한) Data Schema
에 따라 DB 테이블에 저장된다.관계
를 통해서 여러개의 테이블에 분산된다.이 말들이 잘 이해가 안간다면, 다음 내용을 보자.
데이터는 행과 열이 있는 테이블(table)
에 저장되며, 그 테이블은 명확하게 정의된 구조라고 볼 수 있다. 이때 구조는 필드(Column)의 이름과 데이터 유형으로 정의된다.
따라서 스키마를 준수하지 않는 레코드는 추가될 수 없다.
🔍용어 정리
- Schema : 데이터베이스에서 사용되는 전체 데이터 구조를 정의하는 개체
- Table : 데이터를 구성하는 가장 기본적인 단위
- row(행) = record = tuple 같은 의미
관계형 데이터 베이스의 또다른 핵심은 관계
이다.
데이터들을 여러 개의 테이블로 나누어서, 하나의 테이블에서는 데이터들의 중복을 피할 수 있다. 여기서 말하는 중복은 데이터 정규화
에 의해 최소화 되는 그 중복을 의미한다.
정규화에 대해서는 따로 포스팅을 할 예정이지만, 간단히 설명하자면,
이렇게 중복되는 것이 다음과 같이 2개의 테이블로 나누면 더이상 중복 되지 않는다.
NoSQL은 말그대로 "No" + "SQL"
로, SQL을 사용하지 않는 DB를 의미한다. 정확히 말하자면, 구조화된 쿼리 언어인 SQL뿐만 아니라 다른 것 형태를 사용할 수 있는 "Not only SQL"
DB이다.
스키마
가 없다.관계
가 없다.NoSQL의 DB구조는 다음 그림과 같다.
NoSQL
에는 레코드를 문서(documents)
라고 부른다.
SQL과 가장 큰 차이는 SQL은 스키마를 준수하지 않으면 데이터를 추가할 수 없었지만, NoSQL은 다른 구조의 데이터를 동일한 컬렉션(=SQL에서의 테이블)에 추가할 수 있다. 예를 들어, Users
에 다음과 같은 데이터를 추가해도 된다는 것이다.
{nickName: "ZZang", gender: "Male"}
NoSQL
의 또 다른 특징의 관계
가 없다는 것은 아래 그림으로 짐작할 수 있을 것이다.
SQL에서 1번(id=1)인 Orders 객체를 불러오려면 Order
↔ Users
을 Join하고, Order
↔ Products
을 Join해야 했다. 하지만 NoSQL에서는 Join은 일반적인 방법이 아니고, 컬렉션(=SQL에서의 Table)을 통해 데이터를 복제하여 각 컬렉션 일부분에 속하는 데이터를 정확하게 산출하게 한다.
즉, Join을 할 필요없이 이미 필요한 모든 것을 갖춘 Document가 추출된다. (NoSQL에서 Join이 불가능한 것은 아님)
NoSQL의 이러한 방식은 데이터가 중복되기 때문에 불안정한 측면이 있다. 위 그림을 에를 들어, Users
컬렉션의 id=1인 document가 수정되었지만, Orders
컬렉션에는 그 수정이 반영되지 않을 위험이 있다. 따라서 특정 데이터를 같이 사용하는 모든 컬렉션에서, 똑같은 데이터 업데이트를 수행해야한다.
그러한 이유로 데이터의 수정이 빈번할 경우 NoSQL은 성능적으로 나쁠 수 있다.
사실 위의 예시는 MongoDB인 Document 모델의 NoSQL을 다룬 것이다. 하지만 NoSQL의 DB 모델은 아래의 그림과 같이 다양하다.
각 모델에 대한 설명은 다루지 않겠다.
SQL vs NoSQL
을 비교할 때, 또 다른 중요한 개념은 확장(Scaling)이다.
단순한 데이터베이스 서버의 성능을 향상시키는 것이다. 예를 들어, CPU를 업그레이드 하는 방식이 있다.
데이터베이스를 여러 대의 서버 노드에 분산하여 저장하고 처리하는 것을 의미한다. 이를 분산 시스템이라고 부르지만 이 포스팅에서는 깊게 다루지 않겠다.
SQL
은 수직적 확장만 가능하지만, NoSQL
은 수직적, 수평적 확장 모두 가능하다.
SQL과 NoSQL은 모두 훌륭한 DB이다. 두 가지 중 하나를 선택해야 한다면 어떤 데이터를 다루고, 어떤 어플리케이션에서 사용되는지 고려해야 한다.
관계
로 나누어져 있기 때문에, 데이터를 읽을 때 수 많은 Join 연산이 일어난다. 이는 성능 저하를 일으킬 수 있다.