NoSQL 중 하나인 Couchbase: 사용 후기를 시작하며

상당히 뒤늦게 NoSQL을 본격적으로 사용해 볼 기회가 생겼다. 이전에 memcached나 redis 등을 경험했지만 관점에 따라 이런 종류는 NoSQL에 포함하지 않는 경우도 있으니 제외한다. MongoDB 같은 경우에는 옆에서 운영하는 모습을 지켜보기만 했고 예제 수준에서 건드려 보았을 뿐이라 NoSQL을 제대로 경험해 보기는 Couchbase가 처음이었다. 우선은 간략하게 실무적인 관점에서 특성을 나열하고 추후 자세히 살펴보기로 한다.

처음 접했던 순간

사실은 회사에 입사한 당일 Couchbase 교육을 받게 되었다. 다소 황당한 상황이었지만, 운영하기는 정말 편하겠다는 생각은 들었다. 거짓말 조금 보태서 그냥 대충 설치하고 마스터/슬레이브 신경쓸 필요도 없이 서버를 추가하기만 하면 알아서 클러스터가 재배치되고, 운영 중 확장도 가능한 모습이었다. 교육 과정 중 대략 예제를 한 번 따라해 보기는 했지만, 이후 실제 업무를 하면서 익숙하지만 애증의 RDBMS 위주로 작업하며 Couchbase는 점점 기억에서 희미해졌다.

Document Database

그러다가 어떤 일을 하게 되면서 그 일의 내용을 자세히 들여다 보니 on demand 구성이 아닌 ready to serve 형태로 미리 만들어 놓으면 좋겠다는 생각이 들었다. 게다가 카테고리 따라 데이터 속성이 조금씩 차이가 있으니 형식상으로는 “Document” DB가 적합해 보였다. 그런 데이터베이스스 MongoDB가 가장 보편적인 듯 했지만 이미 사내에 Couchbase를 도입하였기에 별 고민 없이 Couchbase를 선택했다 (어차피 Mongo나 Couchbase나 모르기는 마찬가지였으니). 일을 진행하면서, 잠시나마 신기술(?)이라는 부담 때문에 그냥 RDBMS를 사용할까 고민하기도 했었다. 어쨌든 수많은 NoSQL 제품들이 그러하듯 Couchbase 또한 Key - Value 형태이며, 이 때 값으로서 보편타당하게 json을 사용한다. 그저 key로 값만 취하는 사용 형태라면 여기까지만 알아도 충분하다. 예를 들면 사용자 로그인 토큰 저장소가 전형적으로 이렇게 사용하는 방법이 되겠다. 하지만 이 정도 수준이라면 차라리 redis가 훨씬 나을 수도 있다.

Fetch value by range: View Query

예전부터 개인적으로 어떤 NoSQL 제품군이건 가장 궁금했던 내용은 기존의 RDBMS에서 다음과 같이 SQL 구문으로 어떤 조건을 통해 원하는 여러 값을 (정렬하여) 가져오듯이, NoSQL Database에서도 비슷하게 이런 형태로 특정 조건에 해당하는 값들을 가져오는 방법이 있는지가 매우 궁금했다.

SELECT * FROM table WHERE column > value

이 부분이 해결되지 않으면 앞서 기술했듯이 그냥 RDBMS를 사용하여 프로젝트 결과물을 제 때 출시하는 편이 나을 수도 있었다. 하지만 그리 한다면 별로 재미없는 프로젝트가 될 게 뻔해서 막막해 보였지만 Couchbase 공식 개발 문서를 자세히 읽어나갔다. 여담인데, 그 동안 보아 왔던 가이드 문서 중에서돛 정말 잘 되어 있는 문서라고 생각한다. 다른 블로그 글이나 서적류를 볼 필요 없이 공식 가이드 문서만 꼼꼼히 읽어 봐도 Couchbase를 제대로 활용할 수 있다. 오픈소스이긴 하지만 아무래도 엔터프라이즈 버전을 팔아야 하니까 가이드 문서에 공을 들인 듯 하다.

다시 돌아와서, 매뉴얼의 어느 부분에서1 Couchbase의 View Query는 “B-Tree” 알고리즘을 따른다고 되어 있는 내용을 보았다. 그렇다면, RDBMS에서 사용하는 인덱스와 동일한 알고리즘이니 RDBMS에서 가능한 range filter가 Couchbase에서도 가능하겠다는 생각이 들었다.

Couchbase에서는 이렇게 조건을 만족하는 범위 사이의 값을 가져오는 기능을 “View Query”라고 칭하는데, map-reduce 방식이다. map/reduce function은 javascript로 작성하게 되어 있다. 아무래도 이 부분을 처음 접하면 매우 막막할텐데 이 부분도 조만간 다시 집중해서 다루도록 하겠다. RDBMS식 모델링에 익숙한 사람들이 겪게 되는 가장 큰 난관이 아닐까 싶다. 약간의 힌트라면 map 함수 결과는 1:1 뿐만 아니라 1:n도 가능하며, 억지스럽기는 해도 일종의 ‘join된’ 형태와 흡사하다는 정도?

View Query만으로도 요구사항을 충분히 만족할 수 있다면 좋겠지만 그러기가 쉽지는 않다. 그리고 RDBMS의 인덱스와 마찬가지로 View Query 또한 추가하면 할수록 데이터베이스 엔진 자체의 성능에 좋을 리가 없다. Couchbase는 이 부분을 각종 3rd party 서비스, 특히 ElasticSearch와 멋지게 연동하여 해결할 수 있는 방법을 제공하는데, 이 내용 또한 따로 자세히 언급하도록 하겠다.


  1. 처음에 그 내용을 보았을 때는 3.x 버전이었다. 이후 글을 쓰면서 다시 찾아보려 했더니 그새 올라간 버전 때문에 4.0 문서가 기본으로 나오면서 이상하게도 이 내용을 다시 못 찾겠다… [return]
comments powered by Disqus