데이터베이스 심화

하윤·2025년 11월 7일

CS

목록 보기
8/10

정규화 (Normalization)

데이터 중복을 최소화하고, 데이터 무결성을 확보하기 위해 테이블을 논리적으로 분해하는 과정.

관계형 데이터베이스 설계의 핵심 원칙

목적

  • 데이터 중복 제거 및 저장 공간 효율화
  • 데이터 일관성 및 무결성 유지 (갱신 이상, 삽입 이상, 삭제 이상 방지)

이상(Anomaly) 현상

정규화를 통해 제거하려는 문제점

  • 삽입 이상(Insertion Anomaly): 불필요한 데이터를 삽입해야만 새로운 데이터를 추가할 수 있는 문제
  • 갱신 이상(Update Anomaly): 중복된 데이터 중 일부만 갱신하여 데이터 불일치(Inconsistency)가 발생하는 문제
  • 삭제 이상(Deletion Anomaly): 특정 데이터를 삭제할 때, 필요한 다른 정보까지 함께 손실되는 문제

정규형(Normal Form)

정규화의 단계별 규칙 (1NF, 2NF, 3NF, BCNF, 4NF, 5NF).

일반적으로 3NF 또는 BCNF까지 적용하는 것이 실무에서 주로 사용

중요 정규형

정규형조건목적
1NF모든 컬럼이 원자값반복/다중 값 제거
2NF부분 함수 종속 제거복합키 → 속성이 일부 키에 종속될 경우 분리
3NF이행적 종속 제거A→B, B→C 관계 제거

반정규화 (Denormalization)

정규화된 데이터베이스의 성능 향상을 위해 의도적으로 데이터 중복을 허용하거나 테이블을 통합하는 과정.

과도한 정규화는 JOIN 연산을 증가시켜 성능 저하를 초래할 수 있어서 이를 해결하기 위해 사용된다.

목적

데이터 조회(Read) 시의 성능 최적화. (JOIN 횟수 감소)

사용 시점

시스템의 쿼리(Query) 부하가 높거나, 조회 성능이 중요할 때.

📢

정규화 = 데이터 무결성이 최우선.

반정규화 = 성능이 최우선.

트랜잭션 (Transaction)

데이터베이스의 상태를 변환시키는 하나의 논리적인 작업 단위.

여러 개의 SQL 명령어들을 묶어 하나의 작업으로 처리하며, 이 작업은 모두 성공하거나(Commit), 전부 실패하여 원래대로 돌아가야(Rollback) 한다.

ACID 속성

트랜잭션이 안정적이고 신뢰성 있게 수행되기 위해 보장되어야 하는 네 가지 핵심 속성

속성이름 (원문)설명
AAtomicity (원자성)트랜잭션 내의 모든 연산은 모두 성공하거나, 모두 실패해야 한다 (All or Nothing).
CConsistency (일관성)트랜잭션 수행 전후에 데이터베이스가 미리 정의된 일관된 상태(제약 조건, 규칙)를 유지해야 한다.
IIsolation (격리성)동시에 실행되는 트랜잭션들은 서로 독립적으로 수행되어, 마치 순차적으로 실행되는 것처럼 보여야 한다.
DDurability (지속성)트랜잭션이 성공적으로 커밋(Commit)되면, 그 결과는 시스템 장애와 무관하게 영구적으로 보존되어야 한다.

트랜잭션 격리 수준 (Isolation Levels)

여러 트랜잭션이 동시에 실행될 때 데이터의 일관성(Consistency)과 동시 처리 성능(Concurrency) 사이의 균형을 맞추기 위해 트랜잭션 간의 격리 정도를 정의하는 기준

격리 수준이 높을수록 데이터 일관성은 높아지지만, 성능은 저하될 수 있다.

