한 손에는 RDB를 한 손에는 NoSQL 을
데이터베이스는 검색과 축적이 쉽도록 정리된 정보의 모음입니다. 대부분의 서버 애플리케이션은 클라이언트에서 받은 데이터를 어딘가에 저장합니다. 그것이 메모리일 수도 있고, 텍스트 파일일 수도 있고, 엑셀일수도 있고, 특정 프로토콜을 통하여 생성한 바이너리 파일일 수 도 있습니다. 단순히 저장만 하는 것이라면 간단한 코드를 사용해서 데이터 추가가 가능할 것입니다. 만약에 검색을 지원해야하고, 입력한 데이터의 수정 및 삭제도 가능해야하며 수많은 읽기와 수정 삭제 요청이 동시에 오는 경우에 동시성 제어도 해야한다면 어떻게 될까요? 데이터를 안전하게 보관하기 위하여 굉장한 수고가 들어갈 것입니다.
처음에 데이터베이스는 정리된 정보의 모음이라고 하였지만, 보통 현업에서 데이터베이스라고 하면 데이터베이스 소프트웨어를 의미합니다. 따라서 이 글에서도 데이터베이스는 데이터베이스 소프트웨어를 의미한다고 생각하시면 됩니다. 데이터베이스는 데이터 저장시 수많은 문제가 생길 수 있는 야생의 상황에서도 데이터를 가능한 안전하게 보관, 검색, 수정, 삭제가 가능하도록 해주는 고마운 소프트웨어입니다.
거의 99.9%의 개발자가 직접만든 데이터베이스가 아닌 만들어진 데이터베이스를 사용합니다. 유명한 데이터베이스를 몇가지 보자면 오라클(oracle), 마이에스큐엘(mysql/mariasql), 에스큐엘서버(SQL Server), 포스트그레스큐엘(Postgre SQL), 에스큐엘라이트(sqlite), 몽고디비(mongodb), 카산드라(cassandra), 다이나모디비(dynamodb), 네오포제이(Neo4j), 코크로치DB(cockrachdb)등이 있습니다. 앞서 열거한 것들은 모두 국외에서 만들어진 데이터베이스입니다. 국산 데이터베이스 소프트웨어로 알티베이스, 큐브리드, 티베로 등이 있습니다. 이름만 열거했는데도 굉장히 많습니다만, 무료로 사용가능한 데이터베이스중에는 MySQL을 가장 많이 사용하고 있습니다. 디비엔진 랭킹에 보시면 이외에도 많은 데이터베이스가 있다는 것을 확인 하실 수있습니다.
데이터베이스는 여러가지로 구분할 수 있는데, RDB와 RDB가 아닌 것으로(NoSQL) 보통 구분합니다. RDB가 아닌 데이터베이스는 NoSQL 또는 NewSQL로 구분하는 경우가 많습니다. RDB의 R은 relational의 약자로 관계형 데이터베이스를 의미합니다. 관계형 데이터베이스는 데이터를 행(row)과 열(column)로 이루어진 테이블로 관리하며, 기본키(Primary key)를 사용하여 각 행을 식별합니다. 또한 각각의 테이블 간에 관계를 지을 수 있습니다. RDB에서 가장 유명한 데이터베이스들은 Oracle, mysql, SQL Server, Postgresql 입니다. 서버개발자 100명이 있다면 저중에 한가지는 반드시 써봤을거라 생각합니다.
RDB의 특징으로 ACID로 불리는 트랜잭션이 있습니다. ACID는 각각 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 내구성(Durability)을 의미합니다. 원자성은 트랜젝션을 구성하는 명령이 하나의 묶음으로 처리되어서 함께 성공하거나 실패하는 것을 보장하는 것을 의미합니다. 일관성은 트랜잭션에서 실행된 변경사항이 데이터베이스의 무결성조건을 만족하는 것 입니다. 격리성은 두개의 트랜잭션이 서로에게 영향을 미칠 수 없다는 것을 의미합니다. 내구성은 트랜잭션이 성공적으로 끝나면 그결과가 데이터베이스에 계속 유지된다는 것을 말합니다. ACID 트랜젝션은 데이터베이스에서 데이터의 일관성을 유지할 수 있도록 해줍니다. 또한 문제가 생긴경우에는 이전의 상태로 되돌릴 수 있습니다. 최근에는 NoSQL 데이터베이스에서도 트랜잭션을 지원하는 경우가 많이 생겼습니다. 다만, NoSQL은 보통 분산 데이터베이스를 가정하는 경우가 많아서 RDB보다는 추가적인 제약사항이 있습니다.
SQL은 말그대로 쿼리(데이터 검색)를 하기위한 프로그래밍 언어입니다. SQL도 하나만 있는 것이 아니라 ANSI 표준 SQL이 있고, 각 RDB별로 방언들이 있습니다. 데이터베이스 전문가가 아니라면 대부분의 경우에 ANSI표준 SQL만 익히셔도 무방합니다. SQL도 사실 데이터를 질의 하기위한 언어이므로 RDB전용이라고 보기는 힘듭니다. NoSQL의 경우에도 SQL엔진을 도입해서 데이터를 조금 더 편하게 질의할 수 있도록 지원하는 경우가 많습니다.
NoSQL의 뜻이 SQL을 안쓴다는 의미로 사용되기도 합니다만, 최근에는 Not Only SQL의 의미로 많이 사용합니다. 애플리케이션을 작성할 때 RDB와 NoSQL의 장단점을 살려서 사용하면 좋기 때문에 Not Only SQL이라는 의견에 저도 조금 더 찬성합니다.
RDB는 데이터 저장, 질의, 수정, 삭제가 용이하지만 반면에 성능을 올리는게 쉽지 않습니다. 데이터베이스의 성능을 높이기 위해서는 머신의 성능을 좋게하는 스케일업 또는 머신을 여러대로 분리하는 스케일 아웃이 필요합니다. 스케일 업은 장비를 좋게 하면 되지만, 스케일 아웃은 데이터베이스가 여러대가 되면서 분산되게 되므로 이때 트랜잭션을 사용하게 되면 성능이 떨어지게 됩니다. 또한 스케일 아웃을 하는 것도 보통일이 아닙니다. (최근에는 vitess를 사용하면 예전보다는 비교적 쉽게 적용이 가능합니다.) RDB의 이러한 문제들을 해결 하기 위해 나온 것이 NoSQL로 통칭하는 데이터베이스 애플리케이션입니다.
NoSQL은 데이터 모델링을 어떻게 하느냐에 따라서 다양한 NoSQL데이터 베이스들이 있습니다.
아래는 위키피디아에서 가져온 데이터 타입별 NoSQL 데이터베이스 소프트웨어 목록입니다.
https://en.wikipedia.org/wiki/NoSQL#Types_and_examples
Key–value cache : Apache Ignite, Couchbase, Coherence, eXtreme Scale, Hazelcast, Infinispan, Memcached, Redis, Velocity
Key–value store : Azure Cosmos DB, ArangoDB, Amazon DynamoDB, Aerospike, Couchbase
Key–value store (eventually consistent) : Azure Cosmos DB, Oracle NoSQL Database, Riak, Voldemort
Key–value store (ordered) : FoundationDB, InfinityDB, LMDB, MemcacheDB
Tuple store : Apache River, GigaSpaces, Tarantool, TIBCO ActiveSpaces, OpenLink Virtuoso
Triplestore : AllegroGraph, MarkLogic, Ontotext-OWLIM, Oracle NoSQL database, Profium Sense, Virtuoso Universal Server
Object database : Objectivity/DB, Perst, ZopeDB, db4o, GemStone/S, InterSystems Caché, JADE, ObjectDatabase++, ObjectDB, ObjectStore, ODABA, Realm, OpenLink Virtuoso, Versant Object Database, ZODB
Document store : Azure Cosmos DB, ArangoDB, BaseX, Clusterpoint, Couchbase, CouchDB, DocumentDB, eXist-db, IBM Domino, MarkLogic, MongoDB, Qizx, RethinkDB, Elasticsearch, OrientDB
Wide Column Store : Azure Cosmos DB, Amazon DynamoDB, Bigtable, Cassandra, Google Cloud Datastore, HBase, Hypertable, ScyllaDB
Native multi-model database : ArangoDB, Azure Cosmos DB, OrientDB, MarkLogic, Apache Ignite, Couchbase, FoundationDB, MarkLogic, Oracle Database
Graph database Azure Cosmos DB, AllegroGraph, ArangoDB, InfiniteGraph, Apache Giraph, MarkLogic, Neo4J, OrientDB, Virtuoso
Multivalue database : D3 Pick database, Extensible Storage Engine (ESE/NT), InfinityDB, InterSystems Caché, jBASE Pick database, mvBase Rocket Software, mvEnterprise Rocket Software, Northgate Information Solutions Reality (the original Pick/MV Database), OpenQM, Revelation Software's OpenInsight (Windows) and Advanced Revelation (DOS), UniData Rocket U2, UniVerse Rocket U2
타입별로 살펴보면 키밸류캐시, 키밸류스토어, 튜플스토어, 트리플스토어, 오브젝트 데이터베이스, 도큐먼트스토어, 와이드컬럼스토어, 네이티브 멀티모델 데이터베이스, 그래프DB, 멀티밸류DB로 구성됩니다. 매우 많은 데이터베이스가 있습니다만, 사실 업무에 사용되는 것은 극히 일부이며 데이터베이스의 도입은 애플리케이션 전체에 영향을 줄 수 있으니 매우 꼼꼼히 살펴보아야 합니다. 십수년의 개발자 생활 동안 많은 데이터베이스를 다뤄 보았습니다만, 저도 목록에 있는 타입별로 하나씩 사용해보지는 못했습니다. 제가 사용해본 타입들인 키밸류캐시, 키밸류스토어, 도큐먼트 스토어, 와이드 컬럼 스토어만 간략하게 설명드리겠습니다.
키밸류캐시로 가장 유명한 두가지는 memcached와 redis입니다. memcached는 키-값의 형태의 데이터만 제공하며 redis는 다양한 데이터 구조를 지원합니다. 둘 다 클러스터를 쉽게 지원하므로 분산환경에서 편하게 사용하실 수 있습니다. redis 사용시의 주의점으로 redis는 싱글스레드 라서 매우 헤비한 작업을 하는 경우 캐시서버가 멈추게 됩니다. 따라서 헤비한 작업은 하지 않는 것이좋습니다. memcached는 멀티스레드입니다.
키밸류스토어로는 DynamoDB, couchbase가 많이 사용됩니다. 앞서 언급한 캐시와 다른 점은 캐시는 서버를 껏다가 켜면 데이터가 휘발되어 날아갈 수 있지만, 키밸류스토어는 그렇지 않다는 것입니다. 쓰기와 업데이트가 빈번하게 일어나는 게임서버에서 많이 사용합니다.
도큐먼트 스토어는 대표적으로 mongodb가 유명합니다. 피파온라인에서 데이터베이스로 채용하였고 라인에서도 많이 사용하고 있습니다. 데이터로 JSON과 매우 비슷하게 생긴 BSON이라는 문서모델을 저장합니다. RDB에서는 테이블개념인 콜렉션이라는 개념이 있으며, 검색시 인덱스를 사용하거나, ACID트랜잭션을 지원하는 등 RDB에서만 사용했던 부분들을 많이 가져오려고 시도하고 있습니다.
와이드 컬럼 스토어는 RDB와 유사하게 행(row)과 열(column) 테이블을 사용합니다. RDB와 다른 점으로는 행마다 열의 이름과 타입이 다를 수 있다는 것입니다. 또한 2차원 키밸류 저장소로 사용할 수 있습니다. 대표적으로 구글의 Bigtable이 있으며 오픈소스로는 아파치 카산드라가 있습니다. 카산드라의 특징으로 단일장애점(SPOF : single point of failure)이 없으며 확장성과 성능이 뛰어나다는 특징이 있습니다.
리누스 토발즈는 git의 성공에 대해 이야기 하면서 코드를 어떻게 작성하는지 보다는 데이터 구조를 어떻게 하는지가 더 중요하다고 말하였습니다. 마찬가지로 프로그램 요구사항에 따라서 어떤 데이터베이스를 사용해야할지 어떤 데이터 타입을 써야할지 고민하는 것이 필요합니다. 예전에는 RDB로 대부분의 문제를 해결하던 시절이 있었습니다만, 수많은 데이터가 쌓이고, 예전보다 훨씬 많은 부하가 발생하며, 서버들은 클라우드에서 돌아가고 DB도 분산환경을 고려해야 하는 현대의 프로그래밍에는 RDB와 NoSQL을 둘 다 적절히 사용하는 것이 좋은 프로그래머의 덕목이 되었습니다. 이 글이 모쪼록 여러분의 선택에 도움이 되었길 바랍니다. 제가 작성한 내용중 틀린 내용이 있거나 그외 관련된 좋은 내용이 있다면 댓글로 알려주세요~ 감사합니다.