No SQL이란?
NoSQL 데이터베이스는 전통적인 관계형 데이터베이스 보다 덜 제한적인 일관성 모델을 이용하는 데이터의 저장 및 검색을 위한 매커니즘을 제공한다. 이러한 접근에 대한 동기에는 디자인의 단순화, 수평적 확장성, 세세한 통제를 포함한다. NoSQL 데이터베이스는 단순 검색 및 추가 작업을 위한 매우 최적화된 키 값 저장 공간으로, 레이턴시와 스루풋과 관련하여 상당한 성능 이익을 내는 것이 목적이다. NoSQL 데이터베이스는 빅데이터와 실시간 웹 애플리케이션의 상업적 이용에 널리 쓰인다. 또, NoSQL 시스템은 SQL 계열 쿼리 언어를 사용할 수 있다는 사실을 강조한다는 면에서 "Not only SQL"로 불리기도 한다.- 출처 : 위키백과, 우리 모두의 백과사전. -
MongoDB는 대푯적인 NoSQL 서버 프로그램이다.
NoSQL은 최초에는 no sql, sql(Structured Query Language)이 아니다! 라는 목적으로 만들어졌으나, 후에는 SQL의 장점들을 무시할 수 없었기에 그 중 일부를 가져와서 Not Only SQL ! 으로 바뀌었다는 설이 있다.
따라서 애초에 관계형 데이터베이스인 기존의 MySQL , MsSQL 등의 관계지향적 데이터베이스에서 탈피하여 데이터들이 관계성 에 상관 없이 저장되고 사용되어질 수 있도록 한 것이 목적이다.
데이터 들이 저장 되는데에 있어서, 함께 저장되 있는 다른 데이터 들과 관계의 중요성이 낮아진다는 것을 의미한다.
기존의 RDB (관계형 데이터베이스) 에서는, 예로 들자면 사용자 라는 테이블 이 있다고 하자.
테이블 안에는 여러 컬럼 들이 있다. 이름, 나이, 성별 의 컬럼이 있다고 하자.
이 경우 데이터를 집어 넣을때는, 이름, 나이, 성별의 정보만 가진 데이터를 집어넣을 수 있다.
내가 만약 사용자 한명에게 사는 곳 이라는 데이터를 추가로 입력하고 싶다면 ?
테이블을 뜯어 고치거나, join을 통하여 다른 테이블을 새로 생성하는 방법을 사용하여야 한다.
그러나 NoSQL 은 그러한 제한에서 벗어난다. 그것이 NoSQL의 가장 큰 특이점이다.
MongoDB?
위의 설명을 이어서 NoSQL 중 문서형 NoSQL인 MongoDB를 통해 설명하자면,
사용자 라는 컬렉션 이 있다.
그럼 이 사용자라는 컬렉션에 이름, 성별, 나이 를 가지고 있는 사람의 문서 도 집어넣을 수 있고,
이름, 성별, 나이, 취미, 고향 을 가지고 있는 사람의 문서 도 집어 넣을 수 있다.
심지어 이름, 성별, 나이와 관계 없이 강아지를 집어넣을 수도 있다.
예를 들어 견종, 나이, 주인 의 정보를 가진 강아지도 사용자 컬렉션에 들어갈 수 있다.
(그러나 권장하는 바는 아니다.)
따라서 각각의 데이터(MongoDB에서의 Doc, 즉 문서) 들은 데이터가 들어갈 컬렉션(RDB의 테이블과 같다.) 내부의 다른 데이터들과 관계가 없고, 제한받는 값이 없다. 각각의 데이터들은 자신만의 속성을 지닐 수 있게 된다.
이러한 점은 무한한 확장성을 제공해준다.
그러나 실제로 사용하다 보면, 무작정 집어 넣는 것이 꼭 좋지만은 않다는 것을 알게 된다.
비슷한 정보를 가진, 같은 부류의 데이터들을 같은 컬렉션 에 넣는 것이 관리하기가 편하다.
그렇기 때문에 강아지 정보를 사용자 정보에 넣지 않는 것이다.
심지어 앞으로 사용할 모듈인 Mongoose 와 같은 경우는, Schema를 탈피한 MongoDB에게 Schema의 개념을 집어 넣는다.
(그러나 제한은 훨씬 더 적다.)
MongoDB는 insert, query 에 매우 최적화 되어 있다.
따라서 MongoDB의 장점은
1. 많은 양의 문서를 insert하기에 적절하다.
2. 데이터들을 분산시켜 저장할 수 있으며, query하여 찾는 속도가 빠르다.
3. 어떤 속성값 (Column)을 가질지 결정하지 못했을 때도 컬렉션을 만들고, 문서를 저장할 수 있다.
4. 무한한 확장성
그러나 항상 장점만 있는 것은 아니다.
NoSQL은 관계성을 탈피하면서 RDB의 여러 장점을 잃었다.
그 중 하나가 트랜잭션이 불가능하다는 것이다.
내가 친구에게 돈을 입금한다는 것을 DB로 표현하자면,
내가 친구에게 돈을 입금시키고,
은행은 내 계좌의 돈을 입금시킨 돈만큼 줄인다.
은행은 친구의 계좌의 돈을 입금된 돈만큼 늘린다.
그럼 친구는 돈을 받게된다.
만약 은행에서 전산 오류가 나서 입금된 돈을 늘리지 못했다면, 내 돈은 입금되기 전 상태로 유지되어야 한다.
SQL 에서는 이러한 트랜잭션이 가능하다.
그러나 NoSQL에서는
내가 친구에게 돈을 입금시키고, 은행이 내 계좌의 돈을 줄였는데,
은행이 친구의 계좌에 돈을 집어넣으려는데 에러가 났다.
그럼 거기에서 에러가 난 것으로 종료된다. 내 돈은 이미 줄어들었다 !
어떤 일련의 과정들이 실행될 때에, 모든 과정이 끝날때까지는 전체 값을 바꾸지 않고 기존의 값을 유지할 수 있어야 한다.
이것이 NoSQL에서는 불가능하다. (구현하자면 가능하나, 자체적으로 지원해주지는 않는다.)
RDB가 아니므로 Join도 불가능하다.
그러나 그러한 단점에도 불구하고, NoSQL은 빅데이터 시대에 많은 데이터를 저장하고 사용하기에 획기적인 기술이다.
많은 대기업에서 일부 사용하고 있다고 한다. (일부는 SQL, 일부는 NoSQL 등의 방식)
예로 카카오톡은 오픈 소스 라이센스에 MongoDB 의 bson (binary jason) 을 사용한다고 써있다.
그럼 다음부터는 직접 사용해보면서 온몸으로 체험해보자 !