Intro::
DBMS 기본 정리입니다.
DBMS
데이터베이스 관리 시스템(Database Management System, DBMS)은 대량의 구조화된 데이터를 효율적으로 저장·관리·조회할 수 있도록 지원하는 소프트웨어입니다.
1.
데이터 저장 및 조회
•
데이터를 테이블(또는 컬렉션) 단위로 구조화하여 저장하고, SQL 또는 각종 질의 언어를 통해 빠르게 검색할 수 있다.
2.
데이터 정의 및 조작 기능
•
DDL(Data Definition Language): 테이블·뷰·인덱스 등의 스키마를 생성·변경·삭제한다.
•
DML(Data Manipulation Language): INSERT, SELECT, UPDATE, DELETE를 통해 데이터를 삽입·조회·갱신·삭제한다.
3.
트랜잭션 관리(ACID 보장)
•
은행 계좌 a: 10 만원, b : 20 만원
•
원자성(Atomicity): 트랜잭션 내 작업 전부가 수행되거나 전부 취소된다.
◦
a → b 10만원 송금한다면, a에서 10을 꺼내고 b에 10을 넣는 동작 모두 성공하거나 모두 실패해야한다.
•
일관성(Consistency): 트랜잭션 수행 전·후의 데이터 무결성이 유지된다.
◦
특정 조건에 따라 데이터의 무결성을 유지해야한다. a,b 합산 30 이라면 a → b 10 송금을 하더라도 합산 30 이어야 한다.
•
고립성(Isolation): 동시 실행되는 트랜잭션 간 간섭을 방지하여 일관된 결과를 제공한다.
◦
트랜잭션 끼리는 순차적으로 실행되는것 처럼 동작해야한다.
•
지속성(Durability): 트랜잭션 완료 후 결과는 시스템 오류에도 보존된다.
◦
커밋이 된 이후에 시스템 오류가 발생하더라도 데이터는 보존되어야 한다.
4.
동시성 제어(Concurrency Control)
•
여러 사용자가 동시에 동일한 데이터를 읽거나 수정할 때, 잠금(Locking) 또는 멀티버전(MVCC) 방식으로 일관성을 유지하며 교착 상태를 최소화한다.
5.
격리 제어
a.
Read Uncommitted
•
정의: 다른 트랜잭션이 아직 커밋하지 않은 변경 내용도 읽을 수 있는 가장 낮은 격리 수준이다.
•
예시:
1.
T1이 A 계좌(잔액 100만원)에서 50만원을 차감하고 아직 커밋하지 않은 상태에서,
2.
T2가 A 계좌 잔액을 조회하면 50만원(비확정 값)을 읽을 수 있다.
3.
만약 T1이 이후에 롤백된다면, T2는 존재하지 않아야 할 데이터를 기반으로 잘못된 처리를 할 수 있다.
•
허용 현상: Dirty Read, Non-Repeatable Read, Phantom Read 모두 발생할 수 있다.
•
주의점: 무결성이 중요한 시스템에서는 사용하지 않는다.
b.
Read Committed
•
정의: 오직 커밋된 데이터만 읽을 수 있으며, 더티 리드는 방지된다.
•
예시:
1.
T1이 A 계좌에서 50만원을 차감(커밋 전)하고 있을 때,
2.
T2는 A 계좌 잔액을 조회하면 변동 전 값(100만원)을 읽는다.
3.
T1이 커밋된 이후 T2가 다시 조회하면 50만원을 읽게 된다.
→ 동일한 조회가 반복될 때 결과가 달라지는 Non-Repeatable Read가 발생한다.
•
허용 현상: Non-Repeatable Read, Phantom Read 발생 가능
•
차단 현상: Dirty Read 차단
•
적용 예시: Oracle·SQL Server·PostgreSQL(기본값)
c.
Repeatable Read
•
정의: 트랜잭션이 처음 읽은 시점의 스냅샷을 기준으로 동일한 조회 시 항상 같은 결과를 보장한다.
•
예시:
1.
T1이 A 계좌 잔액을 조회하여 100만원을 읽고, 같은 트랜잭션 내에서 다시 조회해도 여전히 100만원을 유지한다.
2.
중간에 T2가 A 계좌에서 50만원을 출금하여 커밋하더라도 T1은 최초 조회한 스냅샷(100만원)을 유지한다.
→ Non-Repeatable Read는 차단되지만, 새로운 계좌가 추가되는 경우 Phantom Read는 여전히 발생할 수 있다.
•
허용 현상: Phantom Read 발생 가능
•
차단 현상: Dirty Read, Non-Repeatable Read 차단
•
적용 예시: MySQL(InnoDB 기본값)
d.
Serializable
•
정의: 모든 트랜잭션이 마치 순차적으로 실행된 것처럼 동작하여 Dirty Read, Non-Repeatable Read, Phantom Read를 모두 차단한다.
•
예시:
1.
T1이 A 계좌에서 B 계좌로 50만원을 송금하는 작업을 수행 중일 때,
2.
T2는 T1이 완전히 끝나기 전까지 A 계좌나 B 계좌에 대한 어떠한 읽기·쓰기 작업도 수행할 수 없다.
→ 두 트랜잭션 간의 순차적 실행(Serial)과 동일한 결과를 보장한다.
•
허용 현상: 이상 현상 발생 없음
•
차단 현상: 모든 이상 현상(Dirty Read, Non-Repeatable Read, Phantom Read) 차단
•
적용 예시: PostgreSQL(Serializable 옵션), Oracle(Serializable 옵션)
6.
보안 및 접근 제어
•
사용자 계정별로 권한을 설정하여 데이터베이스 객체(테이블, 뷰, 칼럼 등)에 대한 읽기·쓰기 권한을 제한하고, 민감 정보를 보호한다.
7.
백업 및 복구
•
정기적인 백업과 로그 기반 복구 기능을 제공하여, 장애 발생 시 데이터 손실을 최소화하고 특정 시점까지 복원할 수 있다.
8.
성능 최적화
•
인덱스(Index): 검색 속도를 높이기 위해 인덱스를 생성하고 유지한다.
•
쿼리 최적화(Query Optimization): 옵티마이저가 최적의 실행 계획을 선택하여 대용량 데이터 처리 시 성능을 개선한다.
9.
데이터베이스 유형
•
관계형 DBMS(RDBMS): 테이블 간 관계를 명확히 정의하며, SQL을 사용한다. 대표 예로 MySQL, PostgreSQL, Oracle 등이 있다.
•
NoSQL DBMS: 비정형 데이터를 지원하며, 키-값(Key-Value), 문서(Document), 열(Columnar), 그래프(Graph) 등 다양한 모델을 제공한다. MongoDB, Cassandra, Redis 등이 대표적이다.
NOSQL
Not Only SQL
비정형(또는 반정형) 데이터를 유연하게 저장·처리하기 위해 고안된 데이터 저장소
•
스키마(Schema) 유연성: 사전에 테이블 스키마를 정의할 필요 없이, 각 레코드(문서 또는 키-값 등)가 서로 다른 컬럼 구조를 가질 수 있습니다.
•
수평적 확장성(Scale-Out): 서버(노드)를 늘려서(클러스터링) 부하를 분산하고 성능을 확장하기가 쉽습니다. 전통적인 RDBMS처럼 고가용성 하드웨어에 의존하지 않고, 저렴한 범용 서버를 다수 연결해 운영할 수 있습니다.
•
고가용성 및 분산 처리: 데이터 복제(replication)와 샤딩(sharding)을 통해 데이터 손실, 장애 복구, 지역별 데이터 분산 처리 등이 용이합니다.
파티셔닝
파티셔닝은 하나의 데이터베이스 인스턴스(DBMS) 내부에서, 테이블을 논리적·물리적으로 나누어 관리하는 기법입니다.
•
단일 DBMS 인스턴스 내 분할: 모든 파티션이 같은 서버(또는 같은 DBMS 프로세스) 위에 존재하지만, 파일 그룹이나 디스크 등 물리적 저장소를 분리하여 저장할 수 있습니다.
•
수평 파티셔닝(행 기반 분할): 레코드(행)를 파티션 키(예: 날짜, 사용자 ID 범위, 해시 값 등)에 따라 나누어, 각 파티션이 서로 다른 파일 그룹이나 디스크에 저장됩니다.
•
수직 파티셔닝(열 기반 분할): 테이블의 자주 사용되는 컬럼과 그렇지 않은 컬럼을 분리하여 별도의 테이블 또는 저장소에 두는 방식입니다. 다만, 일반적으로 파티셔닝이라 하면 먼저 수평 파티셔닝을 떠올립니다.
샤딩
샤딩은 여러 대의 서로 다른 데이터베이스 인스턴스(노드)에 데이터를 분산 저장하는 기법으로, 전체 시스템의 수평적 확장(Scale-Out)을 목표로 합니다.
•
각 샤드(Shard)가 독립된 DBMS 인스턴스로 운영: 파티셔닝과 달리, 샤드 A, 샤드 B, 샤드 C 등이 각각 별도의 서버(또는 인스턴스)로 구성됩니다.
•
샤드 키(Sharding Key) 사용: 클라이언트나 미들웨어는 데이터를 저장할 때 샤드 키(예: 사용자 ID, 지역 코드, 해시 값 등)를 기준으로 어느 샤드에 저장할지 결정합니다.
•
샤드 매핑(Shard Map) 관리: 애플리케이션은 샤드 매핑 정보를 참고하여, 특정 레코드가 어느 샤드에 위치하는지 찾아내고 해당 노드로 질의를 전송합니다.