영상 [연속재생] 개발자가 알아야 할 데이터베이스 핵심 총정리 | 3시간 몰아보기의 전체 내용을 주제/소주제별로 빠짐없이 정리한 요약입니다.
1. 데드락(Deadlock) vs 라이브락(Livelock) [00:00]
- 데드락 (Deadlock): 두 개 이상의 프로세스/트랜잭션이 서로가 점유하고 있는 자원의 락을 얻기 위해 무한 대기 상태에 빠지는 현상 [01:13].
- 라이브락 (Livelock): 프로세스가 서로 양보하거나 상태를 계속 변경 및 재시도하여 러닝 상태는 유지되지만 작업의 진척이 전혀 없는 현상 [01:40].
2. 비관적 락(Pessimistic Lock) vs 낙관적 락(Optimistic Lock) [08:44]
- 동시성 충돌 발생 원인: 락 없이 읽기/쓰기를 수행하면 나중 트랜잭션이 이전 수정사항을 덮어쓰는 Lost Update(갱신 손실) 발생 [09:29].
- 비관적 락 (Pessimistic Lock): 충돌이 반드시 일어난다고 가정.
- 낙관적 락 (Optimistic Lock): 충돌이 거의 나지 않을 것이라 가정.
3. WHERE절 없는 UPDATE 쿼리의 위험성 (실무 장애 사례) [14:21]
- 사태 발생 원인: 실수로 WHERE 조건 없이 운영 DB 전체 테이블에 UPDATE 쿼리 실행 [14:59].
- 기술적 이유:
- 결과: 다른 모든 트랜잭션이 대기 상태에 빠지고 커넥션 풀 고갈/타임아웃으로 유저 접속 대거 튕김 [17:11].
- 안전 대책:
4. 트랜잭션 격리 수준 (Transaction Isolation Level) [18:48]
동시성과 일관성 사이의 균형을 맞추기 위한 가시성 제어 단계.
- 이상 현상 (Anomalies):
- 4가지 격리 수준:
- Read Uncommitted: 커밋 안 된 데이터도 읽음. Dirty Read 발생. 실무 미사용 [21:46].
- Read Committed: 커밋된 데이터만 읽음. Dirty Read 방지, Non-Repeatable Read 발생 (Oracle, PostgreSQL 기본) [23:03].
- Repeatable Read: 트랜잭션 시작 시점 스냅샷 참조. Non-Repeatable Read 방지 (MySQL InnoDB 기본, InnoDB는 Next-Key Lock으로 Phantom Read도 대부분 방지) [24:36], [26:30].
- Serializable: 읽기 작업도 공유 락 획득. 모든 이상 현상 차단하나 동시성 급감 및 성능 병목 [26:43].
- MVCC (Multi-Version Concurrency Control): DB가 락 없이 격리성을 구현하기 위해 언두(Undo) 영역에 변경 전 과거 버전을 보관해 시작 시점 기준 가시성을 보장 [28:18].
5. 트랜잭션 ACID 원칙 [31:02]
- A (Atomicity, 원자성): All or Nothing. 모든 작업이 완수되거나 모두 롤백됨. (구현: Undo Log로 복구) [32:50].
- C (Consistency, 일관성): 데이터는 항상 무결성 제약 조건(PK, FK, NOT NULL 등)을 준수함 [33:30].
- I (Isolation, 격리성/고립성): 트랜잭션 간 상호 간섭 금지. (구현: Lock, MVCC, 격리 수준) [34:21].
- D (Durable, 지속성): 커밋 완료된 데이터는 영구 보존됨. (구현: Redo Log / WAL) [34:58].
6. Redo Log vs Undo Log [36:56]
- WAL (Write-Ahead Logging): 데이터 파일 디스크 수정(Random I/O) 전, 로그 파일에 먼저 순차적(Sequential I/O)으로 기록하는 메커니즘 [39:10].
- Redo Log (다시 하기):
- Undo Log (되돌리기):
7. 정규화(Normalization) vs 반정규화(De-normalization) [44:04]
- 정규화의 목적: 중복 데이터 제거 및 이상 현상(Anomaly: 갱신, 삽입, 삭제) 방지 [45:52], [47:07].
- 단점: 테이블이 분할되면서 조인(Join) 비용 증가로 인한 읽기 성능 저하 가능 [48:10].
- 반정규화의 목적: 조인 줄이기를 통한 읽기 성능 향상 및 이력 보존(주문 시점 단가/주소 보존 등) [48:31], [49:50].
- 원칙: 반드시 정규화를 완료한 후, 성능 검증 및 비즈니스 요건에 따라 전략적으로 반정규화 수행 [51:15].
8. 제1, 2, 3 정규화 (1NF ~ 3NF) [52:41]
- 함수 종속성 (Functional Dependency): $X \to Y$ ($X$를 알면 $Y$가 하나로 결정될 때 $X$=결정자, $Y$=종속자) [55:53].
- 제1정규화 (1NF): 컬럼의 모든 값이 원자값(Atomic Value)이어야 함 (다중값/리스트 제거) [54:02].
- 제2정규화 (2NF): 복합키(Composite PK) 사용 시 부분 함수 종속성 제거 (PK의 일부분에만 종속된 속성을 별도 테이블로 분리) [57:24].
- 제3정규화 (3NF): 이행적 함수 종속성 제거 (PK가 아닌 일반 컬럼 간의 종속 관계 $A \to B \to C$ 분리) [58:52].
9. ORM vs Stored Procedure (SP) [01:01:33]
- ORM (Object-Relational Mapping):
- Stored Procedure (SP):
- 결론: 기본 비즈니스 CRUD는 ORM, 대용량 배치 및 복잡 집계는 SP/Native SQL을 사용하는 하이브리드 전략 추천 [01:09:34].
10. 파티셔닝(Partitioning) vs 샤딩(Sharding) [01:10:40]
- 파티셔닝 (Partitioning):
- 샤딩 (Sharding):
11. 리플리케이션(Replication) vs 샤딩(Sharding) [01:18:03]
- 리플리케이션 (Replication):
- 샤딩 (Sharding):
- 도입 순서: 서버 스펙업 → 쿼리/인덱스 튜닝 → 캐싱/리플리케이션 → 파티셔닝 → 최후의 수단으로 샤딩 검토 [01:24:56].
12. 강한 일관성(Strong Consistency) vs 최종 일관성(Eventual Consistency) [01:27:48]
- 강한 일관성 (Strong Consistency):
- 최종 일관성 (Eventual Consistency):
13. SQL vs NoSQL [01:35:07]
- SQL (RDB): ACID 트랜잭션, 고정 스키마, 복잡한 조인 지원, 스케일업 중심 [01:35:55]. (예: PostgreSQL, MySQL, Oracle)
- NoSQL: BASE (Basically Available, Soft-state, Eventual consistency), 동적 스키마, 수평 확장(스케일아웃) 용이 [01:36:55]. (예: MongoDB, Redis, DynamoDB)
- 최신 트렌드: 경계 모호화 (RDB의 JSON/Vector/분산 확장에 대한 지원 vs NoSQL의 ACID 트랜잭션 지원) → 도메인별 최적 DB를 혼용하는 Polyglor Persistence 전략 선호 [01:38:10], [01:14:04].
14. CQRS (Command Query Responsibility Segregation) 패턴 [01:42:31]
- 개념: 상태 변경(Command: CUD) 작업 모델과 조회(Query: R) 작업 모델의 책임을 분리하는 아키텍처 패턴 [01:43:43].
- 필요성: MSA 환경에서 파편화된 DB 간 조인 불가의 문제 해결 및 쓰기/읽기 개별 스케일링 [01:43:05], [01:45:05].
- 구현:
15. 원본 데이터 - 보조 저장소 패턴 (Source of Truth & Auxiliary Store) [01:49:48]
- 핵심 원칙:
- 2단계 패치 패턴 (Two-Stage Fetch) [01:57:02]:
- 주의사항: 두 저장소 간 Dual Write 데이터 불일치 이슈 방지를 위해 CDC, Outbox Pattern 등을 적용해 최종 일관성 유지 [02:00:58], [02:01:25].
16. DB 커넥션 풀(Connection Pool) 적정 사이즈 공식 [02:02:53]
- 오해: 커넥션 수를 무조건 늘리면 처리량이 늘어난다? (X) → 컨텍스트 스위칭, 락 경합, 캐시 미스로 인해 어느 시점 이후에는 오히려 처리량 저하 [02:10:33], [02:21:32].
- PostgreSQL / HikariCP 추천 적정 공식 [02:12:08]:
$$\text{Pool Size} = (\text{DB 서버의 물리 CPU Core 수} \times 2) + \text{Spindle Count}$$
*(단, SSD/NVMe 환경에서는 Spindle Count = 0 적용 $\to$ $\text{물리 Core} \times 2$*가 출발 기준점) [02:14:23], [02:20:26]. - 다중 WAS 인스턴스 할당 주의:
- 계산된 전체 풀 한계가 16개이고 WAS가 4대라면, WAS당 커넥션 풀은 $\mathbf{16 \div 4 = 4}$개 수준으로 분배해야 함 (WAS별로 16개씩 지정하면 DB 전체 맥스 커넥션 초과 위험) [02:27:29].
- 진단 원칙: 처리량이 부족할 때는 커넥션 수 증설보다 쿼리 실행 시간 단축(인덱스/튜닝)이 우선 [02:24:26].
17. 실무 직무 갈등 해결기 (개발자 vs DBA) [02:40:28]
- 갈등의 본질: 기술 문제가 아닌 우선순위와 책임 범위(Risk/Accountability)의 차이 (개발자: 생산성/신기술 vs DBA: 가용성/안정성) [02:41:51], [02:44:43].
- 해결 방안: