CouchDB
|
소파 데이터베이스? 괴상한 이름의 정체는 데이터베이스의 특성에 대해 좀 색다른 관점을 제공하는 시스템입니다. 보통 관계형 데이터베이스는 Consistency와 Availability를 중요하게 여깁니다. Consistency 란 누구나 같은 데이터를 얻어야 한다는 뜻이고, Availability 란 언제나 데이터를 얻을 수 있어야 한다는 뜻입니다. 하지만 Availability를 포기하는 대신 Partition Tolerance를 추구하는 Paxos 같은 시스템도 있습니다. Partition Tolerance 는 데이터베이스가 물리적으로 나뉘어져 여러 개체로 존재할 수 있음을 의미합니다. CouchDB는 Consistency를 포기하는 대신 Partition Tolerance를 추구합니다. Consistency를 포기한다는 것은 데이터가 어떻게 되든 상관 없다는 뜻이 아니라, 같은 데이터를 여럿이서 갱신하려고 해도 록을 걸거나 트랜잭션처리로 방해하지 않고 그냥 Conflict가 일어나도록 허락한 후에 Resolve하는 방식을 취하겠다는 것입니다. 그러니 사이 사이 Consistency가 망가지게 됩니다. 서브버전과 같은 버전 관리 시스템이 취하는 방식이지요. 이런 선택의 목적은 확장성(Scalability)과 고가용성(High Availability)입니다. 한편 서브버전에서는 변경집합(ChangeSet)이라는 업데이트 단위가 있습니다. 이 단위 전체가 서버에 등록되거나 아니면 하나도 등록되지 못하거나 전부 아니면 전무 식의 원자성을 제공합니다. CouchDB에서는 이런 단위를 문서(Document)라고 부릅니다. JavaScript의 JSON 개체가 문서의 구체적인 형태입니다. 데이터베이스는 JSON 개체의 단순 집합으로 정의됩니다. 각 문서는 JSON 으로 표현되기만 한다면 아무리 복잡해도 상관없습니다. 이 때문에 CouchDB를 문서지향적(Document-oriented) 데이터베이스라고 부릅니다. 이 외에도 오가네의 눈길을 끌만한 몇 가지 재미있는 특징들을 더 갖고 있습니다.
- Query 와 Index 는 MapReduce 방식을 따릅니다. 이 때 필요한 함수는 JavaScript를 사용합니다.
- MapReduce 를 포함하여 거의 모든 특성에 B-Tree 기반의 스토리지 엔진을 활용하고 있습니다.
- API 는 RESTful 합니다. 즉 HTTP 의 GET, PUT, POST, DELETE 등의 메쏘드를 활용하고, URL로 자원을 정의하며, 상태가 없습니다.
- 데이터베이스 자체는 Erlang 으로 구현되어 있습니다. 때문에 Concurrency를 강조하고 있지요.
- 데이터베이스라는 본연의 업무를 벅어나 애플리케이션 서버로서의 특성도 갖추고 있습니다. HTML 템플릿과 같은 프리젠테이션 계층을 갖고 있습니다.
- 데이터베이스 사이의 양방향 동기화를 지원합니다.
- 변경 통보(Change Notification)를 지원합니다.
- 스마트폰에서도 실행될 수 있을 만큼 간단합니다.
하지만 전체적인 인상은 아직 성숙하지 않은 제품이라는 것입니다. 개념 모델과 도구들은 아직 실험적인 상태를 벗어나지 못했다는 느낌을 줍니다. 책도 그다지 잘 쓴 작품으로 보기 힘들고요. 몇 가지 흥미 있는 디자인 패턴들의 조합을 살펴본 것으로 만족해야겠습니다.