격리 수준 (낮음 → 높음)허용되는 현상 (문제점)주요 DBMS의 기본값
Read Uncommitted (레벨 0)Dirty Read거의 사용 안 함
Read Committed (레벨 1)Non-Repeatable ReadOracle, PostgreSQL 기본
Repeatable Read (레벨 2)Phantom ReadMySQL(InnoDB) 기본
Serializable (레벨 3)문제점 없음 (완전 격리)성능 저하로 잘 사용 안 함
  • Dirty Read (더티 읽기): 커밋되지 않은(롤백 가능성이 있는) 데이터를 다른 트랜잭션이 읽는 현상
  • Non-Repeatable Read (반복 불가능 읽기): 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했을 때, 다른 트랜잭션의 커밋으로 인해 그 사이에 값이 변경되어 다른 결과가 나오는 현상
  • Phantom Read (유령 읽기): 한 트랜잭션 내에서 같은 쿼리를 두 번 수행했을 때, 다른 트랜잭션의 삽입(INSERT) 또는 삭제(DELETE)로 인해 첫 번째 쿼리에는 없던(혹은 있던) 레코드가 나타나거나(혹은 사라지거나) 하여 결과 집합의 행 개수가 달라지는 현상

동시성 제어 (Concurrency Control)

여러 개의 트랜잭션이 동시에 데이터베이스에 접근하여 데이터를 조작할 때, 데이터 무결성(Integrity)과 일관성(Consistency)을 유지하도록 트랜잭션들의 상호 작용을 제어하는 메커니즘

주요 기법

  • Locking (잠금): 데이터에 접근할 때 잠금을 걸어 다른 트랜잭션의 접근을 제한하는 방식. (공유 락: 읽기 허용, 배타 락: 쓰기 독점)
  • MVCC (Multi-Version Concurrency Control): 데이터를 업데이트할 때 이전 버전의 데이터를 유지하고, 트랜잭션마다 자신의 버전을 읽게 하여 읽기 작업에 락을 걸지 않고도 일관성을 유지하는 방식. (MySQL, InnoDB 등에서 주로 사용)
  • 낙관적 제어 (Optimistic): 충돌 발생 시 롤백하는 방식. 충돌이 적을 때 유리.
  • 비관적 제어 (Pessimistic): 처음부터 잠금하는 방식. 충돌이 잦을 때 유리.

정리

MySQL InnoDB는 MVCC + REPETABLE READ 기본

대량 조회 서비스에서 JOIN 많으면 → 반정규화 적용 고려

금융/포인트/주문 시스템은 트랜잭션 정확도가 최우선 → 높은 고립 수준, 비관적 락

데이터베이스 튜닝 (Database Tuning)

데이터베이스의 성능을 최적화하는 일련의 활동.

  • 쿼리 튜닝 (SQL Tuning): 비효율적인 SQL 문장을 더 효율적인 문장으로 수정하는 작업. (예: WHERE 절 최적화, 불필요한 JOIN 제거 등)
  • 스키마 튜닝 (Schema Tuning): 정규화/반정규화, 인덱스 생성 등을 통해 테이블 구조를 개선하는 작업.

데드락 (Deadlock)

둘 이상의 트랜잭션이 서로 상대방이 점유한 리소스의 해제를 기다리며 영원히 진행할 수 없는 상태에 빠지는 현상. 동시성 제어 시 발생하는 대표적인 문제.

  • 해결: 데드락을 탐지(Detection)하고, 관련 트랜잭션 중 하나를 강제 종료(Rollback)하여 데드락을 해제합니다.

분산 트랜잭션 (Distributed Transaction)

여러 개의 분산된 데이터베이스에 걸쳐 하나의 논리적인 작업을 처리하는 트랜잭션. 모든 데이터베이스에서 작업이 성공해야 커밋되는 등 ACID 속성을 유지하기 위한 복잡한 메커니즘(예: 2PC, Two-Phase Commit)이 필요하다.

profile
코린씨

5개의 댓글

comment-user-thumbnail
2025년 11월 9일

중요한 부분들이 강조되어 있어서 이해하기 좋았어요! 특히 표 내부에서 강조된 글씨가 있어서 한눈에 들어오네요!

답글 달기
comment-user-thumbnail
2025년 11월 10일

마지막 정리부분에서 데드락에 대한 내용이 도움이 되었어요

답글 달기
comment-user-thumbnail
2025년 11월 10일

중간중간 정리해주신 내용 보면서 숨 고르기 좋았습니다

답글 달기
comment-user-thumbnail
2025년 11월 10일

정규형에 따른 조건과 목적이 정리되어 있어 이해하기 쉬웠습니다!

답글 달기
comment-user-thumbnail
2025년 11월 10일

동시성 제어 부분에서 정리를 해주셔서 훨씬 읽기 편했어요

답글 달기