RDBMS와 NoSQL 차이
항목 | RDBMS | NoSQL |
구조 | 테이블 기반 (정형 데이터) | 문서, 키-값, 컬럼, 그래프 등 |
스키마 | 고정 스키마 | 유연한 스키마 |
확장 | 수직 확장 (Scale-Up) | 수평 확장 (Scale-Out) |
예시 | MySQL, PostgreSQL, Oracle | MongoDB, Redis, Cassandra |
SQL 핵심 문법
•
기본
◦
SELECT, INSERT, UPDATE, DELETE
◦
WHERE, GROUP BY, ORDER BY, HAVING
•
JOIN 종류
JOIN 종류 | 설명 |
INNER JOIN | 공통되는 값만 추출 |
LEFT JOIN | 왼쪽 테이블 전체 + 오른쪽 매칭 |
RIGHT JOIN | 오른쪽 테이블 전체 + 왼쪽 매칭 |
FULL OUTER JOIN | 양쪽 테이블 모두 포함 (MySQL은 지원 X) |
정규화 vs 비정규화
•
정규화(Normalization)
→ 데이터 중복 제거, 무결성 보장
→ 제1정규형 ~ 제3정규형이 자주 나옴
•
비정규화(Denormalization)
→ 성능 향상을 위해 중복 허용
→ 조회 속도 ↑, 트랜잭션 처리 속도 ↓
트랜잭션
하나의 논리적 작업 단위로, ALL or NOTHING
•
ACID 속성
◦
Atomicity (원자성)
◦
Consistency (일관성)
◦
Isolation (고립성)
◦
Durability (지속성)
•
트랜잭션 격리 수준(Isolation Level)
수준 | 현상 방지 | 설명 |
READ UNCOMMITTED | 없음 | Dirty Read 허용 |
READ COMMITTED | Dirty Read 방지 | 대부분 RDB의 기본 |
REPEATABLE READ | + Non-Repeatable 방지 | InnoDB 기본값 |
SERIALIZABLE | + Phantom 방지 | 가장 엄격, 가장 느림 |
인덱스
WHERE절 또는 JOIN시 성능 개선
•
B-Tree 인덱스: 대부분 기본 인덱스
•
해시 인덱스: 정확한 일치 검색에 빠름
•
복합 인덱스: 여러 컬럼 조합, 순서 중요
•
인덱스는 쓰기 성능 저하 요인
•
너무 많은 인덱스는 오히려 역효과
ORM과 N + 1 문제
ORM (Object Relational Mapping): 객체와 테이블 매핑
예: JPA, Hibernate
•
N + 1 문제: 연관된 엔티티를 지연 로딩할 때 N + 1번 쿼리 발생
→ 해결: fetch join, @EntityGraph, batch-size
샤딩과 파티셔닝
•
샤딩: 물리적으로 DB 서버 분산
•
파티셔닝: 논리적으로 테이블 분할 (ex: 날짜별 파티션)
DB 트러블슈팅/실무 고려
•
Deadlock 방지: 자원 접근 순서 고정, Lock Timeout 설정
•
Connection Pool: HikariCP 등, 설정값 조정 필수
•
Slow Query Logging으로 성능 병목 분석