SQL과 NoSQL: 장점 및 단점
데이터를 저장하고 보호하고 그에 액세스하기 위한 최선의 방법은 무엇일까요? 이는 기본적이면서도 핵심적인 의사결정입니다. 데이터는 오늘날 거의 모든 조직의 성공을 결정짓는 초석이 되었기 때문입니다. 대부분의 기업은 SQL과 NoSQL 데이터베이스 사이를 고민할 것입니다. 각각에는 고유의 장단점이 있습니다.
SQL 데이터베이스는 1970년대부터 검증된 솔루션이었습니다. SQL은 행과 열로 이뤄진 고도로 정형화된 테이블로 구성되어 있으며, 테이블은 공통 특성을 통해 서로 연결되어 있습니다. 모든 열에는 그에 대응하는 행에 대한 값이 있어야 합니다. NoSQL('not only SQL(SQL뿐만이 아닌)' 또는 'non-SQL(비SQL)')은 관계형 테이블의 경직성을 탈피하기 위해 나중에 등장한 데이터베이스로서 모든 유형의 정형 및 비정형 데이터를 함께 저장하고 그에 액세스할 수 있습니다. NoSQL은 굉장히 유연하며 개발자들이 쉽게 사용하거나 수정할 수 있습니다. SQL, NoSQL 데이터베이스, 두 가지의 기본적인 차이점에 대해 자세히 알아보세요.
그럼 무엇을 선택해야 할까요? 온갖 다양한 요소에 따라 정답은 달라질 수밖에 없습니다. 쿼리, 가용성, 컴플라이언스는 물론 데이터 유형의 다양성, 예상되는 데이터 증가량까지도 고려해야 합니다.
SQL과 NoSQL 비교 표
SQL |
NoSQL |
||
장점 |
단점 |
장점 |
단점 |
표준화된 스키마 |
하드웨어 |
연속적 가용성 |
표준화되지 않은 언어 |
대규모 사용자 커뮤니티 |
데이터 정규화 |
쿼리 속도 |
소규모 사용자 커뮤니티 |
코딩 필요 없음 |
경직성 |
민첩성 |
복잡한 쿼리의 비효율성 |
ACID 컴플라이언스 |
많은 리소스를 소모하는 확장 |
비용 |
데이터 검색 비일관성 |
올바른 의사결정을 내릴 수 있도록 먼저 SQL과 NoSQL의 장단점을 자세히 비교해 봅시다.
SQL의 장점
표준화된 스키마
SQL 데이터베이스는 스키마가 표준화되어 경직적이고 수정하기가 어렵지만 그에 따른 분명한 장점도 존재합니다. 데이터베이스에 추가된 모든 데이터는 열과 행으로 이뤄진 연결된 테이블들의 잘 알려진 스키마와 부합해야만 합니다. 이러한 특성을 경직적이라고 여길 수도 있지만 데이터의 일관성, 무결성, 보안, 컴플라이언스가 중요할 때는 유용한 특성입니다.
대규모 사용자 커뮤니티
SQL 프로그래밍 언어는 거의 50년이 된 프로그래밍 언어로서 성숙도가 높으며 여전히 널리 사용되고 있습니다. 또한 다양한 팁과 널리 입증된 모범 사례를 공유하는 수많은 전문가로 구성된 강력한 커뮤니티를 갖추고 있습니다. 기술 수준을 연마하고 함께 협력할 기회가 많습니다. 필요하다면 컨설턴트와 SQL 벤더가 추가 지원을 제공할 수도 있습니다. 따라서 SQL에서는 개발자가 필요한 정답을 어렵지 않게 찾아낼 수 있습니다.
코딩 필요 없음
SQL은 사용자 친화적 언어입니다. 코딩 없이 간단한 키워드만으로도 데이터베이스를 관리하거나 쿼리할 수 있습니다. 대다수 개발자는 대학에서 SQL 언어를 학습합니다.
ACID 컴플라이언스
관계형 데이터베이스 테이블은 고도로 정형화되어 있는 덕분에 SQL 데이터베이스는 ACID 컴플라이언스를 준수할 수 있습니다. 그에 따라 테이블은 동기화되며 트랜잭션의 유효성이 확보됩니다. 따라서 절대 오류가 발생해서는 안 되며 최상의 데이터 무결성을 갖춰야 하는 애플리케이션을 운영할 때는 SQL이 적합할 수 있습니다.
ACID 속성은 다음과 같습니다.
- 원자성(Atomicity): 데이터와 트랜잭션의 모든 변경 사항은 하나의 작업으로 완벽하게 실행되어야 합니다. 그것이 불가능하다면 어떤 변경 사항도 수행되지 않습니다. 전체가 하나처럼 작동해야 한다는 의미입니다.
- 일관성(Consistency): 트랜잭션의 시작과 끝에서 데이터가 유효하고 일관되어야 합니다.
- 독립성(Isolation): 동시에 실행되는 여러 트랜잭션이 서로 영향을 미치지 않아야 하며 트랜잭션을 순차적으로 실행했을 때와 동일한 결과가 발생해야 합니다.
- 지속성(Durability): 트랜잭션이 완료되면 그에 관계된 데이터는 영구적으로 유지되어야 하며 변경되어서는 안 됩니다.
SQL의 단점
하드웨어
SQL 데이터베이스는 일반적으로 기존 서버를 구성하는 RAM, CPU, SSD 등의 성능을 높이거나 또는 더 크고 값비싼 서버로의 마이그레이션을 통해 용량을 높이는 방식의 수직 확장만 가능합니다. 따라서 데이터가 증가하면 그에 따라 하드 드라이브 공간을 계속 늘려야 하며, 점차 발전하여 고도화되는 기술을 실행하려면 그에 맞게 더 빠른 머신을 갖추어야 합니다. 따라서 데이터베이스 벤더는 최신 릴리스를 실행할 수 있도록 하드웨어의 주기적인 업그레이드를 요구할 것입니다. 이러한 환경에서 하드웨어는 금방 구식이 될 것입니다. 업그레이드는 당연히 비싸고 많은 리소스를 소모합니다. 또한 SQL의 하드웨어를 운영하려면 일일 단위로 유지 관리 작업을 수행하고 운영비를 지출해야 합니다. 이는 끝없는 쳇바퀴와도 같을 것입니다.
데이터 정규화
데이터 저장소가 값비싸던 시절에 개발된 관계형 데이터베이스는 데이터 중복을 최소화하도록 설계되었습니다. 각 테이블은 서로 다른 정보를 지니며 공통의 값을 사용해 서로 연결되어 쿼리될 수 있습니다. 하지만 SQL 데이터베이스가 커지면 수많은 테이블 사이에 필요한 룩업과 조인으로 인해 속도가 느려질 수 있습니다.
경직성
SQL 데이터베이스에서는 반드시 사전에 스키마를 정의해야 합니다. 한번 정의한 스키마는 경직적이며 이를 수정하는 과정은 대개 까다롭고 많은 리소스를 소모합니다. 따라서 데이터베이스를 실제로 구현하기도 전에 사전 계획 단계에 상당한 시간을 투자해야 합니다. 그러므로 SQL은 모든 데이터가 정형화되어 있으며 그 규모와 유형 측면에서 많은 변화가 발생하지 않을 것으로 예측될 때만 적합합니다.
많은 리소스를 소모하는 확장
앞에서 언급한 것처럼 SQL 데이터베이스는 일반적으로 하드웨어 투자 확대를 통해 수직적으로 확장합니다. 이를 위해서는 많은 시간과 비용이 소모됩니다. 때에 따라서는 파티셔닝을 통한 SQL 데이터베이스의 수평 확장을 시도할 수도 있습니다. 하지만 이는 과정이 복잡하여 더욱 많은 시간과 리소스가 소모될 수밖에 없습니다. 이를 위해서는 고도로 숙련된 고임금 개발 인력이 코딩을 해야 합니다. 또한 데이터가 계속 증가한다면 SQL 데이터베이스를 꾸준히 확장하더라도 완벽한 환경을 구축하기란 불가능에 가까울 것입니다. 반면에 NoSQL 데이터베이스는 수평 확장이 가능하므로 더욱 간편하고 비용 효율적으로 용량을 확장할 수 있습니다. NoSQL은 클라우드 컴퓨팅 및 빠르게 규모가 증가하고 있는 거대한 데이터 세트를 처리하는 용도로 적합합니다.
NoSQL의 장점
연속적 가용성:
NoSQL에서는 데이터가 여러 서버와 지역으로 분산되므로 단일 장애 지점이 존재하지 않습니다. 따라서 NoSQL은 연속적 가용성이 확보되며 다운타임이 존재하지 않는 안정적이고도 탄력적인 데이터베이스입니다.
쿼리 속도
NoSQL 데이터베이스는 데이터 중복을 야기하지 않으며 비정규화되어 있으므로 특정 쿼리에 필요한 모든 정보가 상당 부분 이미 함께 저장되어 있으며 조인이 필요하지 않습니다. 따라서 특히 대규모 데이터를 작업하는 경우 룩업이 훨씬 간편합니다. 또한 그렇기 때문에 NoSQL은 단순한 쿼리에 굉장히 빠르게 반응할 수 있습니다. 물론 SQL 데이터베이스도 아주 신속하게 쿼리를 반환할 수 있습니다. SQL도 정형화된 데이터에 대한 고도로 복잡한 쿼리를 지원합니다. 하지만 SQL 데이터베이스가 커지고 복잡한 조인 요구 사항이 증가함에 따라 쿼리 속도가 급감할 수 있습니다.
민첩성
NoSQL은 데이터 저장 비용이 급감하는 한편 개발자 비용이 급증함에 따라 나타난 데이터베이스입니다. 데이터 중복은 더 이상 문제가 되지 않았습니다. 대신 NoSQL은 최대한의 유연성을 보장하여 개발자가 창의성과 생산성을 증대할 수 있도록 설계되었습니다. NoSQL 데이터베이스는 행과 열로 제한되지 않기 때문에 사전에 스키마를 정의할 필요가 없습니다. 그 대신 정형, 반정형, 비정형, 다형성 데이터를 포함하는 모든 유형의 데이터를 처리할 수 있는 역동성을 갖추고 있습니다. NoSQL 데이터베이스는 구조를 사전에 정의하지 않아도 시작할 수 있으며, 다운타임을 발생시키지 않고도 데이터 유형과 필드를 간편하게 상황에 따라 추가할 수 있습니다. NoSQL은 이러한 장점들 때문에 오늘날의 애자일 개발 팀에 적합합니다. 개발자는 사전 계획에 시간과 노력을 쏟을 필요 없이 바로 데이터베이스 구축을 시작할 수 있습니다. 또한 요구 사항이 달라지고 새로운 데이터 유형이 추가되어도 그에 따른 변경 사항을 신속히 적용할 수 있습니다. 이렇게 유연하고 적응성이 뛰어난 NoSQL은 다양한 유형의 데이터를 보유하고 있으며 새로운 기능을 계속 추가할 예정인 조직에게 어울리는 데이터베이스입니다.
NoSQL 데이터베이스는 하나의 경직된 형태로 고정되지 않습니다. NoSQL은 대개 하나의 서버에 존재하는 SQL 데이터베이스처럼 경직적인 중앙집중식 데이터 모델의 제약을 받지 않습니다. 대신 NoSQL은 여러 서버에 분산되어 있는 서로 다른 데이터베이스 모델 유형을 연결할 수 있는 유연성을 갖추고 있습니다. NoSQL은 다양한 데이터베이스 유형을 포함하고 있어서 개발자가 개별 데이터와 사용 사례에 부합하는 최적의 조합을 자유롭게 활용할 수 있습니다. NoSQL 데이터베이스의 주요 유형으로는 키/값, 문서, 테이블 형식(또는 와이드 열), 그래프, 멀티 모델 이 있습니다.
적은 비용
NoSQL 데이터베이스는 수평 확장을 하므로 비용 효율적으로 용량을 키울 수 있습니다. 값비싼 하드웨어를 업그레이드할 필요 없이 상용 서버나 클라우드 인스턴스를 추가하는 것만으로도 저렴하게 확장할 수 있는 것입니다. 오픈 소스인 NoSQL 데이터베이스는 조직에게 합리적인 비용의 선택지를 제공합니다. NoSQL은 클라우드 컴퓨팅 및 빠르게 규모가 증가하고 있는 거대한 데이터 세트를 처리하는 용도로 적합합니다.
NoSQL의 단점
표준화되지 않은 언어:
NoSQL 쿼리를 수행할 수 있는 표준화된 언어는 존재하지 않습니다. 데이터를 쿼리하는 데 사용되는 구문은 NoSQL 데이터베이스의 유형에 따라 달라집니다. 쉽게 숙달할 수 있는 하나의 언어만 존재하는 SQL과는 달리 NoSQL에서는 언어 학습에 상당한 기간이 필요합니다. 예를 들어 지금까지 그래프 데이터베이스만 구축하고 관리해온 개발자라면 와이드 열 데이터베이스를 즉시 활용하기가 어려울 것입니다.
소규모 사용자 커뮤니티
개발자들은 NoSQL 데이터베이스를 10년 이상 사용해왔으며 그 커뮤니티는 빠르게 성장하고 있습니다. 하지만 이는 아직 SQL 커뮤니티만큼은 성숙하지 못했습니다. 그래서 관련 문서에서 다루지 않는 문제는 해결하기 어려울 수 있습니다. 또한 NoSQL 관련 컨설턴트와 전문가도 상대적으로 부족한 편입니다.
복잡한 쿼리의 비효율성
유연성에는 대가가 따릅니다. NoSQL 데이터베이스에는 다양한 데이터 구조가 존재하기 때문에 쿼리의 효율성이 비교적 낮습니다. SQL 데이터베이스와는 달리 NoSQL에는 복잡한 쿼리를 수행하기 위한 표준 인터페이스가 존재하지 않습니다. 간단한 NoSQL 쿼리를 수행하려고 해도 프로그래밍 지식이 필요할 가능성이 높습니다. 따라서 쿼리를 수행하기 위해서는 개발자나 데이터 과학자처럼 기술에 대한 이해도가 높고 높은 임금을 받는 인력이 필요합니다.
데이터 검색 비일관성
NoSQL 데이터베이스는 분산되어 있어서 데이터를 신속하게 이용할 수 있습니다. 하지만 반대로 데이터의 일관성을 항상 보장하기가 어려울 수도 있습니다. 쿼리가 최신 업데이트된 데이터를 반환하지 못할 수도 있으며 부정확한 정보를 수신할 수도 있습니다. NoSQL은 분산식이라 어떤 서버를 쿼리하느냐에 따라 동시에 서로 다른 값이 반환될 수도 있는 것입니다. NoSQL이 ACID 수준의 컴플라이언스를 충족하지 못하는 이유 중 하나가 바로 이것입니다. 일관성(Consistency)은 ACID의 'C'에 해당하는 요건으로서 트랜잭션의 시작과 끝 모두에서 데이터가 유효하고 일관되어야 함을 의미합니다. 그 대신 대부분의 NoSQL 데이터베이스는 BASE 일관성 모델을 따릅니다. 여기서 'E'는 결과적 일관성(Eventual Consistency)을 가리킵니다. 다시 말해 데이터가 나중에는 일관성을 갖춘다는 의미입니다. 이를 실질적으로 해석하자면 수 밀리초에 불과한 수준의 지연이 발생할 수 있다는 뜻입니다. 소셜 미디어의 포스트를 게시나 온라인 장바구니 갱신 등을 수행하는 등의 상당수 애플리케이션에서 이는 큰 문제가 되지 않을 것입니다. 이때는 동일한 데이터를 모든 사용자에게 동시에 제공하는 것보다는 대부분의 네트워크에서 신속한 가용성을 제공하는 게 더 중요하기 때문입니다. 하지만 온라인으로 주식을 매입하는 것과 같은 경우에서는 문제가 될 수 있습니다. NoSQL은 일관성보다 속도와 가용성을 중요시하기 때문입니다. 따라서 조직은 NoSQL의 이러한 특성이 각자의 목표와 부합하는지 판단해 보아야 합니다.
선택지 비교하기
SQL과 NoSQL 데이터베이스는 각각에 특화된 사용 사례에 더없이 적합합니다. 조직의 데이터 환경과 목표에 따라 각 데이터베이스의 특수한 장단점은 더욱 두드러질 수 있습니다. 어쩌면 두 가지 모두 도입해 각각의 장점을 취사해서 활용하는 편이 가장 바람직할지도 모릅니다. 많은 조직은 클라우드 아키텍처 내에서, 심지어 동일한 애플리케이션 내에서도 SQL과 NoSQL 데이터베이스를 함께 활용하고 있습니다. 하지만 가장 좋은 선택지는 DataStax Astra DB처럼 유연성, 연속적 가용성, 확장성과 같은 NoSQL 본연의 장점을 취하면서도 그 단점을 최소화할 수 있는 솔루션을 활용하는 것입니다.
Astra는 서비스형 멀티클라우드 데이터베이스(DBaaS)로서 Apache Cassandra와 Kubernetes를 기반으로 하며 마이크로서비스 아키텍처를 갖추고 있습니다. Astra에서는 클릭 몇 번만 하면 Azure, Google Cloud Platform, AWS 중 원하는 클라우드에서 데이터베이스를 구동할 수 있습니다. 그렇게 일단 구동하고 나면 애플리케이션 개발이 지극히 간편해질 것입니다. Astra에는 오픈 소스 데이터 API 계층인 Stargate가 내장되어 있어 드라이버에 의존하지 않고서도 데이터를 쿼리할 수 있으며 Cassandra Query Language(CQL)를 모르더라도 테이블과 스키마를 생성할 수 있습니다. Stragate를 통해 스키마리스 JSON, REST, GraphQL과 같은 최신 API를 사용하여 데이터와 상호작용할 수 있습니다. 또한 Astra의 SAI(Storage Attached Indexing)를 활용한다면 주 키로 제한될 필요 없이 테이블의 어떤 열이든 쿼리할 수 있습니다.