1. RDB (Relational Database)
관계형 데이터베이스(RDB)는 1970년 E.F. Codd의 논문 "A Relational Model of Data for Large Shared Data Banks"에서 시작되었습니다. 데이터의 일관성과 무결성을 최우선으로 하며, 정해진 스키마에 따라 데이터를 테이블 형태로 저장하는 모델입니다.
핵심 이론
- 스키마 (Schema): 데이터베이스에 저장되는 데이터의 구조와 제약 조건을 명세한 것입니다. 테이블(Table), 컬럼(Column), 데이터 타입(Data Type) 등을 미리 엄격하게 정의해야 합니다.
- 테이블 (Table): 데이터를 행(Row)과 열(Column)으로 구성된 2차원 표 형태로 저장합니다.
- 관계 (Relation): 테이블 간의 관계는 외래 키(Foreign Key)를 사용하여 정의됩니다. 이를 통해 데이터의 중복을 최소화하는 정규화(Normalization)가 가능합니다.
- SQL (Structured Query Language): 데이터를 조회, 추가, 수정, 삭제하기 위한 표준 질의 언어입니다.
- ACID 트랜잭션: 데이터의 일관성과 무결성을 보장하기 위한 4가지 핵심 속성입니다.
- 원자성 (Atomicity): 트랜잭션의 모든 작업이 전부 성공하거나 전부 실패해야 합니다. (All or Nothing)
- 일관성 (Consistency): 트랜잭션이 성공적으로 완료되면 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
- 고립성 (Isolation): 하나의 트랜잭션이 실행되는 동안 다른 트랜잭션의 영향을 받지 않아야 합니다.
- 지속성 (Durability): 성공적으로 완료된 트랜잭션의 결과는 영구적으로 저장되어야 합니다.
대표적인 RDB
- MySQL: 전 세계적으로 가장 널리 사용되는 오픈소스 관계형 데이터베이스입니다.
- PostgreSQL: 뛰어난 확장성과 SQL 표준 준수로 인기가 높은 오픈소스 RDB입니다.
- Oracle Database: 강력한 기능과 안정성을 제공하는 대표적인 상용 RDB입니다.
- Microsoft SQL Server: Microsoft 환경에 최적화된 상용 RDB입니다.
- SQLite: 서버가 필요 없는 경량 파일 기반 RDB로, 모바일 앱이나 소규모 애플리케이션에 주로 사용됩니다.
장점
- 데이터 무결성 보장: ACID 특성을 통해 데이터의 일관성과 안정성을 강력하게 보장합니다.
- 정교한 쿼리 가능:
JOIN을 사용하여 여러 테이블을 결합하는 등 복잡하고 정교한 쿼리를 수행할 수 있습니다. - 데이터 중복 최소화: 정규화를 통해 데이터 중복을 피해 저장 공간을 효율적으로 사용하고 데이터 불일치 위험을 줄입니다.
- 성숙한 기술과 생태계: 오랜 기간 발전해 온 만큼 안정적이며, 검증된 솔루션과 풍부한 커뮤니티를 보유하고 있습니다.
단점
- 수직적 확장 (Scale-up): 성능 향상을 위해 주로 서버 자체의 사양(CPU, RAM)을 높이는 수직적 확장에 의존하며, 비용이 많이 들고 한계가 명확합니다.
- 엄격한 스키마: 데이터 모델을 변경하기가 매우 어렵고 비유연하여, 빠르게 변화하는 서비스 요구사항에 대응하기 힘듭니다.
- 대용량 데이터 처리: 대규모 비정형 데이터의 읽기/쓰기(Read/Write) 성능이 NoSQL에 비해 떨어질 수 있습니다.
2. NoSQL (Not Only SQL)
NoSQL은 2000년대 후반, 구글, 아마존 등 빅테크 기업들이 폭발적으로 증가하는 웹 데이터(빅데이터)를 기존 RDB만으로는 감당할 수 없게 되면서 등장했습니다. 데이터의 일관성을 다소 희생하더라도 대규모 데이터 처리 능력과 뛰어난 확장성을 목표로 합니다.
핵심 이론
- 유연한 스키마 (Schemaless): 데이터 스키마가 없거나 동적으로 변경될 수 있어, 비정형 데이터를 자유롭게 저장할 수 있습니다.
- 수평적 확장 (Scale-out): 값싼 서버 여러 대를 연결하여 클러스터를 구성하는 수평적 확장이 용이합니다.
- 다양한 데이터 모델: 데이터의 특성에 따라 최적화된 다양한 모델이 존재합니다.
- Key-Value Store (예: Redis, DynamoDB): 고유한 Key에 하나의 Value를 저장하는 가장 단순한 모델. 매우 빠른 읽기/쓰기가 특징입니다.
- Document Store (예: MongoDB, Couchbase): Key에 JSON/BSON과 같은 구조화된 문서(Document)를 저장합니다. 가장 널리 사용되는 NoSQL 모델입니다.
- Column-Family Store (예: Cassandra, HBase): 행(Row)마다 다른 스키마를 가질 수 있으며, 대규모 데이터의 읽기/쓰기에 최적화되어 있습니다.
- Graph Store (예: Neo4j, Neptune): 데이터 간의 관계를 노드(Node)와 엣지(Edge)로 표현하는 그래프 형태로 저장합니다. 소셜 네트워크, 추천 시스템에 적합합니다.
- BASE 속성: 가용성을 우선시하는 NoSQL의 특성입니다.
- Basically Available: 시스템의 일부가 고장 나도 항상 사용 가능해야 합니다.
- Soft State: 시스템의 상태는 외부 자극에 의해 언제든 변경될 수 있습니다.
- Eventually Consistent: 데이터의 일관성을 즉시 보장하지 않고, 언젠가는 일관된 상태가 됨을 보장합니다. (최종적 일관성)
대표적인 NoSQL
- MongoDB: JSON과 유사한 문서(Document)를 저장하는 대표적인 Document Store입니다. 유연한 스키마 덕분에 가장 널리 사용되는 NoSQL 중 하나입니다.
- Redis: Key-Value 형태로 데이터를 저장하는 인메모리(In-memory) Key-Value Store입니다. 매우 빠른 속도를 자랑하여 캐시, 세션 관리 등에 주로 사용됩니다.
- Cassandra: 대규모 데이터의 분산 저장과 쓰기 작업에 최적화된 Column-Family Store입니다.
- Neo4j: 데이터 간의 관계를 그래프로 표현하는 데 특화된 Graph Store로, 소셜 네트워크나 추천 엔진에 적합합니다.
장점
- 뛰어난 확장성: 수평적 확장이 용이하여 저렴한 비용으로 대규모 데이터 처리가 가능합니다.
- 유연한 데이터 모델: 비정형 데이터를 쉽게 저장하고, 서비스 변화에 따라 스키마를 유연하게 변경할 수 있습니다.
- 높은 가용성 및 성능: 분산 환경을 기반으로 설계되어 일부 노드에 장애가 발생해도 중단 없는 서비스가 가능하며, 단순 읽기/쓰기 성능이 매우 뛰어납니다.
단점
- 데이터 일관성 부족: 최종적 일관성(Eventual Consistency) 모델을 따르므로, 데이터의 정합성이 중요한 서비스에는 부적합할 수 있습니다.
- 복잡한 쿼리의 어려움: RDB의
JOIN과 같은 복잡한 쿼리 기능이 없거나 비효율적입니다. - 데이터 중복: 의도적으로 데이터를 중복 저장(비정규화)하는 경우가 많아 데이터 불일치가 발생할 수 있습니다.
3. 비교 및 선택 가이드
| 구분 | RDB | NoSQL |
|---|---|---|
| 데이터 모델 | 엄격한 스키마, 테이블(관계) | 유연한 스키마, 다양한 모델 |
| 핵심 가치 | 데이터의 일관성, 무결성 (ACID) | 성능, 가용성, 확장성 (BASE) |
| 확장 방식 | 수직적 확장 (Scale-up) | 수평적 확장 (Scale-out) |
| 쿼리 | SQL (복잡한 쿼리, JOIN 가능) | 모델에 따라 다름 (JOIN 제약적) |
| 적합한 데이터 | 정형 데이터, 관계가 중요한 데이터 | 비정형/반정형 데이터, 대용량 데이터 |
언제 무엇을 사용해야 할까?
RDB가 적합한 경우:
- 데이터의 일관성과 정합성이 매우 중요할 때: 은행 거래, 전자상거래 결제, 예약 시스템 등
- 데이터 구조가 명확하고 변경 가능성이 적을 때: 전통적인 기업의 ERP, CRM 시스템
- 복잡한 쿼리와 데이터 분석이 필요할 때
NoSQL이 적합한 경우:
- 엄청난 양의 데이터를 빠르게 처리해야 할 때: 빅데이터 분석, 로그 수집, IoT 데이터 저장
- 서비스 확장 및 데이터 모델 변경이 잦을 때: 빠르게 성장하는 스타트업, 소셜 미디어 피드
- 읽기 작업이 쓰기 작업보다 압도적으로 많을 때: 블로그, 콘텐츠 관리 시스템
최근에는 두 데이터베이스의 장점을 결합하여, 핵심적인 데이터는 RDB에 저장하고, 로그나 캐시, 통계 데이터 등은 NoSQL에 저장하는 상호 보완적인 방식(Polyglot Persistence)도 널리 사용됩니다.
'Development' 카테고리의 다른 글
| ELK (Elastic Stack) (0) | 2025.09.04 |
|---|---|
| APM (Application Performance Monitoring) (0) | 2025.09.04 |
| Forward Proxy, Reverse Proxy 정의와 차이점 (1) | 2025.08.26 |
| [Test] Mock vs. Stub (2) | 2025.08.17 |
| [Redis] 레디스를 로컬이 아닌 외부에 두는 이유 (0) | 2025.03.21 |
댓글