TIL (Today I Learned)
1. 데이터베이스 기본 개념 & 관계형 모델
DBMS 개요 및 데이터 독립성
- DBMS란? 데이터 중복을 최소화하고 여러 사용자가 안전하게 공유·관리할 수 있도록 돕는 소프트웨어 시스템.
- 데이터 독립성을 위한 3단계 스키마 구조:
- 외부 스키마 (External): 사용자나 프로그래머가 보는 개인화된 관점 (View)
- 개념 스키마 (Conceptual): DB의 전체적인 논리 구조와 규칙 (Table 설계 및 관계)
- 내부 스키마 (Internal): 실제 물리적인 저장 장치 관점 (Index, 물리적 저장 구조)
관계형 데이터베이스(RDB) 핵심 용어 정리
- 릴레이션(Relation): 테이블(Table)을 의미함.
- 튜플(Tuple): 테이블의 가로 한 줄. 행(Row) 또는 레코드(Record).
- 어트리뷰트(Attribute): 테이블의 세로 한 열. 열(Column) 또는 속성.
- 도메인(Domain): 하나의 어트리뷰트가 가질 수 있는 원자값들의 합법적 범위 (ex. 성별 컬럼에는 '남', '여'만 가능).
- 차수(Degree): 총 컬럼(어트리뷰트)의 개수.
- 카디널리티(Cardinality): 총 로우(튜플)의 개수. 데이터의 행 수.
데이터 무결성 제약 조건 (Integrity Constraints)
데이터의 정확성과 유효성을 보장하기 위한 필수 규칙들.
- 개체 무결성 (Entity Integrity): PK(기본키)는 NULL일 수 없고, 중복될 수 없다.
- 참조 무결성 (Referential Integrity): FK(외래키) 값은 참조하는 테이블의 PK 값과 일치하거나 NULL이어야 한다. (존재하지 않는 유령 데이터 참조 방지)
- 도메인 무결성 (Domain Integrity): 특정 컬럼의 값은 정의된 데이터 타입, 범위, 제약 조건을 만족해야 한다.
2. 데이터 조작 및 성능 최적화 (SQL & Index)
SQL 분류 명령어 정리
- DDL (정의어): 데이터 구조 정의/변경/삭제 (CREATE, ALTER, DROP, TRUNCATE)
- DML (조작어): 데이터 실제 조회 및 기본 CRUD (SELECT, INSERT, UPDATE, DELETE)
- DCL (제어어): 권한 부여 및 회수 (GRANT, REVOKE)
- TCL (트랜잭션 제어어): 트랜잭션 단위 제어 (COMMIT, ROLLBACK, SAVEPOINT)
인덱스(Index) 매커니즘과 자료구조
- B+Tree 자료구조를 쓰는 이유:
- 모든 리프 노드가 Linked List로 연결되어 있어 범위 검색(Range Scan)이 매우 빠름.
- 트리 높이가 항상 균형(Balanced)을 이루기 때문에 최악의 경우에도 검색 시간 복잡도 $O(\log N)$을 보장.
- 클러스터형 vs 비클러스터형 인덱스:
- 클러스터형 (Clustered): 테이블당 딱 1개만 존재 (PK 설정 시 자동 생성). 실제 데이터가 인덱스 순서대로 물리적 정렬됨. (ex. 영어사전 본책)
- 비클러스터형 (Non-Clustered): 테이블당 여러 개 생성 가능. 데이터 자체는 정렬되지 않고, 인덱스 페이지가 실제 데이터의 주소값(RID)을 가리킴. (ex. 책 뒷면의 찾아보기 페이지)
3. 트랜잭션(Transaction)과 ACID 특성
트랜잭션 정의
여러 작업을 하나로 묶어 '전부 성공(All)' 또는 '전부 실패(Nothing)'하게 만드는 논리적 작업 단위 (ex. 계좌 이체의 출금+입금 프로세스).
ACID 특성 요약
- 원자성 (Atomicity): 작업이 쪼개지지 않고 100% 다 처리되거나 아예 안 되어야 함. 실패 시 ROLLBACK 처리로 보장.
- 일관성 (Consistency): 트랜잭션 완료 후에도 DB의 제약 조건이나 비즈니스 규칙은 항상 올바른 상태를 유지해야 함.
- 독립성/고립성 (Isolation): 동시에 실행되는 트랜잭션끼리 서로의 중간 과정에 끼어들거나 간섭할 수 없음.
- 지속성 (Durability): 한 번 COMMIT된 결과는 시스템에 장애가 발생하더라도 영구적으로 보존되어야 함. (비휘발성 로그로 보장)
4. 동시성 제어 & 격리 수준 (Concurrency Control)
비관적 락(Lock) 종류
- 공유 락 (Shared Lock / S-Lock): 읽기 전용 락. 다른 트랜잭션도 동시에 읽을 수는 있으나 수정은 불가능.
- 배타 락 (Exclusive Lock / X-Lock): 쓰기 전용 락. 내가 수정하는 동안 다른 트랜잭션은 읽기/쓰기 모두 접근 불가 (독점).
- 데드락 (Deadlock / 교착 상태): 서로가 선점한 락이 풀리기만을 기다리며 무한 대기에 빠지는 상황. DBMS가 감지하여 비용이 적은 트랜잭션을 강제 롤백시킴으로써 해결.
트랜잭션 격리 수준 (Isolation Level)
성능(동시성)과 데이터 정합성(독립성) 간의 트레이드오프를 조절하는 4단계 수준.
| 격리 수준 | 발생 가능한 문제점 | 작동 방식 특징 |
| READ UNCOMMITTED | Dirty Read, Non-Repeatable, Phantom | 커밋되지 않은 임시 데이터도 막 읽음 (실무 사용 금지). |
| READ COMMITTED | Non-Repeatable Read, Phantom Read | 커밋 완료된 데이터만 읽음. 오라클(Oracle) 기본값. |
| REPEATABLE READ | Phantom Read | 트랜잭션 시작 시점의 스냅샷을 기준으로 읽음. MySQL(InnoDB) 기본값 (MVCC 기능으로 덤으로 펜텀 리드까지 거의 방지함). |
| SERIALIZABLE | 없음 | 읽기에도 공유 락을 빽빽하게 걸어 완전히 순차 실행함. 성능이 매우 떨어짐. |
- 발생하는 문제점 개념:
- Dirty Read: 커밋되지 않은 가짜 데이터를 읽었다가 원본이 롤백되어 꼬이는 현상.
- Non-Repeatable Read: 한 트랜잭션 안에서 같은 데이터를 두 번 조회했는데, 중간에 다른 놈이 값을 바꿔버려 조회 결과가 달라지는 현상.
- Phantom Read: 한 트랜잭션 안에서 범위 조회를 두 번 했는데, 중간에 다른 놈이 행을 추가/삭제해서 데이터 개수가 달라지는(유령이 보이는) 현상.
5. 장애 회복 및 아키텍처 (Recovery)
WAL (Write-Ahead Logging) 법칙
- 데이터 파일(디스크)을 직접 바꾸기 전에, 변경 이력을 담은 로그(Log)를 디스크에 먼저 기록해야 한다는 대원칙. 성능 향상과 비정상 종료 시 복구를 위해 필수적임.
REDO와 UNDO 복구 매커니즘
장애 후 재부팅 시 마지막 체크포인트 이후의 로그를 분석해 수행하는 작업.
- REDO (재실행): 장애 전 COMMIT이 완료된 트랜잭션 대상. 메모리엔 반영됐으나 디스크에 최종 기록되기 전에 날아간 데이터를 로그를 보고 똑같이 다시 실행해서 완전히 살려냄. (지속성 보장)
- UNDO (취소): 장애 발생 당시 COMMIT되지 않고 진행 중이던 불완전한 트랜잭션 대상. 어설프게 남아있는 변경 내역들을 로그의 이전 값을 확인해 싹 취소하고 원래대로 되돌림. (원자성 보장)
체크포인트 (Checkpoint / 검사점)
- 주기적으로 메모리의 변경 내용(더티 페이지)을 디스크에 강제로 동기화하고 기록을 남기는 지점.
- 장애 복구 시 전체 로그를 다 뒤질 필요 없이 마지막 체크포인트 이후의 로그만 검사하면 되므로 복구 시간을 획기적으로 줄여줌.
한 줄 회고
데이터베이스의 기본 설계 구조(스키마, 무결성)부터 성능 최적화(인덱스), 트랜잭션 안전장치(ACID, 격리수준), 그리고 마지막 방어선(WAL, 회복 매커니즘)까지의 유기적인 흐름을 드디어 하나의 지도로 꿸 수 있게 되었다. 면접 단골 질문들이니 구조를 완전히 외우자!!!! 속도가 많이 빠르고 ㅠㅠ 어렵지만 just do it! 킵고잉!!!!!!!!!!!1