RDBMS (Relational Database Management System)
RDBMS(Relational Database Management System)는 데이터를 관계형 모델(Relational Model)로 저장하고 관리하는 시스템이다. 데이터는 테이블(Table)에 저장되며 각 테이블은 행(Row)과 열(Column)로 구성된다. 이러한 테이블은 명확한 스키마(schema)를 가지고 있으며 테이블 간 관계(relationship)를 정의하여 복잡한 데이터를 정규화할 수 있다.
RDBMS의 핵심 구조
1. 스키마(Schema)
- 고정된 구조(정적 스키마)를 기반으로 한다.
- 테이블마다 컬럼의 이름, 데이터 타입, 제약조건 등이 명확히 정의되어 있다.
- 운영 환경에서는 스키마 변경 시 마이그레이션이 필요하여 신중하게 관리해야 한다.
- 제약조건(
NOT NULL
, UNIQUE
, PRIMARY KEY
, FOREIGN KEY
, CHECK
)을 통해 데이터 정합성을 보장한다.
2. 언어(Language)
- 표준 SQL(Structured Query Language) 사용
SELECT
, INSERT
, UPDATE
, DELETE
, JOIN
, GROUP BY
, ORDER BY
등
- 복잡한 조인(Join), 서브쿼리, 트랜잭션 등을 지원
3. 트랜잭션(Transaction)
- ACID(Atomicity, Consistency, Isolation, Durability) 원칙을 기반으로 동작
- 트랜잭션은 하나의 단위로 처리되며, 일부 실패 시 전체 롤백 가능
- 금융, 회계, 이커머스 등 정합성과 신뢰성이 핵심인 시스템에 매우 적합
4. 확장성(Scalability)
- 수직 확장(Scale-Up) 중심
- CPU, RAM 등 하드웨어를 강화하여 성능 향상
- 한계 도달 시 비용과 성능의 trade-off 발생
- 수평 확장(Scale-Out)은 구조상 어려움
- 샤딩이나 분산 처리 시 애플리케이션 단에서 많은 변경 필요
RDBMS의 특징
- 정형 데이터 처리에 최적화
- 스키마 기반의 엄격한 데이터 관리
- 관계형 데이터 모델링과 JOIN 기반 질의에 강점
- 데이터 무결성 제약과 트랜잭션 관리 기능이 매우 강력함
장점
장점 | 설명 |
---|
트랜잭션 보장 | ACID 원칙으로 은행/회계 등 중요한 시스템에서 안정성 확보 |
정합성 유지 | Foreign key 등으로 관계에 대한 무결성 유지 가능 |
복잡한 질의 가능 | JOIN, SubQuery 등을 통한 강력한 데이터 질의 처리 |
풍부한 도구와 생태계 | MySQL Workbench, pgAdmin, Oracle SQL Developer 등 GUI 도구 많음 |
단점
단점 | 설명 |
---|
스키마 유연성 부족 | 데이터 구조 변경이 어렵고 배포 시 부담됨 |
수평 확장성 부족 | 여러 서버로 분산이 어려워 병목 생기기 쉬움 |
대용량 비정형 데이터 처리 부적합 | 로그, 센서 데이터, JSON 등 비정형 데이터 처리에 부적절 |
초기 설계 부담 | 잘못된 스키마 설계는 전체 구조를 흔들 수 있음 |
대표 RDBMS와 사용 사례
DBMS | 특징 | 적합한 사용 사례 |
---|
MySQL | 경량, 쉬운 사용, 커뮤니티 활발 | 스타트업, 웹 서비스, 이커머스 |
PostgreSQL | JSON, 함수, 확장성 | 데이터 분석, GIS, 복합 구조 |
Oracle DB | 고신뢰성, 대규모 트랜잭션 | ERP, 대형 금융 시스템 |
MariaDB | MySQL 기반 고성능 | MySQL 대체, 오픈소스 선호 환경 |
NoSQL (Not Only SQL)
NoSQL은 고정된 테이블 구조 없이 유연한 데이터 모델과 대규모 확장성을 제공하는 비관계형 데이터베이스다. 데이터 구조에 따라 문서(Document), 키-값(Key-Value), 컬럼(Column Family), 그래프(Graph) 등으로 구분된다.
NoSQL의 구조
1. 스키마 없음(Schema-less)
- JSON 등 유동적인 데이터 구조를 그대로 저장
- 필드의 유무나 타입이 유연하여 스키마 변경 부담이 적음
2. 쿼리 언어
- 표준 SQL 대신 각 DB 고유의 DSL 또는 명령어 사용
- MongoDB →
db.collection.find()
- Redis ->
SET
, GET
, INCR
등
3. 트랜잭션
- ACID 대신 BASE 특성을 가짐
- Basically Available: 시스템은 항상 응답함
- Soft state: 상태는 시간이 지나도 변할 수 있음
- Eventually consistent: 언젠가는 일관성 도달
- 일부 NoSQL은 트랜잭션 제공 (MongoDB는 다큐먼트 단위 트랜잭션 지원)
4. 확장성
- 수평 확장(Scale-Out)에 최적화됨
- 샤딩과 복제를 기본적으로 지원
- 대규모 시스템에서 높은 가용성/성능 유지
NoSQL의 특징
- 스키마 유연성으로 빠른 서비스 프로토타이핑 가능
- 대규모 트래픽, 실시간 쓰기 성능에 유리
- 다양한 데이터 모델을 통해 다양한 요구 대응 가능
장점
장점 | 설명 |
---|
스키마 유연성 | 빠른 개발과 빈번한 변경에 적합 |
높은 쓰기 성능 | 대량 데이터 적재/처리에 강점 |
수평 확장 용이 | 노드 추가로 확장 가능, 클러스터 구성 쉬움 |
다양한 데이터 구조 지원 | 비정형 데이터, 중첩된 구조 표현 가능 (JSON 등) |
단점
단점 | 설명 |
---|
트랜잭션 미지원 | 복잡한 로직 구현은 애플리케이션 단에서 제어 필요 |
관계형 질의 어려움 | JOIN 부재, 복잡한 관계 모델링에 부적합 |
일관성 저하 | Eventually Consistent 특성상 실시간 일관성 보장 어려움 |
데이터 정합성 미보장 | 스키마와 제약조건 없으므로 무결성 확인 어려움 |
대표 NoSQL DBMS와 사용 사례
DB | 유형 | 특징 | 사용하면 좋은 경우 |
---|
MongoDB | 문서형 | JSON 기반 문서, 유연한 구조 | 로그 수집, CMS, 빠른 프로토타이핑 |
Redis | 키-값형 | 인메모리, 빠른 응답 속도 | 세션 저장소, 캐시, 실시간 순위 시스템 |
Cassandra | 컬럼형 | 분산 환경, 빠른 쓰기 | IoT, 대규모 트래픽 로그 저장 |
Neo4j | 그래프형 | 관계 탐색 특화 | 추천 시스템, 소셜 그래프 탐색 |
MySQL 로그 저장 구조 개선 고민
현재 서비스에서 MySQL에 로그 데이터를 저장하고 있는 상황인데 로그는 일반적으로 쓰기 빈도는 높고 읽기 빈도는 낮은 비정형 데이터다.
문제점
- MySQL은 정형 데이터와 트랜잭션에 강하지만 대용량 쓰기/읽기에는 병목이 생길 수 있음
- 로그 데이터는 구조가 자주 바뀌고 필드가 다양할 수 있음 -> 고정 스키마와 충돌
- 조회할 일이 거의 없지만 쌓이는 데이터가 많아서 DB 디스크를 잡아먹음
- 파티셔닝, 인덱싱, 아카이빙 등을 하지 않으면 성능 저하 발생
개선 방향 고민
1. 로그 저장을 NoSQL(MongoDB 등)으로 이관
- 로그는 JSON처럼 유동적인 형식을 가지기 때문에 문서형 DB와 잘 맞음
- 샤딩, 압축, TTL 자동 삭제 기능으로 저장 효율과 유지 관리 용이
2. MySQL에 저장하되 별도 로그 테이블로 분리
- 서비스 테이블과 분리하여 인덱스/쿼리 영향을 최소화
- 주기적으로 아카이빙: 파티션 + 스케줄러(cron)로 주기적 백업/삭제
- 로그 테이블에
created_at
기준으로 파티션 나누기
3. Kafka 등과 연동하여 로그 수집 + ELK 연동
- 로그 -> Kafka -> Elasticsearch -> Kibana로 연동하면 분석 및 시각화에 최적
- MySQL에는 최소한의 메타 데이터만 저장하고, 실로그는 Kafka/Elastic으로 이동
결론
- 정형 데이터 + 복잡한 비즈니스 로직 = RDBMS(MySQL, PostgreSQL 등)
- 비정형 + 고속 쓰기 + 유연한 스키마 = NoSQL(MongoDB, Redis 등)
- 실시간 분석 + 시각화 목적 = Kafka + Elasticsearch (ELK 스택)
로그처럼 쓰기 중심 + 비정형 + 분석 목적이 강한 데이터는 RDBMS보다는 MongoDB 또는 ELK 기반 구조가 훨씬 더 적합하다. 초기에는 MySQL에 저장하고 점차 분리/이관 구조를 갖추는 방식으로 확장 가능하다.
참고