카테고리 없음

LG유레카 5월 3주차 강의 정리 (5.11~5.17) DB

superpark 2026. 5. 18. 11:00

 TIL (Today I Learned)


1. 데이터베이스 기본 개념 & 관계형 모델

 DBMS 개요 및 데이터 독립성

  • DBMS란? 데이터 중복을 최소화하고 여러 사용자가 안전하게 공유·관리할 수 있도록 돕는 소프트웨어 시스템.
  • 데이터 독립성을 위한 3단계 스키마 구조:
    1. 외부 스키마 (External): 사용자나 프로그래머가 보는 개인화된 관점 (View)
    2. 개념 스키마 (Conceptual): DB의 전체적인 논리 구조와 규칙 (Table 설계 및 관계)
    3. 내부 스키마 (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