Backend
home
🖊️

데이터베이스

RDBMS와 NoSQL 차이

항목
RDBMS
NoSQL
구조
테이블 기반 (정형 데이터)
문서, 키-값, 컬럼, 그래프 등
스키마
고정 스키마
유연한 스키마
확장
수직 확장 (Scale-Up)
수평 확장 (Scale-Out)
예시
MySQL, PostgreSQL, Oracle
MongoDB, Redis, Cassandra
면접 포인트: 시스템에 따라 적절한 DB 선택 이유를 설명할 수 있어야 함

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으로 성능 병목 분석