본문 바로가기
데이터베이스

SQL과 NoSQL

by 꾸진 2022. 4. 1.

SQL이란

SQL은 구조화된 쿼리 언어(Structured Query Language)의 약자로 데이터베이스 자체가 아니라 특정 유형의 데이터베이스와 상호 작용하는 데 사용하는 쿼리 언어입니다.

SQL을 사용하면 관계형 데이터베이스 관리 시스템(RDBMS)에서 데이터를 저장, 업데이트, 삭제 및 검색을 할 수 있습니다.

이러한 데이터베이스에는 2가지 주요 특징이 있는데, 다음과 같습니다.

  • 데이터는 정해진(엄격한) 데이터 스키마(구조)에 따라 데이터베이스 테이블에 저장된다.
  • 데이터는 관계를 통해 연결된 여러 테이블에 분산된다.

관계형 데이터베이스에서는 엄격한 스키마 구조에 따라 테이블에 저장된다고 했는데 그렇다면 엄격한 스키마 구조라는 게 무엇을 의미하는 것일까요?

 

엄격한 스키마

엄격한 스키마라는 것은 관계형 데이터베이스에서 스키마를 준수하지 않는 데이터는 저장할 수 없다는 걸 뜻합니다.

RDB에 저장된 데이터는 테이블의 레코드로 저장되며 각 테이블에는 명확하게 정의된 구조가 있습니다.

예를 들어, 아래와 같이 Products라는 테이블에 id, name, price, description이라는 필드가 있다고 생각해봅시다.

 

만약, 해당 Products(상품) 테이블에 상품에 대한 재고 수를 추가로 저장하고 싶다면? 또는 상품 데이터를 하나 추가하려는데, 해당 상품에 대한 가격을 모른다면 어떻게 될까요? (not null 가정)

앞서 말했듯 스키마에 맞지 않는 형식의 데이터는 저장할 수 없기 때문에 위와 같은 예시들은 저장이 불가능합니다.

 

관계

SQL 기반의 데이터베이스의 다른 특징은 관계입니다. 이 관계는 테이블 간에 관계를 뜻하는데요, 데이터의 중복을 피하기 위해 여러 개의 테이블에 나누어서 관계를 이용합니다. 예를 들어 foreign key를 이용하는 것이죠.

Orders 테이블을 보면, user_idproduct_id를 통해 어떤 사람이 어떤 상품을 주문했는지 알 수 있습니다.

이처럼 SQL은 각 테이블의 관계를 통해 테이블에 접근할 수 있고, 중복을 최소화하며 데이터를 다룰 수 있습니다.

 

NoSQL이란

NoSQL은 기본적으로 SQL과 반대되는 접근방식을 따르기 때문에 지어진 이름이라고 합니다.
앞서 설명했던 SQL의 특징을 NoSQL은 갖고 있지 않습니다.

즉, NoSQL의 특징은 다음과 같습니다.

  • 스키마 없음
  • 관계없음

스키마 없음

SQL에서는 엄격한 스키마에 의해 정해진 스키마를 따르지 않는다면 데이터를 저장할 수 없었지만, NoSQL에서는 그렇지 않습니다. 다른 구조의 데이터를 같은 컬렉션(=SQL에서의 테이블)에 추가할 수 있습니다. 즉, 데이터 필드 추가에 있어서 자유롭다는 점입니다.

 

NoSQL 세상에서는 레코드(record)를 문서(documents)라고 부르기도 합니다. 문서라는 용어가 생소할 수 있지만 쉽게 말해서 JSON과 비슷한 형태로 데이터를 가지고 있다는 게 특징입니다. 이러한 Document Database는 NoSQL 데이터베이스의 특성 중 하나입니다.

 

참고로 NoSQL 데이터베이스 별 특성은 4가지로 나누어집니다

  • Key-Value Database
  • Document Database
  • Column Family Database
  • Graph Database

본론으로 돌아와서, 위 SQL에서 예시로 상품(Products) 테이블에 상품에 대한 재고 수를 추가로 저장하고 싶다고 했습니다. NoSQL에서는 스키마에 대해 신경 쓸 필요가 없기 때문에 추가 저장이 가능하게 됩니다.

{
    id: 1,
    name: "배추",
    price: 1000,
    description: "싱싱함"
}
{
    id: 2,
    name: "양파",
    price: 1200,
    description: "매움",
    stock: 50            //재고 수
}

관계 없음

NoSQL 데이터베이스는 관계가 없기 때문에 조인이라는 개념이 없고 데이터 복제라는 개념이 있습니다. 문서(documents)에 데이터를 한 번에 담을 수 있기 때문입니다.

 

