관계형 DB를 사용하는 이유
한 줄 정의
RDB(Relational Database)는 데이터를 테이블 간 관계로 구조화하고, 트랜잭션으로 정합성을 보장하는 데이터 저장소다.
실무에서 왜 중요한가
RDB의 핵심 특성을 모르면 다음 상황에서 방향을 잃는다.
- NoSQL과 RDB 중 어떤 것을 선택해야 하는지 기준이 없다.
- 트랜잭션이 보장하는 것과 보장하지 않는 것을 구분하지 못한다.
- 정규화와 반정규화의 트레이드오프를 설명하지 못한다.
- RDB의 장단점을 모르면 NoSQL이 더 적합한 상황에서도 RDB를 선택한다.
RDB의 핵심 특성
ACID
| 속성 | 의미 | 실무 영향 |
|---|---|---|
| Atomicity (원자성) | 트랜잭션은 전부 성공하거나 전부 실패 | 결제 중 오류 시 전체 롤백 |
| Consistency (일관성) | 트랜잭션 전후로 데이터 무결성 유지 | FK, UNIQUE 등 제약조건 보장 |
| Isolation (격리성) | 동시 트랜잭션이 서로 간섭하지 않음 | 격리 수준에 따라 다름 |
| Durability (지속성) | 커밋된 데이터는 장애 후에도 유지 | WAL(Write-Ahead Log) 기반 |
관계 모델
데이터를 테이블(행과 열)로 표현하고, 테이블 간 관계(FK)로 연결한다. SQL로 선언적 조회가 가능하다.
-- 주문과 사용자를 관계로 조회
SELECT o.id, u.name
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE o.status = 'COMPLETED';RDB vs NoSQL
| 기준 | RDB | NoSQL |
|---|---|---|
| 데이터 구조 | 정형 (스키마 고정) | 비정형/반정형 (유연한 스키마) |
| 정합성 | ACID 보장 | 대부분 Eventually Consistent |
| 조인 | 자유롭게 가능 | 제한적 또는 불가 |
| 확장 방식 | Scale-up 중심 | Scale-out 용이 |
| 적합한 경우 | 정합성이 중요한 비즈니스 데이터 | 대량 로그, 캐시, 실시간 데이터 |
실무 원칙: 비즈니스 핵심 데이터(주문, 결제, 사용자)는 RDB, 보조 데이터(캐시, 세션, 로그)는 NoSQL이 일반적이다.
정규화와 반정규화
정규화
데이터 중복을 제거하고 테이블을 분리해서 정합성을 높이는 과정이다.
- 같은 데이터가 여러 곳에 있으면 수정 시 불일치가 생긴다.
- 정규화하면 UPDATE가 한 곳에서만 발생한다.
반정규화
조회 성능을 위해 의도적으로 중복을 허용하는 것이다.
- JOIN이 많아서 조회가 느릴 때 사용한다.
- 데이터 정합성 관리 부담이 증가한다.
실무 원칙: 정규화를 기본으로 하고, 조회 성능이 문제가 될 때만 반정규화를 적용한다.
자주 나는 실수
- RDB와 NoSQL의 선택 기준 없이 익숙한 것을 사용한다.
- ACID를 설명하지 못하면서 트랜잭션을 사용한다.
- 정규화/반정규화의 트레이드오프를 고려하지 않는다.
- “RDB는 느리다”는 선입견으로 NoSQL을 선택하고, 정합성 문제를 겪는다.
핵심 요약
RDB는 데이터를 테이블 간 관계로 구조화하고, ACID 트랜잭션으로 정합성을 보장합니다. 비즈니스 핵심 데이터처럼 정합성이 중요한 곳에 적합합니다.
NoSQL은 유연한 스키마와 수평 확장이 장점이지만, 강한 정합성 보장이 어렵습니다. 정규화를 기본으로 하고, 조회 성능이 병목일 때만 반정규화를 적용하는 것이 원칙입니다.
꼬리 질문
ACID에서 Isolation이 완벽하지 않은 이유는?
완벽한 격리(Serializable)는 성능이 크게 떨어집니다. 실무에서는 성능과 정합성 사이에서 적절한 격리 수준을 선택합니다. 대부분의 경우 Read Committed 또는 Repeatable Read를 사용합니다.
RDB에서 Scale-out이 어려운 이유는?
트랜잭션과 JOIN이 여러 서버에 분산된 데이터를 대상으로 하면 네트워크 지연과 분산 트랜잭션 비용이 발생합니다. 샤딩으로 분산할 수 있지만, 크로스 샤드 조인이 어렵습니다.
반정규화는 언제 하는가?
조회 빈도가 높고 JOIN 비용이 병목일 때 적용합니다. 읽기 비율이 쓰기보다 훨씬 높은 테이블이 대상입니다. 반정규화 후에는 데이터 동기화 로직이 추가로 필요합니다.