목차
- 1. 데이터베이스 시스템
- 2. 관계 데이터 모델
- 3. 무결성 제약조건
- 4. 관계대수
- 5. SQL 데이터 정의어 (DDL)
- 6. SQL 데이터 조작어 (DML)
- 7. SQL 데이터 검색 (SELECT) 및 함수
- 8. 부속질의 (Subquery)
- 9. 뷰 (View)
- 10. 데이터의 물리적 저장
- 11. 인덱스 (Index)
- 12. 인덱스 생성 및 관리
- 13. 데이터 모델링
- 14. 데이터 모델링 과정
- 15. ER 모델 (Entity-Relationship Model)
- 16. 개체 (Entity)
- 17. 속성 (Attribute)
- 18. 관계와 관계 타입
- 19. 개체 타입과 식별자
- 20. IE 표기법 (새발 표기법)
- 21. ER 모델 -> 관계 데이터 모델 매핑
- 22. 이상현상 (Anomaly)
- 23. 함수 종속성 (Functional Dependency)
- 24. 정규화 (Normalization)
- 25. 무손실 분해
- 26. 트랜잭션 (Transaction)
- 27. 동시성 제어 (Concurrency Control)
- 28. 트랜잭션 격리 수준
- 29. 회복 (Recovery)
1. 데이터베이스 시스템
1. 데이터베이스(DB)란
- 정의: 논리적으로 연관된 데이터를 모아 구조적으로 통합해 놓은 데이터의 집합입니다. 단순히 데이터를 모아놓은 것이 아니라, 중복을 최소화하고 여러 사용자가 공유할 수 있도록 체계적으로 구성된 것이 핵심입니다.
- 핵심 기능: DB 시스템은 데이터의 검색(Search) 과 변경(Modification) 작업을 효율적으로 수행하는 것을 주 목적으로 합니다. 사용자가 원하는 데이터를 빠르게 찾고, 새로운 데이터를 추가하거나 기존 데이터를 수정, 삭제하는 작업을 안정적으로 지원합니다.
2. 데이터베이스의 4가지 개념
- 통합된 데이터 (Integrated Data): 여러 곳에 흩어져 있던 데이터를 한 곳에 모아 통합 관리함으로써 데이터의 중복을 최소화하고 일관성을 유지합니다.
- 저장된 데이터 (Stored Data): 컴퓨터가 접근할 수 있는 디스크, 테이프 등의 물리적 저장 장치에 저장되어 있어 언제든지 사용할 수 있습니다.
- 운영 데이터 (Operational Data): 조직의 고유한 목적을 달성하기 위해 반드시 필요한 필수적인 데이터입니다. 단순한 보관용 데이터가 아닌, 실제 업무 처리에 사용되는 데이터입니다.
- 공용 데이터 (Shared Data): 한 사람이나 한 부서가 독점하는 것이 아니라, 여러 사용자나 시스템이 공동으로 소유하고 사용할 수 있는 데이터입니다.
3. 데이터베이스 특징
- 실시간 접근 가능 (Real-time Accessibility): 사용자의 질의(Query)에 대해 즉각적으로 응답할 수 있어야 합니다. 데이터 처리가 지연되지 않고 실시간으로 이루어져야 합니다.
- 지속적 변화 (Continuous Evolution): 데이터베이스는 정지된 상태가 아니라, 삽입, 삭제, 갱신 등의 작업을 통해 끊임없이 변화하며 항상 최신 상태를 유지해야 합니다.
- 동시 공유 가능 (Concurrent Sharing): 여러 사용자가 동시에 같은 데이터에 접근하여 사용할 수 있어야 합니다. 이를 위해 병행 제어(Concurrency Control) 기능이 필요합니다.
- 내용 참조 가능 (Content Reference): 데이터가 저장된 물리적인 주소나 위치가 아니라, 데이터가 가지고 있는 값(Value)을 통해 데이터를 참조하고 검색할 수 있습니다.
4. 데이터베이스 시스템 구성
- DBMS (Database Management System): 사용자와 데이터베이스 사이에서 데이터를 관리하고 제어하는 소프트웨어 시스템입니다. 데이터 정의, 조작, 제어 기능을 제공하며, 데이터의 무결성과 보안을 유지합니다. (예: Oracle, MySQL, SQL Server)
- 데이터베이스 (Database): 물리적으로 저장된 데이터의 집합체입니다. 실제 데이터가 저장되는 공간입니다.
- 데이터 모델 (Data Model): 현실 세계의 데이터를 컴퓨터 세계의 데이터베이스로 표현하기 위한 도구이자 기법입니다. 데이터의 구조, 연산, 제약조건 등을 정의합니다. (예: 관계형 모델, 객체 지향 모델)
flowchart LR
U[User/App] -->|SQL| DBMS[DBMS]
DBMS -->|Read/Write| DISK[(Disk Files)]
DBMS -->|Cache| BUF[(Buffer Pool/RAM)]
DBMS -->|Result| U
5. 3단계 데이터베이스 구조
- 데이터베이스를 보는 관점(View)에 따라 3단계로 분리하여 데이터 독립성을 확보하고, 복잡한 내부 구조를 감추어 사용자에게 단순화된 뷰를 제공합니다.
- 외부 단계 (External Level): 사용자나 응용 프로그래머가 접근하는 단계로, 각 사용자가 필요로 하는 데이터의 논리적인 구조(외부 스키마)를 정의합니다. (사용자 관점)
- 개념 단계 (Conceptual Level): 데이터베이스 전체의 논리적인 구조(개념 스키마)를 정의하는 단계로, 모든 사용자가 공유하는 통합된 뷰를 제공합니다. 개체, 속성, 관계, 제약조건 등을 포함합니다. (DBA 관점)
- 내부 단계 (Internal Level): 데이터가 물리적인 저장 장치에 실제로 저장되는 방법(내부 스키마)을 정의하는 단계로, 데이터의 저장 구조, 인덱스, 레코드 배치 등을 다룹니다. (시스템 관점)
2. 관계 데이터 모델
1. 관계 데이터 모델이란
- 데이터와 그들 간의 관계를 테이블(Table, 릴레이션) 형태로 표현하는 가장 널리 사용되는 데이터 모델입니다. 수학적인 집합 이론에 기초하고 있어 탄탄한 이론적 배경을 가지고 있습니다.
2. 릴레이션(Relation) 구조
- 행(Row)과 열(Column)로 구성된 2차원 테이블 구조를 가집니다.
- 속성 (Attribute): 테이블의 열(Column)에 해당하며, 데이터의 가장 작은 논리적 단위인 필드(Field)를 의미합니다. (속성의 수 = 차수(Degree))
- 튜플 (Tuple): 테이블의 행(Row)에 해당하며, 서로 연관된 속성값들의 모임인 레코드(Record)를 의미합니다. (튜플의 수 = 카디날리티(Cardinality))
- 도메인 (Domain): 하나의 속성이 가질 수 있는 원자 값(Atomic Value)들의 집합입니다. 예를 들어, ‘성별’ 속성의 도메인은 ‘남’, ‘여’가 될 수 있습니다.
3. 키(Key)의 종류
- 슈퍼키 (Super Key): 튜플을 유일하게 식별할 수 있는 속성들의 집합입니다. 유일성(Uniqueness)은 만족하지만, 최소성(Minimality)은 만족하지 않을 수 있습니다. (예:
(학번, 이름),(주민번호, 주소)) - 후보키 (Candidate Key): 튜플을 유일하게 식별하는 최소한의 속성 집합입니다. 유일성과 최소성을 모두 만족해야 합니다. (예:
학번,주민번호) - 기본키 (Primary Key): 후보키 중에서 데이터를 대표하기 위해 선정된 키입니다. NULL 값을 가질 수 없으며, 중복된 값을 허용하지 않습니다. (개체 무결성 제약조건)
- 외래키 (Foreign Key): 다른 릴레이션의 기본키를 참조하는 속성입니다. 릴레이션 간의 관계를 표현하는 데 사용되며, 참조 무결성 제약조건을 만족해야 합니다.
3. 무결성 제약조건
1. 무결성(Integrity)이란
- 데이터베이스에 저장된 데이터의 정확성, 일관성, 유효성을 유지하기 위한 조건입니다. 데이터의 결함이나 오류가 없는 상태를 의미합니다.
2. 주요 제약조건
- 도메인 무결성 (Domain Integrity): 특정 속성의 값이 그 속성에 정의된 도메인(자료형, 범위, 형식 등)에 속해야 한다는 조건입니다. (예: 나이 속성은 0 이상의 정수여야 함)
- 개체 무결성 (Entity Integrity): 기본키를 구성하는 어떤 속성도 NULL 값을 가질 수 없으며, 릴레이션 내에서 중복될 수 없다는 조건입니다. 각 튜플은 유일하게 식별되어야 함을 보장합니다.
- 참조 무결성 (Referential Integrity): 외래키 값은 참조하는 릴레이션의 기본키 값이거나 NULL이어야 한다는 조건입니다. 참조할 수 없는 외래키 값을 가질 수 없도록 하여 릴레이션 간의 관계를 일관성 있게 유지합니다. (부모 없는 자식 데이터 불가)
4. 관계대수
1. 관계대수란
- 관계형 데이터베이스에서 원하는 데이터를 얻기 위해 어떻게(How) 질의해야 하는지를 기술하는 절차적 언어(Procedural Language)입니다. SQL의 이론적인 기초가 됩니다.
2. 순수 관계 연산
- 관계 데이터 모델을 위해 고안된 연산자입니다.
- 셀렉션(Selection, σ): 릴레이션에서 조건에 맞는 튜플(행)들을 추출하는 연산입니다. (수평적 부분집합)
- 프로젝션(Projection, π): 릴레이션에서 지정한 속성(열)들만 추출하는 연산입니다. (수직적 부분집합)
- 조인(Join, ⋈): 두 릴레이션을 공통 속성을 기준으로 결합하여 새로운 릴레이션을 만드는 연산입니다.
- 동등 조인 (Equi Join): 조인 조건이 =인 경우입니다.
- 자연 조인 (Natural Join): 동등 조인에서 중복된 속성을 제거한 것입니다.
- 외부 조인 (Outer Join): 조인 조건에 맞지 않는 튜플도 결과에 포함시키는 연산입니다. (Left, Right, Full)
- 세미 조인 (Semi Join): 자연 조인 후 한쪽 릴레이션의 튜플만 반환하는 연산입니다.
- 디비전(Division, ÷): 릴레이션 A가 릴레이션 B의 모든 속성값을 포함하는 튜플을 추출하는 연산입니다.
3. 일반 집합 연산
- 수학적인 집합 이론에서 사용하는 연산자입니다. 두 릴레이션이 합병 가능(Union Compatible)해야 합니다. (차수와 도메인이 동일)
- 합집합(Union, ∪): 두 릴레이션의 모든 튜플을 합친 결과입니다. (중복 튜플 제거)
- 교집합(Intersection, ∩): 두 릴레이션에 공통으로 존재하는 튜플입니다.
- 차집합(Difference, -): 첫 번째 릴레이션에는 존재하지만 두 번째 릴레이션에는 존재하지 않는 튜플입니다.
- 카티션 프로덕트(Cartesian Product, ×): 두 릴레이션의 모든 가능한 튜플 조합을 연결한 결과입니다. (결과 튜플 수 = A 튜플 수 × B 튜플 수)
5. SQL 데이터 정의어 (DDL)
SQL(Structured Query Language)은 관계형 데이터베이스 표준 언어입니다. DDL(Data Definition Language)은 데이터베이스 스키마 객체(테이블, 인덱스, 뷰 등)를 생성, 변경, 삭제하는 데 사용됩니다.
1. CREATE (테이블 생성)
- 새로운 테이블을 정의하고 생성합니다. 속성 이름, 데이터 타입, 제약조건(기본키, 외래키, NOT NULL 등)을 명시합니다.
CREATE TABLE 테이블이름 (
속성이름 데이터타입 [NOT NULL | UNIQUE | DEFAULT 기본값],
PRIMARY KEY (속성이름),
FOREIGN KEY (속성이름) REFERENCES 참조테이블(속성이름) [ON DELETE CASCADE | SET NULL] -- 참조 무결성 위배 시 동작 정의
);
2. ALTER (구조 변경)
- 이미 생성된 테이블의 구조를 변경합니다. 속성 추가/삭제/타입 변경, 제약조건 추가/삭제 등이 가능합니다.
-- 속성 추가: 테이블에 새로운 컬럼을 추가합니다.
ALTER TABLE NewBook ADD isbn VARCHAR(13);
-- 속성 타입 변경: 기존 컬럼의 데이터 타입을 변경합니다.
ALTER TABLE NewBook MODIFY isbn INTEGER;
-- 속성 삭제: 테이블에서 특정 컬럼을 제거합니다.
ALTER TABLE NewBook DROP isbn;
-- 제약조건(기본키) 추가: 테이블에 기본키 제약조건을 설정합니다.
ALTER TABLE NewBook ADD PRIMARY KEY(bookid);
3. DROP (테이블 삭제)
- 테이블 자체를 데이터베이스에서 완전히 삭제합니다. 테이블 구조와 저장된 데이터가 모두 사라집니다.
DROP TABLE NewBook;
-- 참조 무결성 제약이 걸려 있다면, 자식 테이블을 먼저 삭제하거나 외래키 제약을 제거해야 삭제가 가능합니다.
✅ 예제
DDL은 “한 번 만들면 끝”이 아니라, 운영 중에도 스키마 진화를 위해 계속 쓰입니다.
-- 1) 테이블 생성
CREATE TABLE NewBook (
bookid INT PRIMARY KEY,
bookname VARCHAR(100) NOT NULL,
publisher VARCHAR(50),
price INT
);
-- 2) 컬럼 추가/변경/삭제
ALTER TABLE NewBook ADD COLUMN isbn VARCHAR(13);
ALTER TABLE NewBook MODIFY COLUMN isbn VARCHAR(20);
ALTER TABLE NewBook DROP COLUMN isbn;
-- 3) 제약조건 추가 (예: 가격 음수 금지)
ALTER TABLE NewBook
ADD CONSTRAINT ck_newbook_price CHECK (price >= 0);
-- 4) 삭제
DROP TABLE NewBook;
✅ 그림
flowchart LR
A[CREATE] --> B[ALTER]
B --> C[ALTER...]
C --> D[DROP]
B --> E[Constraints/Indexes evolve]
6. SQL 데이터 조작어 (DML)
DML(Data Manipulation Language)은 데이터베이스에 저장된 데이터를 조회, 삽입, 수정, 삭제하는 데 사용됩니다.
1. INSERT (데이터 삽입)
- 테이블에 새로운 튜플(행)을 추가합니다.
-- 기본 삽입: 지정된 속성에 값을 순서대로 입력합니다.
INSERT INTO Book(bookid, bookname, publisher, price)
VALUES (11, '스포츠 의학', '한솔의학서적', 90000);
-- 대량 삽입 (Bulk Insert): 다른 테이블의 조회 결과를 한꺼번에 삽입합니다.
INSERT INTO Book(bookid, bookname, price, publisher)
SELECT bookid, bookname, price, publisher
FROM Imported_book;
2. UPDATE (데이터 수정)
- 테이블에 저장된 기존 튜플의 속성 값을 변경합니다.
WHERE절을 사용하여 특정 튜플만 수정할 수 있습니다.
-- 값 수정: 특정 고객의 주소를 변경합니다.
UPDATE Customer SET address='대한민국 부산' WHERE custid=5;
-- 서브쿼리를 이용한 수정: 다른 테이블의 값을 조회하여 수정에 사용합니다.
UPDATE Book SET publisher =
(SELECT publisher FROM imported_book WHERE bookid=21)
WHERE bookid=14; Note: MySQL Safe Updates 모드가 켜져 있으면 Key 컬럼 조건 없이UPDATE나DELETE가 불가능할 수 있으므로 주의해야 합니다.
3. DELETE (데이터 삭제)
- 테이블에서 튜플(행)을 삭제합니다.
WHERE절을 생략하면 테이블의 모든 데이터가 삭제되지만 테이블 구조는 남습니다.
DELETE FROM Book WHERE bookid=11;
-- 조건절이 없으면 모든 데이터 삭제 (테이블 구조는 유지됨)
DELETE FROM Customer;
✅ 예제
DML은 “데이터를 바꾸는 언어”라서, 트랜잭션과 함께 보면 실무 감각이 확 올라옵니다.
START TRANSACTION;
INSERT INTO book(bookid, bookname, publisher, price)
VALUES (11, '스포츠 의학', '한솔의학서적', 90000);
UPDATE customer SET address='대한민국 부산' WHERE custid=5;
-- 문제가 있으면 전부 취소
-- ROLLBACK;
-- 문제 없으면 확정
COMMIT;
✅ 그림
sequenceDiagram
participant App
participant DB
App->>DB: BEGIN
App->>DB: INSERT/UPDATE/DELETE...
alt ok
App->>DB: COMMIT
else error
App->>DB: ROLLBACK
end
7. SQL 데이터 검색 (SELECT) 및 함수
1. 기본 검색 구조
SELECT문은 데이터베이스에서 데이터를 조회하는 가장 기본적인 명령어입니다.
SELECT 속성리스트 -- 조회할 컬럼 선택
FROM 테이블리스트
WHERE 검색조건
GROUP BY 속성리스트
HAVING 그룹조건
ORDER BY 속성리스트 [ASC|DESC];
2. 주요 내장 함수
- DBMS는 데이터 처리를 돕기 위해 다양한 내장 함수를 제공합니다.
- 숫자형:
ABS(절댓값),ROUND(반올림),CEIL(올림),FLOOR(내림) 등. - 문자형:
REPLACE(문자열 치환),CHAR_LENGTH(문자수),LENGTH(바이트수),SUBSTR(문자열 추출),CONCAT(문자열 결합) 등. - 날짜형:
ADDDATE(날짜 더하기),DATE_FORMAT(날짜 형식 변환),SYSDATE(현재 날짜와 시간) 등. - NULL 처리:
IS NULL(NULL인지 확인),IFNULL(val, default)(NULL일 경우 대체값 반환).
3. 집계 함수와 GROUP BY
- 집계 함수: 여러 행의 값을 입력받아 하나의 요약된 값을 반환합니다.
SUM(합계),AVG(평균),COUNT(개수),MAX(최댓값),MIN(최솟값) 등이 있습니다. (주의: NULL 값은 계산에서 제외됩니다.) - GROUP BY: 특정 속성이 같은 값을 갖는 행들을 하나의 그룹으로 묶습니다. 반드시 집계 함수와 함께 사용됩니다.
- HAVING:
GROUP BY로 그룹화된 결과(집계 결과)에 조건을 적용하여 필터링합니다.WHERE절은 그룹화 전에 적용되는 조건입니다.
✅ 예제
WHERE vs HAVING을 집계 예제로 분리해서 보면 “언제 적용되는 조건인지”가 명확해집니다.
-- WHERE: 그룹핑 전에 행을 필터링
SELECT o.custid, COUNT(*) AS cnt, SUM(o.saleprice) AS total
FROM orders o
WHERE o.saleprice >= 20000
GROUP BY o.custid;
-- HAVING: 그룹핑 후 집계 결과를 필터링
SELECT o.custid, COUNT(*) AS cnt, SUM(o.saleprice) AS total
FROM orders o
GROUP BY o.custid
HAVING SUM(o.saleprice) >= 40000;
✅ 그림
flowchart LR
A[FROM] --> B[WHERE]
B --> C[GROUP BY]
C --> D[HAVING]
D --> E[SELECT]
E --> F[ORDER BY]
8. 부속질의 (Subquery)
하나의 SQL 문(메인 쿼리) 안에 포함된 또 다른 SQL 문(서브 쿼리)을 말합니다. 복잡한 질의를 구조화하고 가독성을 높일 수 있습니다.
1. 중첩 질의 (Nested Subquery, WHERE 절)
WHERE절에서 사용되며, 메인 쿼리의 조건 값을 제공합니다. 비교 연산자,IN,EXISTS,ANY,ALL등과 함께 사용됩니다.
-- 평균 주문금액보다 큰 주문 내역 조회
SELECT * FROM orders
WHERE saleprice > (SELECT AVG(saleprice) FROM orders);
2. 스칼라 부속질의 (Scalar Subquery, SELECT 절)
SELECT절에서 사용되며, 결과가 단일 행, 단일 열(하나의 값)이어야 합니다. 각 행마다 실행되어 값을 반환합니다.
-- 고객 이름과 함께 각 주문의 판매액 출력
SELECT
(SELECT name FROM customer c WHERE c.custid=o.custid) 'name',
SUM(saleprice)
FROM orders o
GROUP BY o.custid;
3. 인라인 뷰 (Inline View, FROM 절)
FROM절에서 사용되며, 마치 뷰(View)처럼 일시적으로 생성된 가상의 테이블 역할을 합니다. 쿼리 실행 중에만 존재하며 실행 후 사라집니다.
-- 고객번호 2 이하인 고객들의 이름과 총 판매액 조회
SELECT
c.name,
SUM(o.saleprice) FROM Orders o,
(SELECT custid, name FROM customer WHERE custid <= 2) c
WHERE o.custid=c.custid
GROUP BY c.name;
9. 뷰 (View)
1. 뷰란 무엇인가
- 하나 이상의 기본 테이블이나 다른 뷰를 기반으로 만들어진 가상의 테이블입니다.
- 실제 데이터를 저장하지 않고, 뷰를 생성할 때 정의한 SQL 문(쿼리)만 딕셔너리에 저장됩니다. 사용자는 테이블처럼 뷰를 사용할 수 있습니다.
2. 뷰의 장점
- 재사용성: 자주 사용되는 복잡한 질의를 뷰로 정의해두면, 간단한 질의로 재사용할 수 있어 편리합니다.
- 보안성: 사용자에게 민감한 정보(예: 급여, 주민번호)를 숨기고, 필요한 데이터만 포함된 뷰를 제공하여 접근을 제어할 수 있습니다.
- 독립성: 원본 테이블의 구조가 변경되어도 뷰의 정의만 수정하면 응용 프로그램에 영향을 주지 않아 논리적 데이터 독립성을 제공합니다.
3. 뷰 생성 및 사용
-- 뷰 생성: CREATE VIEW 명령어 사용
CREATE VIEW vw_orders
AS SELECT o.orderid, c.name, b.bookname, o.saleprice
FROM orders o, customer c, book b
WHERE o.custid=c.custid
AND o.bookid=b.bookid;
-- 뷰 조회: 테이블처럼 SELECT 문 사용 가능
SELECT * FROM vw_orders WHERE name='김연아';
-- 뷰 삭제: DROP VIEW 명령어 사용
DROP VIEW vw_orders;
✅ 그림
flowchart LR
T["Base Tables"] --> V["View Definition (SQL)"]
V --> U["User Query on View"]
U --> DB["DBMS expands to base query"]
10. 데이터의 물리적 저장
1. 데이터베이스 저장 방식
- DBMS는 데이터를 논리적인 구조(테이블 등)로 관리하지만, 최종적으로는 보조기억장치(HDD, SSD)에 파일 형태로 저장됩니다.
- MySQL(InnoDB)의 저장: 테이블 생성 시 정의된 내용에 따라
.ibd파일과 같은 데이터 파일 형태로 저장됩니다. 운영체제의 파일 시스템 위에서 관리됩니다. - 저장 경로 확인:
SHOW VARIABLES LIKE 'datadir';명령어로 실제 데이터 파일이 저장된 위치를 확인할 수 있습니다.
2. 액세스 시간 (Access Time)
- 디스크에서 데이터를 읽거나 쓰는 데 걸리는 총 시간입니다. 디스크 I/O 성능의 핵심 지표입니다.
- 구성 요소:
- 탐색 시간 (Seek Time): 디스크 헤드가 데이터를 읽기 위해 해당 트랙(Track)으로 이동하는 데 걸리는 시간입니다. 가장 많은 시간이 소요됩니다.
- 회전 지연 시간 (Rotational Latency Time): 디스크가 회전하여 원하는 섹터(Sector)가 헤드 위치에 도달할 때까지 걸리는 시간입니다.
- 데이터 전송 시간 (Data Transfer Time): 데이터를 디스크에서 읽어 주기억장치로 전송하는 데 걸리는 시간입니다.
3. 버퍼 풀 (Buffer Pool)
- 하드디스크의 느린 I/O 속도를 보완하기 위해 주기억장치(RAM)의 일부를 캐시(Cache)로 사용하는 공간입니다.
- LRU (Least Recently Used) 알고리즘 등을 사용하여 자주 사용되는 데이터를 메모리에 유지하고, 덜 사용되는 데이터는 디스크로 내보냅니다.
- 데이터 검색 시 DBMS는 디스크에 접근하기 전에 버퍼 풀을 먼저 확인(Buffer Hit)하여 I/O 성능을 획기적으로 높입니다.
✅ 예제
“실제 어디에 저장되는지”는 변수를 보면 바로 확인됩니다.
SHOW VARIABLES LIKE 'datadir';
SHOW VARIABLES LIKE 'innodb_file_per_table';
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
✅ 그림
flowchart TB
APP[Query] --> BP[(Buffer Pool)]
BP -->|hit| CPU[Execute]
BP -->|miss| IO[Disk I/O]
IO --> BP
11. 인덱스 (Index)
1. 인덱스란
- 책의 '색인'과 같이 데이터를 빠르게 찾을 수 있도록 돕는 자료구조입니다.
- DB에서는 (키 값, 포인터) 쌍으로 구성되어, 튜플의 키 값과 그 데이터가 저장된 물리적 위치(주소)를 매핑해 둡니다.
- B-tree (Balanced-tree) 계열의 자료구조가 가장 일반적으로 사용됩니다.
✅ 그림
flowchart TB
R[Root] --> N1[Internal]
R --> N2[Internal]
N1 --> L1[Leaf: keys + pointers]
N2 --> L2[Leaf: keys + pointers]
2. B-tree (Balanced Tree)
- 데이터 검색 시간을 단축하기 위해 고안된 균형 잡힌 트리 구조입니다.
- 구조: 루트 노드, 내부 노드, 리프 노드로 구성되며, 모든 리프 노드는 같은 레벨(깊이)에 존재하여 검색 성능이 일정하게 유지됩니다.
- 특징: 키 값은 오름차순으로 정렬되어 저장되며, 리프 노드에는 실제 데이터의 위치를 가리키는 RowID(RID)가 저장됩니다.
3. 인덱스의 특징
- 테이블 전체 데이터의 일부(키 컬럼)만 저장하므로 공간 효율적입니다.
- 데이터가 정렬된 상태를 유지하므로 검색(SELECT) 속도가 매우 빠릅니다.
- 단, 데이터 변경(INSERT, UPDATE, DELETE) 시 인덱스도 함께 수정해야 하므로 추가적인 오버헤드가 발생하여 쓰기 성능이 저하될 수 있습니다.
4. 인덱스의 종류 (MySQL InnoDB)
- 클러스터 인덱스 (Clustered Index):
- 테이블당 하나만 생성 가능하며, 주로 기본키(Primary Key)가 클러스터 인덱스가 됩니다.
- 리프 노드에 실제 데이터(테이블의 모든 열)가 함께 저장됩니다. 즉, 인덱스 자체가 데이터 파일입니다.
- 키 값에 따라 데이터가 물리적으로 정렬되어 있어 범위 검색(BETWEEN, >, <)에 매우 유리합니다.
- 보조 인덱스 (Secondary Index):
- 테이블당 여러 개 생성 가능합니다. (UNIQUE, 일반 인덱스 등)
- 리프 노드에 실제 데이터 대신 클러스터 인덱스의 키 값이나 페이지 주소가 저장됩니다.
- 보조 인덱스로 검색하면 먼저 클러스터 인덱스 키를 찾고, 그 키를 이용해 클러스터 인덱스에서 실제 데이터를 찾는 과정(Lookup)이 필요할 수 있습니다.
12. 인덱스 생성 및 관리
1. 인덱스 생성 (CREATE INDEX)
- 테이블의 특정 컬럼에 대해 인덱스를 생성하여 검색 성능을 향상시킵니다.
-- 인덱스 생성 문법
CREATE [UNIQUE] INDEX 인덱스이름 ON 테이블이름 (컬럼명 [ASC | DESC]);
-- 예시: 책 제목으로 인덱스 생성
CREATE INDEX ix_Book ON Book(bookname);
-- 예시: 출판사와 가격으로 복합 인덱스 생성
CREATE INDEX ix_Book2 ON Book(publisher, price); - 인덱스 확인:
SHOW INDEX FROM 테이블이름;명령어로 생성된 인덱스 정보를 볼 수 있습니다. - 실행 계획 확인:
EXPLAIN명령어나 Workbench의 [Explain Current Statement] 기능을 사용하여 쿼리가 인덱스를 제대로 타는지 확인할 수 있습니다.
2. 선택도 (Selectivity)
- 인덱스의 효율성을 판단하는 중요한 지표입니다. 전체 데이터 중에서 특정 값이 얼마나 잘 구별되는지를 나타냅니다.
- 공식:
선택도 = (고유한 값의 개수) / (전체 행의 개수) - 선택도가 높을수록(1에 가까울수록, 즉 중복된 값이 적을수록) 인덱스를 통한 검색 효율이 좋습니다. (예: 주민번호는 중복이 없으므로 선택도가 높고, 성별은 중복이 많으므로 선택도가 낮습니다.)
3. 단편화 (Fragmentation)
- 잦은 데이터 삽입, 삭제, 수정으로 인해 인덱스 페이지 내에 빈 공간이 생기거나 데이터가 물리적으로 흩어지는 현상입니다.
- 디스크 I/O를 증가시켜 성능 저하를 유발하고 불필요한 저장 공간을 낭비하게 됩니다.
- 해결 방법:
ANALYZE TABLE 테이블이름;: 인덱스 통계 정보를 갱신하여 옵티마이저가 최적의 실행 계획을 세우도록 돕습니다.OPTIMIZE TABLE 테이블이름;: 테이블과 인덱스를 재구성하여 단편화를 제거하고 공간을 회수합니다.- 또는 인덱스를 삭제(
DROP INDEX)하고 다시 생성(CREATE INDEX)하여 단편화를 해결할 수도 있습니다.
✅ 참고
인덱스는 EXPLAIN으로 “타는지/안 타는지”를 확인하는 게 실무 기본입니다.
EXPLAIN
SELECT * FROM orders WHERE custid = 2;
CREATE INDEX ix_orders_custid ON orders(custid);
EXPLAIN
SELECT * FROM orders WHERE custid = 2;
13. 데이터 모델링
1. 데이터 모델링이란?
- 소프트웨어 개발의 초기 단계에서 수행되는 작업으로, 복잡한 현실 세계의 데이터 요구사항을 단순화하고 추상화하여 컴퓨터가 이해할 수 있는 데이터베이스 구조로 변환하는 과정입니다. 건축물의 설계도면을 그리는 것과 같습니다.
2. 데이터베이스 생명주기
데이터베이스 시스템의 생성부터 운영, 폐기까지의 전반적인 주기를 말하며, 크게 5단계로 구분됩니다.
- 요구사항 수집 및 분석: 사용자가 무엇을 필요로 하는지 분석하여 데이터베이스 구축의 범위와 목표를 설정합니다. (예: 마당서점의 업무 프로세스 분석)
- 설계:
- 개념적 설계: 사용자 요구사항을 분석하여 핵심 개체와 관계를 식별하고 ER 다이어그램(ERD)을 작성합니다. (DBMS 독립적)
- 논리적 설계: 개념적 모델을 특정 DBMS(MySQL, Oracle 등)가 지원하는 논리적 데이터 모델(예: 관계형 모델)로 변환(Mapping)하고 정규화를 수행합니다.
- 물리적 설계: 논리적 모델을 실제 하드웨어에 저장하기 위한 물리적 구조(테이블, 인덱스, 파티션 등)를 설계합니다. 성능과 저장 공간을 고려합니다.
- 구현: 설계된 내용을 바탕으로 SQL(DDL)을 작성하여 실제 DBMS에 데이터베이스 스키마를 생성하고 애플리케이션을 개발합니다.
- 운영: 데이터베이스를 실제 업무에 적용하여 데이터를 저장하고 서비스를 제공합니다.
- 감시 및 개선: 데이터베이스 성능을 모니터링하고 문제점을 파악하여 튜닝하거나 구조를 개선합니다.
14. 데이터 모델링 과정
1. 개념적 모델링 (Conceptual Modeling)
- 현실 세계의 업무 요건에서 핵심적인 개념(개체)과 그들 간의 관계를 추출하여 추상적인 형태로 표현하는 과정입니다.
- 결과물로 ER 다이어그램(Entity-Relationship Diagram)이 생성됩니다. 이는 시스템의 뼈대를 만드는 작업과 같습니다.
2. 논리적 모델링 (Logical Modeling)
- 개념적 모델링의 결과물(ERD)을 선정된 DBMS의 스키마에 맞게 변환하는 과정입니다.
- 주요 작업: 개체를 테이블로 변환, 속성을 컬럼으로 정의, 식별자를 기본키로 지정, 관계를 외래키로 표현, 정규화를 통한 중복 제거 등이 수행됩니다. 데이터 표준화(용어 사전, 도메인 정의)도 이 단계에서 이루어집니다.
3. 물리적 모델링 (Physical Modeling)
- 논리적 데이터 모델을 실제 물리적인 저장 장치에 저장하기 위한 구조를 정의하는 과정입니다.
- 주요 작업: 데이터 타입 및 크기 결정, 인덱스 설계, 파티셔닝, 클러스터링 등 성능 향상을 위한 최적화 작업이 수행됩니다.
CREATE TABLE문으로 구현됩니다.
15. ER 모델 (Entity-Relationship Model)
1. ER 모델이란?
- 1976년 피터 첸(Peter Chen)이 제안한 모델로, 현실 세계를 개체(Entity), 속성(Attribute), 관계(Relationship)라는 세 가지 기본 요소로 추상화하여 표현하는 데이터 모델링 기법입니다.
- 이를 그림으로 도식화한 것이 ER 다이어그램(ERD)이며, 데이터베이스 설계의 청사진 역할을 합니다.
2. 주요 용어
- 개체(Entity): 현실 세계에서 독립적으로 존재하는 식별 가능한 대상입니다. (예: 학생, 교수, 과목)
- 속성(Attribute): 개체가 가지고 있는 고유한 특성이나 성질입니다. (예: 학생의 학번, 이름, 전공)
- 관계(Relationship): 개체와 개체 사이의 연관성이나 상호작용입니다. (예: 학생이 과목을 '수강한다')
- 카디널리티(Cardinality): 관계에 참여하는 개체의 수적 대응 관계를 나타냅니다. (1:1, 1:N, N:M 등). 릴레이션의 튜플 수를 의미하는 카디널리티와는 다른 개념입니다.
16. 개체 (Entity)
1. 개체란?
- 사람, 장소, 사물, 사건, 개념 등 업무상 관리가 필요한 관심 대상입니다. 저장할 가치가 있는 중요 데이터를 의미합니다.
- 개체 타입(Entity Type): 개체들이 공유하는 공통된 속성과 특징을 정의한 틀(Schema)입니다. (예: '학생'이라는 틀)
- 개체 집합(Entity Set): 특정 시점에 데이터베이스에 저장된 실제 개체(Instance)들의 모임입니다. (예: '홍길동', '이순신' 등 실제 학생 데이터들의 집합)
2. 개체의 특징
- 식별성: 각 개체는 다른 개체와 구별되는 유일한 식별자(Identifier)를 가져야 합니다.
- 영속성: 시스템 내에서 지속적으로 존재하는 데이터여야 합니다.
- 속성 보유: 반드시 하나 이상의 속성을 포함해야 합니다.
- 관계 형성: 다른 개체와 최소 하나 이상의 관계를 맺어야 합니다. (단독으로 존재하는 개체는 드뭅니다.)
3. 강한 개체와 약한 개체
- 강한 개체(Strong Entity): 자신의 속성만으로 독립적으로 존재할 수 있고 식별 가능한 개체입니다. ERD에서 직사각형으로 표현됩니다. (예: 직원)
- 약한 개체(Weak Entity): 자신의 속성만으로는 식별이 불가능하여 다른 개체(강한 개체)에 의존해야만 존재할 수 있는 개체입니다. 강한 개체의 키를 포함해야 식별이 가능합니다. ERD에서 이중 직사각형으로 표현됩니다. (예: 직원의 '부양가족' - 직원이 없으면 부양가족 정보는 의미가 없음)
17. 속성 (Attribute)
1. 속성이란?
- 개체의 특성이나 상태를 기술하는 정보의 최소 단위입니다. (예: 도서 개체의 '도서명', '저자', '가격', '출판사')
2. 속성 유형
- 단순 vs 복합 속성:
- 단순 속성 (Simple Attribute): 더 이상 작은 의미 단위로 쪼갤 수 없는 속성입니다. (예: 나이, 성별)
- 복합 속성 (Composite Attribute): 여러 개의 단순 속성으로 분해할 수 있는 속성입니다. (예: 주소 -> 시, 구, 동, 번지)
- 단일값 vs 다중값 속성:
- 단일값 속성 (Single-valued Attribute): 하나의 개체에 대해 하나의 값만 가지는 속성입니다. (예: 주민번호, 학번)
- 다중값 속성 (Multi-valued Attribute): 하나의 개체에 대해 여러 개의 값을 가질 수 있는 속성입니다. ERD에서 이중 타원으로 표현됩니다. (예: 취미, 전화번호 - 집전화, 휴대전화 등)
- 저장 vs 유도 속성:
- 저장 속성 (Stored Attribute): 데이터베이스에 실제로 값이 저장되는 속성입니다. (예: 생년월일)
- 유도 속성 (Derived Attribute): 다른 속성(저장 속성)의 값으로부터 계산되거나 유도되어 얻어지는 속성입니다. 실제 값을 저장하지 않을 수도 있습니다. ERD에서 점선 타원으로 표현됩니다. (예: 나이 - 현재 날짜와 생년월일로 계산 가능)
18. 관계와 관계 타입
1. 관계(Relationship) 정의
- 개체와 개체 사이의 의미 있는 연관성입니다. 업무 프로세스나 규정에 의해 발생합니다. (예: 고객이 도서를 '구매한다', 부서에 사원이 '소속된다')
- 차수(Degree): 관계에 참여하는 개체 타입의 개수입니다.
- 1진 관계 (Recursive): 하나의 개체 타입이 자기 자신과 관계를 맺는 형태입니다. (예: 사원 간의 관리자-부하직원 관계)
- 2진 관계 (Binary): 두 개의 개체 타입이 관계를 맺는 가장 일반적인 형태입니다. (예: 학생-학과)
- 3진 관계 (Ternary): 세 개의 개체 타입이 관계를 맺는 형태입니다. (예: 공급자-부품-프로젝트)
2. 관계 대응 수 (Cardinality)
- 두 개체 타입 간의 관계에서 참여하는 개체(Instance)의 수적 비율입니다.
- 1:1 (일대일): A 개체 하나가 B 개체 하나와 연결됩니다. (예: 사원 - 사원증)
- 1:N (일대다): A 개체 하나가 B 개체 여러 개와 연결됩니다. (예: 부서 - 사원)
- N:M (다대다): A 개체 여러 개가 B 개체 여러 개와 연결됩니다. (예: 학생 - 과목, 고객 - 도서)
- (최소, 최대) 표기: 관계선 위에
(min, max)형태로 참여 제약을 상세하게 표기합니다.min: 관계에 참여하는 최소 개체 수 (0이면 선택적 참여, 1이면 필수적 참여)max: 관계에 참여하는 최대 개체 수 (1 또는 N)
3. ISA 관계 (상속)
- 상위 개체(슈퍼클래스)와 하위 개체(서브클래스) 간의 계층적인 상속 관계를 나타냅니다.
- "A is a B" (A는 B의 일종이다) 관계가 성립합니다. 하위 개체는 상위 개체의 모든 속성과 관계를 상속받습니다. (예: '학생'은 '사람'이다. '교수'는 '사람'이다.)
- ERD에서 역삼각형 기호로 표현됩니다.
4. 참여 제약조건
- 개체가 관계에 필수적으로 참여해야 하는지, 선택적으로 참여해도 되는지를 나타냅니다.
- 전체 참여 (Total Participation): 개체 집합의 모든 개체가 반드시 관계에 참여해야 합니다. ERD에서 두 줄 실선으로 표현됩니다. (예: 모든 '수강신청'은 반드시 '학생'이 있어야 함)
- 부분 참여 (Partial Participation): 개체 집합의 일부 개체만 관계에 참여해도 됩니다. ERD에서 단일 실선으로 표현됩니다. (예: '학생' 중 일부만 '휴학'을 신청함)
19. 개체 타입과 식별자
1. 강한 개체와 약한 개체의 식별
- 강한 개체: 자신의 속성만으로 개체들을 고유하게 식별할 수 있는 기본키(Primary Key)를 가집니다.
- 약한 개체: 자신의 속성만으로는 고유하게 식별할 수 없습니다. 자신을 소유하는 강한 개체(오너 개체)의 기본키(외래키로 가져옴)와 자신의 식별 가능한 속성인 부분키(Partial Key, Discriminator)를 결합하여 식별자를 구성합니다.
20. IE 표기법 (새발 표기법)
1. IE 표기법이란?
- 정보 공학(Information Engineering)에서 사용하는 데이터 모델링 표기법으로, 관계의 카디널리티(1:1, 1:N)와 참여 제약조건(필수, 선택)을 직관적으로 표현합니다.
- 관계선의 끝 모양이 새의 발(Crow's Foot)을 닮았다고 하여 '새발 표기법'이라고도 불립니다. 가장 널리 쓰이는 ERD 표기법 중 하나입니다.
2. 주요 기호 의미
- O (Circle): 선택 참여 (Optional)를 의미합니다. 관계의 최소 참여 수(min)가 0입니다. (관계가 없어도 됨)
- | (Bar): 필수 참여 (Mandatory)를 의미합니다. 관계의 최소 참여 수(min)가 1입니다. (반드시 하나 이상 관계가 있어야 함)
- 새발 (Crow's Foot, <-): 다수(Many) 참여를 의미합니다. 관계의 최대 참여 수(max)가 N입니다. (여러 개와 연결 가능)
- 실선: 식별자 관계를 의미합니다. 부모 개체의 기본키를 자식 개체의 기본키(PK)의 일부로 상속받는 경우입니다. (강한 연결)
- 점선: 비식별자 관계를 의미합니다. 부모 개체의 기본키를 자식 개체의 일반 속성(외래키, FK)으로만 상속받는 경우입니다. (약한 연결)
erDiagram
CUSTOMER ||--o{ ORDERS : places
BOOK ||--o{ ORDERS : includes
21. ER 모델 -> 관계 데이터 모델 매핑
1. 매핑(Mapping)의 필요성
- 개념적 설계 단계의 산출물인 ER 모델(ERD)은 DBMS가 직접 이해할 수 없습니다. 따라서 구축하고자 하는 DBMS(MySQL 등)가 지원하는 논리적 데이터 모델인 관계 데이터 모델(테이블 스키마)로 변환하는 과정이 필요합니다.
2. 매핑 절차 (7단계)
- STEP 1. 개체 타입 매핑:
- 강한 개체는 독립적인 테이블로 생성하고, 기본키를 설정합니다.
- 약한 개체는 테이블로 생성하되, 상위 개체의 기본키를 외래키로 가져와 자신의 부분키와 함께 복합 기본키로 설정합니다.
- STEP 2. 관계 타입 매핑:
- 1:1 관계: 한쪽 테이블에 상대방 테이블의 기본키를 외래키로 추가합니다. 보통 필수적으로 참여하는 쪽이나 사용 빈도가 높은 쪽에 외래키를 둡니다.
- 1:N 관계: N측(다수) 테이블에 1측(단수) 테이블의 기본키를 외래키로 추가합니다. (가장 일반적인 형태)
- N:M 관계: 별도의 교차 테이블(Mapping Table, Junction Table)을 생성합니다. 양쪽 개체의 기본키를 가져와 복합 기본키로 설정하고, 각각 외래키로 지정합니다.
- N진 관계: N:M 관계와 마찬가지로 교차 테이블을 생성하여 각 개체의 기본키를 포함시킵니다.
- STEP 3. 속성 매핑:
- 다중값 속성: 별도의 테이블로 분리하여 관리합니다. 원본 개체의 기본키를 외래키로 가져오고, 다중값 속성 자체를 포함하여 복합키를 구성하거나 별도의 ID를 부여합니다.
22. 이상현상 (Anomaly)
1. 이상현상이란
- 데이터베이스 설계가 잘못되어 데이터 중복이 발생하고, 이로 인해 데이터 조작(삽입, 삭제, 수정) 시 논리적인 오류나 일관성이 깨지는 현상입니다.
- 주요 유형:
- 삽입 이상 (Insertion Anomaly): 데이터를 삽입할 때 불필요한 데이터까지 함께 입력해야 하거나, 필수적인 데이터가 부족하여(예: 기본키) 삽입이 불가능한 현상입니다. 또는 의도치 않게 NULL 값을 입력해야 하는 경우입니다.
- 삭제 이상 (Deletion Anomaly): 어떤 정보를 삭제할 때, 그 정보와 연관된 의도하지 않은 다른 유용한 정보까지 함께 삭제되어 데이터 손실이 발생하는 현상입니다. (연쇄 삭제)
- 수정 이상 (Modification Anomaly): 중복된 데이터 중 일부만 수정되어 데이터 간의 불일치(Inconsistency)가 발생하는 현상입니다.
23. 함수 종속성 (Functional Dependency)
1. 정규화와 함수 종속성
- 정규화(Normalization): 이상현상이 있는 테이블을 분해하여 데이터 중복을 최소화하고 무결성을 유지할 수 있도록 구조를 재구성하는 과정입니다.
- 함수 종속성(FD): 정규화를 수행하기 위한 이론적 도구로, 테이블 내 속성들 간의 연관 관계를 정의합니다. 한 속성의 값이 다른 속성의 값을 유일하게 결정하는 관계를 말합니다.
2. 함수 종속성 (A -> B)
- 어떤 릴레이션 내에서 속성 A의 값 각각에 대해 속성 B의 값이 오직 하나만 연관되어 있을 때, "B는 A에 함수적으로 종속된다"라고 하며
A -> B로 표기합니다. - A: 결정자 (Determinant): 다른 속성을 결정하는 속성입니다.
- B: 종속자 (Dependent): 결정자에 의해 값이 결정되는 속성입니다.
- 예:
학번 -> 이름(학번을 알면 그 학생의 이름은 오직 하나로 결정됩니다.)
3. 함수 종속성 규칙 (암스트롱의 공리)
- 함수 종속성을 추론하기 위한 기본 규칙입니다.
- 부분집합 규칙 (Reflexivity): Y가 X의 부분집합이면, X -> Y입니다.
- 증가 규칙 (Augmentation): X -> Y이면, XZ -> YZ입니다. (양쪽에 같은 속성을 추가해도 종속성 유지)
- 이행 규칙 (Transitivity): X -> Y이고 Y -> Z이면, X -> Z입니다. (꼬리에 꼬리를 무는 종속)
4. 기본키와 결정자
- 기본키(PK): 릴레이션 내의 모든 속성을 고유하게 결정할 수 있는 속성(또는 속성 집합)입니다. 즉, 기본키는 릴레이션 전체의 결정자입니다.
- 이상현상의 원인: 기본키가 아니면서 다른 속성을 결정하는 비후보키 결정자가 존재할 때 주로 발생합니다. 정규화는 이러한 비후보키 결정자를 없애는 과정입니다.
24. 정규화 (Normalization)
1. 정규형 (Normal Form)
- 이상현상을 일으키는 함수 종속성의 유형을 제거하는 단계별 기준입니다. 정규형의 단계가 높아질수록 데이터 중복이 줄어들고 이상현상이 감소합니다. (1NF < 2NF < 3NF < BCNF ...)
2. 제1 정규형 (1NF)
- 릴레이션의 모든 속성값이 더 이상 분해할 수 없는 원자값(Atomic Value)으로만 구성되어야 합니다.
- 하나의 칸(컬럼)에 여러 개의 값이 들어가거나 반복되는 그룹이 있으면 안 됩니다.
3. 제2 정규형 (2NF)
- 1NF를 만족하면서, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되어야 합니다.
- 부분 함수 종속 제거: 기본키가 복합키(두 개 이상의 속성으로 구성)일 때, 기본키의 일부 속성에만 종속되는 속성이 있다면 이를 별도의 테이블로 분리해야 합니다.
4. 제3 정규형 (3NF)
- 2NF를 만족하면서, 기본키가 아닌 속성이 기본키에 이행적 종속되지 않아야 합니다.
- 이행적 종속 제거:
A -> B,B -> C와 같이 속성 간에 꼬리를 무는 종속 관계가 있다면(A -> C), 이를 분리하여 별도 테이블로 만듭니다. (예: 사원번호 -> 부서번호 -> 부서명 인 경우, 부서 테이블 분리)
5. BCNF (Boyce-Codd Normal Form)
- 3NF를 만족하면서, 모든 결정자가 후보키여야 한다는 강력한 조건입니다.
- 기본키가 아니면서 다른 속성을 결정하는 결정자가 존재하면, 이를 분리해야 합니다. (3NF보다 엄격한 제약)
25. 무손실 분해
1. 무손실 분해란?
- 정규화 과정에서 하나의 테이블을 두 개 이상의 테이블로 분해할 때, 분해된 테이블들을 다시 자연 조인(Natural Join)했을 때 원래의 테이블 데이터와 정보가 손실 없이 완벽하게 복원되어야 한다는 원칙입니다.
- 조건: 분해된 두 릴레이션의 공통 속성(교집합)이 분해된 릴레이션 중 적어도 하나의 키(Key) 역할을 해야 합니다. 그렇지 않으면 조인 시 가짜 튜플(Spurious Tuple)이 생성되어 정보가 왜곡될 수 있습니다.
26. 트랜잭션 (Transaction)
1. 트랜잭션이란?
- 데이터베이스 상태를 변화시키는 하나의 논리적인 작업 기능을 수행하기 위한 작업의 단위입니다.
- 여러 개의 SQL 연산들이 모여 하나의 트랜잭션을 구성하며, 이들은 모두 처리되거나 하나도 처리되지 않아야 합니다.
- 예: 계좌 이체 (A계좌 출금 + B계좌 입금 = 하나의 트랜잭션)
2. 트랜잭션의 4가지 성질 (ACID)
- 원자성 (Atomicity): 트랜잭션 내의 모든 연산은 반드시 모두 수행되어야 하며, 하나라도 실패하면 모두 취소되어야 합니다. (All or Nothing)
- 일관성 (Consistency): 트랜잭션이 성공적으로 완료되면 데이터베이스는 언제나 일관성 있는 상태를 유지해야 합니다. (예: 계좌 이체 전후 총액은 변함없어야 함)
- 고립성 (Isolation): 둘 이상의 트랜잭션이 동시에 실행될 때, 서로의 연산에 끼어들거나 영향을 주어서는 안 됩니다. 수행 중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션으로부터 격리되어야 합니다.
- 지속성 (Durability): 성공적으로 완료(Commit)된 트랜잭션의 결과는 시스템 장애가 발생하더라도 영구적으로 데이터베이스에 반영되어야 합니다.
3. 트랜잭션 제어 언어 (TCL)
- START TRANSACTION / BEGIN: 트랜잭션의 시작을 알립니다.
- COMMIT: 트랜잭션의 모든 작업이 성공적으로 완료되었음을 선언하고, 변경 내용을 데이터베이스에 영구적으로 저장합니다.
- ROLLBACK: 트랜잭션 수행 중 오류가 발생하거나 작업을 취소할 때, 변경 내용을 모두 무효화하고 트랜잭션 시작 전 상태로 되돌립니다.
- SAVEPOINT: 트랜잭션 내에 특정 저장점을 표시하여, 필요시 해당 지점까지만 롤백할 수 있도록 합니다.
4. 커밋이란
- 트랜잭션의 작업이 성공적으로 끝났고, 데이터베이스가 일관된 상태에 있음을 확정하는 명령어입니다. 커밋이 수행되면 변경된 데이터는 다른 사용자가 볼 수 있게 됩니다.
27. 동시성 제어 (Concurrency Control)
1. 동시성 제어란?
- 다중 사용자 환경에서 여러 트랜잭션이 동시에 실행될 때, 데이터의 무결성과 일관성을 해치지 않도록 트랜잭션 간의 상호작용을 제어하는 기술입니다. 트랜잭션들이 순차적으로 실행되는 것과 같은 결과를 보장합니다.
2. 동시 실행 시 문제점
- 갱신 손실 (Lost Update): 두 개의 트랜잭션이 같은 데이터를 동시에 수정할 때, 나중에 실행된 트랜잭션이 먼저 실행된 트랜잭션의 수정 내용을 덮어써서 데이터가 손실되는 현상입니다.
- 오손 읽기 (Dirty Read): 다른 트랜잭션이 수정 중이고 아직 커밋하지 않은 데이터를 읽는 현상입니다. 만약 수정 중인 트랜잭션이 롤백되면 잘못된 데이터를 읽은 것이 됩니다.
- 비반복 읽기 (Non-Repeatable Read): 한 트랜잭션 내에서 같은 데이터를 두 번 읽었는데, 그 사이에 다른 트랜잭션이 값을 수정하거나 삭제하여 두 번의 조회 결과가 다르게 나타나는 현상입니다.
- 팬텀 읽기 (Phantom Read): 한 트랜잭션 내에서 범위 조회를 두 번 수행했는데, 그 사이에 다른 트랜잭션이 새로운 데이터를 삽입하여 이전에 없던 데이터(유령)가 나타나는 현상입니다.
3. 락 (Lock)
- 데이터에 대한 동시 접근을 제어하기 위해 데이터(행, 테이블 등)에 잠금 장치를 설정하는 기법입니다.
- 공유락 (Shared Lock, S-Lock): 데이터를 읽을 때 사용합니다. 다른 트랜잭션도 공유락을 걸고 읽을 수는 있지만, 수정(배타락)은 불가능합니다. (읽기 O, 쓰기 X)
- 배타락 (Exclusive Lock, X-Lock): 데이터를 수정할 때 사용합니다. 락을 건 트랜잭션만 읽고 쓸 수 있으며, 다른 트랜잭션은 읽기(공유락)나 쓰기(배타락) 모두 불가능합니다. (읽기 X, 쓰기 X)
4. 2단계 락킹 (2PL, Two-Phase Locking)
- 트랜잭션이 락을 거는 단계와 푸는 단계를 엄격히 구분하여 직렬성을 보장하는 규약입니다.
- 확장 단계 (Growing Phase): 트랜잭션이 필요한 모든 락을 획득하는 단계입니다. 이 단계에서는 락을 해제할 수 없습니다.
- 축소 단계 (Shrinking Phase): 사용이 끝난 락을 해제하는 단계입니다. 이 단계에서는 새로운 락을 획득할 수 없습니다.
- 데드락 (Deadlock): 2PL을 사용하더라도 두 트랜잭션이 서로 상대방이 점유하고 있는 자원의 락 해제를 무한히 기다리는 교착 상태가 발생할 수 있습니다.
28. 트랜잭션 격리 수준
1. 격리 수준 (Isolation Level)
- 동시에 실행되는 트랜잭션 간에 서로 얼마나 영향을 미치게 할 것인지를 설정하는 단계입니다. 격리 수준이 높을수록 데이터 일관성은 높아지지만 동시성(성능)은 떨어집니다.
2. 4가지 수준
- READ UNCOMMITTED (LV0): 가장 낮은 격리 수준으로, 다른 트랜잭션이 커밋하지 않은 데이터도 읽을 수 있습니다. (Dirty Read, Non-Repeatable Read, Phantom Read 모두 발생 가능)
- READ COMMITTED (LV1): 다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다. Dirty Read는 방지되지만, Non-Repeatable Read와 Phantom Read는 발생할 수 있습니다. (오라클 등 많은 DBMS의 기본값)
- REPEATABLE READ (LV2): 트랜잭션이 시작된 시점의 데이터를 기준으로 읽어오므로, 트랜잭션 내에서 같은 데이터를 반복 조회해도 항상 같은 결과가 나옵니다. Non-Repeatable Read는 방지되지만, Phantom Read는 발생할 수 있습니다. (MySQL InnoDB의 기본값)
- SERIALIZABLE (LV3): 가장 높은 격리 수준으로, 트랜잭션을 순차적으로 실행하는 것처럼 완벽하게 격리합니다. 읽기 작업에도 공유락을 걸어 다른 트랜잭션의 수정을 막습니다. Phantom Read까지 방지되지만 동시성이 매우 낮아집니다.
29. 회복 (Recovery)
1. 회복이란
- 시스템 장애, 디스크 고장 등 예기치 않은 오류가 발생했을 때, 데이터베이스를 장애 발생 이전의 일관된 상태로 복구하는 기능입니다. 트랜잭션의 원자성과 지속성을 보장하기 위해 필수적입니다.
- 로그 파일: 트랜잭션이 수행한 모든 변경 연산(삽입, 삭제, 수정)의 기록(History)을 저장하는 파일입니다. 회복의 핵심 데이터입니다. (이전 값, 새로운 값 등을 기록)
2. 로그 기반 회복 기법
- REDO (재실행): 장애 발생 시, 로그 파일에 기록된 내용을 바탕으로 트랜잭션의 연산을 순서대로 다시 수행하여 데이터를 복구하는 작업입니다. (지속성 보장)
- UNDO (취소): 장애 발생 시, 완료되지 않은 트랜잭션이 수행한 변경 내용을 로그를 이용하여 취소하고 원래 상태로 되돌리는 작업입니다. (원자성 보장)
- 즉시 갱신 (Immediate Update): 트랜잭션 수행 도중에 데이터 변경 내용을 즉시 데이터베이스에 반영합니다. 장애 발생 시 완료된 트랜잭션은 REDO, 미완료 트랜잭션은 UNDO가 필요합니다.
- 지연 갱신 (Deferred Update): 트랜잭션이 부분 완료(Commit 요청)될 때까지 데이터베이스 반영을 미루고 로그에만 기록합니다. 커밋 시점에 일괄 반영합니다. 장애 발생 시 미완료 트랜잭션은 DB에 반영되지 않았으므로 UNDO가 필요 없고, 완료된 트랜잭션은 REDO만 수행합니다.
3. 체크포인트 (Checkpoint)
- 로그 파일이 무한정 커지는 것을 막고 회복 시간을 단축하기 위한 기법입니다.
- 주기적으로 주기억장치(버퍼)에 있는 변경 내용을 디스크(DB)에 강제로 기록하고, 로그 파일에 체크포인트 시점을 표시합니다.
- 장애 발생 시 회복 관리자는 가장 최근의 체크포인트 이후의 로그 기록만 검사하여 REDO/UNDO를 수행하면 되므로 복구 속도가 빨라집니다.