컬렉션을 통해 데이터를 복제하여 각 컬렉션 일부분에 속하는 데이터를 정확하게 산출하게 되는데요,
아래의 사진을 보면 아시다시피 Users의 데이터를 Orders에 복제해서 사용합니다.

 

하지만 이러한 방식의 단점은 데이터가 중복되고, 만약 Users 컬렉션에만 데이터가 업데이트되었을 때 Orders 컬렉션에 복제된 User는 과거의 데이터를 가지고 있다는 점입니다.

 

따라서 특정 데이터를 같이 사용하는 모든 컬렉션에서 똑같은 데이터 업데이트를 수행할 수 있도록 해야 합니다. (Users 컬렉션 데이터 업데이트가 되면 Orders 컬렉션에 복제된 User 데이터도 같이 업데이트하는 방식)

 

어떻게 보면 번거로울 수 있지만 이러한 방식의 장점은 복잡하고 느린 조인을 사용할 필요가 없다는 것입니다. 왜냐면 필요한 모든 데이터가 하나의 컬렉션에 다 저장이 되어있기 때문입니다.

확장성

마지막으로 SQL과 NoSQL을 비교할 때 확장성을 많이 비교하곤 합니다.

데이터베이스를 보통 어떤 방식으로 확장시킬 수 있을까요?

확장은 2가지로 구별할 수 있습니다.

  • 수직적(vertical) 확장과
  • 수평적(horizontal) 확장

수직적 확장이란 단순히 데이터베이스 서버의 성능을 향상하는 것입니다. Scale-up이라고 보시면 될 거 같습니다.

반면에 수평적 확장은 더 많은 서버가 추가되고 데이터베이스가 전체적으로 분산됨을 의미합니다. Scale-out이라고 보시면 될 거 같습니다.

데이터가 저장되는 방식(관련 테이블, 관련 없는 컬렉션)으로 인해 SQL 데이터베이스는 일반적으로 수직 확장을 사용합니다. 수평 확장은 NoSQL 데이터베이스에서만 주로 사용한다고 합니다.

 

SQL 데이터베이스에서 주로 수직 확장(Scale-Up)을 사용하는 이유가 뭘까요?

수평 확장도 가능하지만 이는 많은 유지보수 노력이 필요하기 때문인데요,
여기서 주목해야 할 요점은 SQL 데이터베이스의 테이블이 관련 데이터의 여러 테이블로 정규화되었음을 볼 수 있다는 것입니다.

이러한 테이블의 데이터를 여러 컴퓨터에서 분할하려면 관련 정규화된 데이터를 적절하게 분할해야 하므로 유지 보수가 어렵다는 점입니다.

 

예상 질문 및 답변

  • SQL과 NoSQL의 차이에 대해 설명해주세요

SQL은 스키마가 정확히 정의되어 있어서 데이터를 엄격하게 관리할 수 있고, 테이블 간의 관계를 맺어 중복도를 낮추고 동시에 데이터 간의 종속성을 맺을 수 있다. 이에 따라 레코드를 매우 쉽게 검색할 수 있다.

NOSQL은 스키마가 존재하지 않기에 높은 수준의 유연성을 제공하며 빅데이터와 대용량의 데이터를 빠른 시간에 안전하게 처리할 수 있다.

  • RDBMS와 비교했을 때 NoSQL의 장점을 설명해주세요

가장 큰 장점이라면 JOIN 처리가 없기 때문에 스케일 아웃을 통한 노드 확장 용이하다는 점이다. 뿐만 아니라 가변적인 데이터 구조로 데이터를 저장할 수 있어서 훨씬 더 유연성이 높다.

  • 어떤 상황에서 SQL을 쓰는 것이 적합할까요?

앱의 여러 부분에서 관련된 데이터(ex. join)가 자주 변경되는 경우 (NoSQL이라면 항상 여러 컬렉션을 수정해야 함)

명확한 스키마가 중요하며, 데이터 구조가 극적으로 변경되지 않을 때 (대부분 서비스는 스키마가 유동적인 경우가 거의 없다. )

  • 어떤 상황에서 NoSQL을 쓰는 것이 적합할까요?

정확한 데이터 요구사항을 알 수 없을 때

읽기(read) 처리를 자주 하지만, 데이터를 자주 변경(update) 하지 않는 경우 (즉, 한 번의 변경으로 수십 개의 문서를 업데이트할 필요가 없는 경우)

데이터베이스를 수평으로 확장해야 하는 경우 ( 즉, 막대한 양의 데이터를 다뤄야 하는 경우)

'데이터베이스' 카테고리의 다른 글

데이터베이스 Lock(락)  (0) 2022.05.09
데이터베이스 인덱스(Index) 개념 정리  (0) 2022.01.17