RDBMS 와 NoSQL
RDBMS는 구조화된 데이터와 일관성이 중요한 환경일 때
NoSQL은 대규모, 다양하고 변화가 많은 데이터를 빠르게 처리해야 하는 환경일 때
RDBMS
- 전통적인 RDBMS는 ACID(원자성, 일관성, 고립성, 지속성)라는 트랜잭션 보장 규칙을 따름.
- 원자성(Atomicity) - 트랜잭션에 포함된 모든 작업이 전부 실행하거나 전부 실패해야 함.
- 일관성(Consistency) - 트랜잭션이 성공적으로 완료되면 데이터베이스는 항상 정의된 규칙(스키마, 제약조건 등)에 맞는 일관된 상태를 유지. 데이터무결성보장
- 고립성(Isolation) - 여러 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션은 서로의 작업에 영향을 받지 않아야 함.
- 지속성(Durability) - 트랜잭션이 커밋된 이후에는 그 결과가 영구적으로 데이터베이스에 반영.
ACID의 각 속성이 실제 서비스 어떤 의미인가
실제 서비스에서 ACID 속성은 데이터의 신뢰성과 사용자 경험을 보장하는 데 필수적이다.
예를 들어, 은행 송금과 같은 금융 서비스에서는 원자성이 보장되지 않으면 송금 도중 오류가 발생했을 때 한쪽 계좌에서만 돈이 빠져나가거나 들어오는 문제가 발생할 수 있다. 일관성이 없다면 잘못된 데이터가 저장되어 시스템 전체에 오류를 유발할 수 있고, 격리성이 부족하면 동시에 여러 사용자가 접근할 때 데이터가 꼬일 수 있다. 마지막으로 지속성이 없으면 시스템 장애 시 거래 내역이 유실되어 신뢰를 잃게 된다.
격리성 : 대표적인 격리 수준과 그 차이
- Read Uncommitted: 다른 트랜잭션에서 아직 커밋되지 않은 데이터를 읽을 수 있어, Dirty Read가 발생할 수 있음.
- Read Committed: 커밋된 데이터만 읽을 수 있어 Dirty Read는 방지되지만, Non-repeatable Read가 발생할 수 있음.
- Repeatable Read: 트랜잭션이 시작될 때 스냅샷을 생성해 트랜잭션 동안 읽은 데이터가 항상 동일하게 보장되어 Non-repeatable Read를 방지하지만, Phantom Read는 발생할 수 있음.(Mysql)
- 일반적인 상황에서는 트랜잭션 내 조회는 스냅샷에서 이루어지니까 팬텀리드가 없지만 특수한 상황(범위 쿼리)를 사용하면 스냅샷이 아닌 실제 데이터에 대한 잠금을 시도함. -> 다른 트랜잭션이 넣은 데이터를 조회할 수 있음.
- SELECT * FROM table WHERE ... FOR UPDATE;
- 스냅샷이 아니라, 실행 시점의 최신 커밋 데이터를 읽음
- Serializable: 가장 높은 수준으로, 트랜잭션이 완전히 순차적으로 실행된 것과 같은 효과를 보장하여 모든 동시성 문제를 방지합니다. 하지만 성능 저하가 클 수 있음. 데드락 발생 가능성 높음
NoSQL
전통적인 관계형 데이터베이스(RDBMS)와 달리 테이블 기반의 고정된 스키마와 데이터 간의 관계를 사용하지 않는 비관계형 데이터베이스'
특징
- 비관계형 구조: 데이터 간의 관계(Join, Foreign Key 등)를 정의하지 않고, 다양한 데이터 모델(문서, 키-값, 그래프 등)을 지원
- 유연한 스키마: 고정된 스키마가 없거나 느슨한 스키마를 사용하여, 데이터 구조를 자유롭게 변경
- 수평적 확장성: 여러 서버에 데이터를 분산 저장하여 대용량 데이터와 트래픽을 효율적으로 처리
- 고성능: 단순한 데이터 접근 패턴에 대해 높은 읽기/쓰기 성능을 제공
- 데이터를 단순하게(예: 키로 값을 바로 찾거나, 한 번의 쿼리로 필요한 정보를 모두 읽고/쓰는 방식)
→ get("user:1001")처럼, 한 번의 키로 바로 값을 읽거나 저장
→ 한 사용자의 정보와 주문 내역을 한 document에 모두 저장
→ 이렇게 하면, 한 번의 쿼리로 모든 정보를 읽거나 쓸 수 있어 IO(입출력) 횟수가 줄고, 성능이 높아짐
- 최종적 일관성(Eventual Consistency): 대부분의 NoSQL 시스템은 RDBMS의 ACID(강한 일관성) 대신, 가용성과 확장성을 우선시하며 최종적 일관성을 지향
- 데이터 업데이트가 모든 노드에 즉시 반영되지 않아도,
→ 일정 시간 후에는 모든 복제본이 동일한 상태로 수렴하는 것을 보장하는 모델.
- 소셜 미디어 좋아요:
→사용자 A가 포스트에 좋아요 → 즉시 반영되지만, 다른 사용자에게는 몇 초 후에 보일 수 있음
- 분산 저장과 동시성 처리의 관계(즉시 정확성보다 가용성과 성능을 우선시하는 서비스에 최적화된 설계 방식)
데이터를 여러 노드에 나누어 저장하면,
→ 각 노드가 독립적으로 요청을 처리할 수 있어 병렬 처리 능력이 향상
→ 예시: 1초에 10만 건의 요청이 들어올 때, 10개 노드로 분산하면 노드당 1만 건만 처리하면 됨.
장점
- 대용량 데이터 처리 및 분산 환경에 최적화.
- 스키마가 유연하여 데이터 구조 변경이 용이.
- 저렴한 비용으로 확장 및 병렬 처리 가능.
- 비정형 데이터(예: 로그, SNS, IoT 데이터 등) 저장에 적합.
단점
- 데이터 일관성이 항상 보장되지 않음(최종적 일관성).
- 복잡한 쿼리나 조인 연산이 어렵거나 불가능. ->여러번 쿼리를 날려야 함
- 인덱스 관리 등에서 메모리 자원 소모가 클 수 있음.
- 트랜잭션 처리 및 데이터 무결성 측면에서 RDBMS에 비해 약함
비교
- RDBMS를 선택해야 하는 경우
- 데이터 무결성과 일관성이 매우 중요할 때
- 데이터 구조가 명확하고 자주 변경되지 않을 때
- 복잡한 쿼리와 조인이 필요한 경우
- 트랜잭션 처리가 중요한 업무(예: 금융, 회계 등)
- RDBMS는 주로 수직적 확장(서버 성능 업그레이드)에 의존
- NoSQL을 선택해야 하는 경우
- 대규모, 다양한 형태의 데이터를 빠르게 처리해야 할 때
- 데이터 구조가 자주 변경되거나 유연성이 필요할 때
- 높은 확장성과 가용성이 필요한 경우
- 실시간 분석, 로그, 소셜 미디어 등 비정형 데이터 처리
- 수평적 확장(서버 추가)을 통해 대규모 데이터와 트래픽을 효율적으로 처리