No-SQL Database 란?

No-SQL (Not only SQL) 시작

1998년 카를로 스트로찌(Carlo Strozzi)라는 엔지니어가 공개한 표준 SQL 인터페이스를 채용하지 않은 자신의 경량 Open Source 관계형 데이터베이스를 No-SQL이라고 명명한데서 유래되었다고 한며, 이후 2009년에는 요한 오스칼손(Johan Oskarsson)이라는 엔지니어가 Open Source기반의 분산 데이터베이스 관련 행사를 준비하면서 No-SQL이라는 용어를 널리 사용하기 시작하였다고 한다.​

초기 No-SQL은 기존의 관계형 데이터베이스 시스템의 주요 특성을 보장하는 ACID(Atomicity, Consistency, Isolation, Durability) 특성을 제공하지 않았다. 때문에 No-SQL이 등장한 이후에도 시장에서는 관계형 데이터베이스가 데이터를 처리하는데 가장 최적의 시스템으로 받아들여졌다.

기업 데이터의 정확한 처리가 필수적이기 때문에 기업 시스템에서는 현재도 관계형 데이터베이스를 훨씬 많이 사용한다. 무엇보다도 표준 SQL 이라고 하는 데이터를 처리하는 언어의 편이성 때문에 No-SQL 등 다른 데이터베이스 시스템들은 많이 활용 되지 않았다.​

2000년 후반으로 넘어오면서 인터넷이 활성화되고, 소셜네트워크 서비스(SNS)등이 등장하면서 관계형 데이터 또는 정형데이터가 아닌 데이터, 즉 비정형데이터라는 것을 보다 쉽게 담아서 저장하고 처리할 수 있는 구조를 가진 데이터 베이스들이 관심을 받게 되었고, 해당 기술이 점점 더 발전하게 되면서, No-SQL 데이터베이스가 각광을 받기 시작했다.

기존의 관계형 데이터베이스 보다 더 융통성 있는 데이터 모델이 요구되며, 데이터의 저장 및 검색을 위한 특화된 매커니즘이 필요 해지기 시작했고, No-SQL은 단순 검색 및 추가 작업에 있어서 매우 최적화된 키 값 저장 기법을 사용하여, 응답속도나, 처리 효율 등에 있어서 매우 뛰어난 성능을 내주면서, 비정형 데이터를 다루는 SNS, 머신러닝 등 AI 산업에 많이 사용되기 시작했다.

SQL VS No-SQL

SQLVSNo-SQL
정해진 규격에 의한 정적 정의Schema정해진 규격 없음. 동적 정의
가능Data Join불가능
표준SQL비표준
보장Transcation미보장
어려움Distribute쉬움

No-SQL 종류

1. Key-Value DB

  • Key와 Value의 쌍으로 데이터가 저장되는 가장 단순한 형태이다.
    (ex) Dictionary, Hash 자료 구조
  • 데이터를 하나의 불투명한 컬렉션으로 처리하며 각 레코드마다 각기 다른 필드를 가질 수 있는 Column Family 데이터 모델이다.
  • 선택적인 값들이 대부분의 DB에서처럼 placeholder로 표현되지 않기 때문에 Key-Value DB는 동일한 데이터베이스 저장을 위해 메모리를 훨씬 덜 사용하기도 하므로 특정한 부하에서 큰 성능 상의 이점이 있을 수 있다.

2. Wide Column DB

  • Key-Value DB에서 발전된 형태의 Column Family 데이터 모델을 사용한다.
  • 하나의 Row Key 안에 다양한 컬럼과 값을 저장 할 수 있도록 한다.
  • 대량의 데이터의 압축, 분산처리, 집계 쿼리 (SUM, COUNT, AVG 등)및 쿼리 동작 속도 그리고 확장성이 뛰어나다.

3. Document(-oriented) DB

  • 문서 데이터베이스는 JSON/XML 유사 형식의 문서로 데이터를 저장 및 쿼리하도록 설계된 비관계형 데이터베이스 유형으로 트리형 구조로 레코드를 저장하거나 검색하는 것에 효과적이다.

4. Graph DB

  • 18세기 오일러의 그래프 이론에서 시작되었다.
  • 데이터를 노드로 표현하며 노드 사이의 관계를 엣지로 표현한다.
  • 기존의 RDB로는 표현하기 어려웠던 각 데이터간의 연결점들을 이어주고 표현(Visualizing)해주는데 용이하다.

Inverted Search Index

검색엔진에서 많이 사용하는 방법인데, 검색엔진은 사이트의 모든 페이지를 검색 로봇이 검색해서 문서내의 단어들을 색인하여 URL에 맵핑해서 저장해놓는다.

Key Value
bcho.tistory.com/nosqlnosql, cassandra, riak
bcho.tistory.com/cloudamazon, azure, google
facebook.com/group/serversideamazon, google, riak
highscalability.com/bigdatanosql, riak
http://www.basho.com/riakriak

검색은 단어를 키로 검색이 되기 때문에, 위의 테이블 구조에서는 value에 검색 키워드들이 들어가 있기 때문에, 효과적인 검색을 할 수 없다.이 검색 키워드를 키로 해서 URL을 value로 하는 테이블을 다시 만들어 보면, 아래와 같은 식으로 표현되고, 검색 키워드로 검색을 하면 빠르게, 검색 키워드를 가지고 있는 URL을 찾아낼 수 있다.

KeyValue
riak bcho.tistory.com/nosql
facebook.com/group/serverside
highscalability.com/bigdata
http://www.basho.com/riak
nosql bcho.tistory.com/nosql
highscalability.com/bigdata

이렇게 value의 내용을 key로 하고, key의 내용을 반대로 value로 하는 패턴을 inverted search index라고 한다.

How to pretty print JSON Object

JSON Object를 화면에 바로 보여주어야 할 때, 그냥 바로 출력을 하면 한줄로 길게 표현이 되기 때문에, 가독성이 떨어진다. 하지만 다음과 같이 하면 들여쓰기를 하여 JSON Object를 보기 좋게 프린트 할 수 있다.

1. Html

<pre><code class=JsonResult></code></pre>

2. Javascript

var jsonObject = [{name: "Gil-Dong", Age: 20, Birthday: new Date("2001-01-01")},{name: "Young-Hee", Age: 25, Birthday: null}];

$('.JsonResult').html(JSON.stringify(jsonObject, null, 3));

3.Result

[
   {
      "name": "Gil-Dong",
      "Age": 20,
      "Birthday": "2001-01-01T00:00:00.000Z"
   },
   {
      "name": "Young-Hee",
      "Age": 25,
      "Birthday": null
   }
]

How to convert the following table to JSON Object

다음과 같이 하면 html table에 있는 리스트 형태의 데이터들을 JSON Object 형태로 만들어 사용할 수 있다.

var List = [];
var headers = $("table th");

$('table .tableRows').each(function (i, row) {
     List[i] = {};
     $(row).find('td').each(function (j, cell) {
         List[i][$(headers[j]).text()] = $(cell).find('input').val();
     });
 });

-유의사항-
이 코드는 최적화하여 만들어진 것은 아니고 단순히 Jquery 스크립트로만 위문제를 해결한 것이기 때문에, 더 좋은 최적화된 오픈 소스 혹은 라이브러리가 있다면 그것을 사용하는 것을 권장한다.

Open Source Software License 계열 분류

오픈소스 라이선스는 굉장히 많이 존재 하지만 분류를 해보면 크게 3가지 계열로 나눌 수 있다.

3가지 계열에 대한 라이선스 구분은 다음과 같다.

1. Permissive

오픈소스의 최소한의 성격만을 보장하는 라이선스로, 누구나 개작 할 수 있고, 수정한 것을 제한 없이 배포할 수 있다. 또한, 코드 공개의 의무가 없기 때문에 재배포를 한다고 하여서 프로그램 코드를 공개 할 필요가 없다. 이러한 이유 때문에 상용 소프트웨어를 만드는 회사에서 Permissive 계열의 라이선스를 많이 선택 한다. Permissive 계열 라이선스의 대표적인 예로는 BSD, MIT, Apache 2.0 등이 있다.

2. Weakly Protective

초기 Strongly Protective 계열의 라이선스 조항에 대한 불만으로 인해서 조금 완화한 라이선스이다. 오픈소를 가져다 사용할때, 수정하지 않고 동적 라이브러리 형태로 분리되어 동작한다면 프로그램 코드를 공개할 필요가 없다. Weakly Protective 계열 라이선스의 대표적인 예로는 LGPL과 MPL 등이 있다.

3. Strongly Protective(Network Protective)

자유 소프트웨어 재단(FSF)에서 만든 대표적인 라이선스 체계로 굉장히 강력한 오픈소스 정책이 담겨져있다. 오픈소스를 사용할때에 개작없이 있는 그대로 독립적으로 사용한다면 공개의 의무가 없지만, 조금 이라도 수정하거나 정적/동적으로 참조하여 사용하는 경우 모두 프로그램 코드를 공개해야 한다. 특히나, Network Protective 계열의 라이선스는 클라우드 SaaS 서비스의 특성에도 Stongly Protective를 적용하기 위해서 나온 것으로 배포되지 않고 SaaS 형태로 서비스를 하더라도 프로그램 코드를 공개해야하는 의무가 있다. Strongly Protective(Network Protective) 계열 라이선스의 대표적인 예로는 GPL2, GPL3와 AGPL 등이 있다.

라이선스 계열 분류는 전문에 나타난 내용들의 제약사항의 강도에 따라서 분류를 한 것다. 개발할 제품의 비즈니스 전략에 따라 대략적인 라이선스 정책 방향을 선택 할 수 있을 것이라고 생각한다.