정보처리기사 데이터베이스는 필기 3과목과 실기 모두에서 가장 많은 점수가 걸린 영역입니다. SQL은 별도로 다룬 글이 있으니 이번엔 SQL 외의 이론 부분을 집중적으로 정리합니다. 정규화 단계, 트랜잭션 ACID 속성, 트랜잭션 격리 수준, 인덱스 종류, 그리고 관계 대수까지 실기에서 서술형으로 물어보는 핵심 개념들입니다.
1. 정규화 (1NF ~ BCNF)
정규화는 데이터 중복을 줄이고 이상 현상을 없애기 위해 릴레이션을 분해하는 과정입니다. 실기에서 "이 릴레이션은 몇 정규형인가?"처럼 단계를 판별하거나 "BCNF를 만족하도록 분해하시오" 같은 문제가 나옵니다.
| 정규형 | 조건 | 제거되는 문제 |
|---|---|---|
| 비정규형 | 반복 그룹(다중값 속성) 존재 | - |
| 1NF | 모든 속성 값이 원자값(더 이상 분해 불가). 반복 그룹 없음 | 반복 그룹 제거 |
| 2NF | 1NF + 기본키가 아닌 속성들이 기본키 전체에 완전 함수 종속 | 부분 함수 종속 제거 |
| 3NF | 2NF + 기본키가 아닌 속성들 사이에 이행 함수 종속이 없음 | 이행 함수 종속 제거 |
| BCNF | 3NF + 모든 결정자가 후보키 | 결정자이면서 후보키가 아닌 것 제거 |
정규화 예시로 이해하기
주문 정보를 담은 다음 테이블을 정규화해 봅시다.
✔ 부분 함수 종속: 복합 기본키에서 일부 키에만 종속 → 2NF로 해결
✔ 이행 함수 종속: A→B, B→C인데 A→C → 3NF로 해결
✔ BCNF: 3NF를 만족하지만 결정자가 후보키가 아닌 경우까지 해결
✔ 4NF, 5NF는 시험에 거의 나오지 않음. 주로 1NF~BCNF 집중
2. 이상 현상
정규화가 되지 않은 테이블에서 발생하는 데이터 관리 문제입니다. 3가지 이상 현상의 이름과 예시를 정확히 알아야 합니다.
| 이상 현상 | 설명 | 예시 |
|---|---|---|
| 삽입 이상 | 원하는 데이터를 삽입하려면 원하지 않는 데이터도 함께 삽입해야 하는 현상 | 주문 없이 고객만 등록할 수 없는 경우 |
| 삭제 이상 | 필요한 데이터를 삭제하려면 다른 데이터도 함께 삭제되는 현상 | 마지막 주문 삭제 시 고객 정보도 사라지는 경우 |
| 갱신 이상 | 중복된 데이터 일부만 변경하면 데이터 불일치가 발생하는 현상 | 고객 주소가 여러 행에 중복 저장되어 일부만 업데이트되는 경우 |
3. 트랜잭션과 ACID
트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 작업 단위입니다. 여러 연산을 하나로 묶어서 모두 성공하거나 모두 실패해야 합니다.
| 속성 | 영문 | 설명 |
|---|---|---|
| 원자성 | Atomicity | 트랜잭션 내 모든 연산은 전부 실행되거나 전혀 실행되지 않아야 함. 중간 상태 없음 |
| 일관성 | Consistency | 트랜잭션 완료 후에도 데이터베이스의 무결성 제약이 유지되어야 함 |
| 고립성 | Isolation | 동시에 실행되는 트랜잭션들은 서로에게 영향을 주지 않아야 함 |
| 지속성 | Durability | 커밋된 트랜잭션의 결과는 장애가 발생해도 영구적으로 보존되어야 함 |
트랜잭션 상태
| 상태 | 설명 |
|---|---|
| 활동(Active) | 트랜잭션 실행 중인 상태 |
| 부분 완료(Partially Committed) | 마지막 연산까지 실행했지만 아직 커밋 안 된 상태 |
| 완료(Committed) | 트랜잭션이 성공적으로 완료되어 커밋된 상태 |
| 실패(Failed) | 오류로 인해 트랜잭션 실행이 중단된 상태 |
| 중단(Aborted) | 롤백 완료 후 트랜잭션 이전 상태로 복구된 상태 |
4. 트랜잭션 격리 수준
여러 트랜잭션이 동시에 실행될 때 발생하는 문제를 어느 수준까지 허용할지 정하는 설정입니다. 격리 수준이 높을수록 안전하지만 성능이 낮아집니다.
| 격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
|---|---|---|---|
| READ UNCOMMITTED | 발생 | 발생 | 발생 |
| READ COMMITTED | 방지 | 발생 | 발생 |
| REPEATABLE READ | 방지 | 방지 | 발생 |
| SERIALIZABLE | 방지 | 방지 | 방지 |
• Dirty Read: 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽음
• Non-Repeatable Read: 같은 쿼리를 두 번 실행했는데 다른 값이 나옴 (행 수정)
• Phantom Read: 같은 쿼리를 두 번 실행했는데 없던 행이 생기거나 사라짐 (행 삽입·삭제)
5. 인덱스
데이터 검색 속도를 높이기 위해 별도로 생성하는 자료구조입니다. 책의 색인과 같은 역할입니다.
| 종류 | 설명 |
|---|---|
| 클러스터드 인덱스 | 테이블 데이터가 인덱스 순서에 따라 물리적으로 정렬됨. 테이블당 1개만 가능. 기본키에 자동 생성 |
| 비클러스터드 인덱스 | 인덱스는 별도 공간에 존재. 실제 데이터 순서와 무관. 여러 개 생성 가능 |
| 밀집 인덱스 | 모든 레코드에 대해 인덱스 항목 존재 |
| 희소 인덱스 | 일부 레코드(주로 블록 대표)에만 인덱스 항목 존재. 공간 절약 |
| 복합 인덱스 | 두 개 이상 컬럼을 묶어서 생성하는 인덱스 |
✔ 인덱스는 검색 성능↑, 삽입·수정·삭제 성능↓ (인덱스도 함께 수정해야 하므로)
✔ WHERE 절에 자주 사용되는 컬럼에 인덱스 생성 효과적
✔ 카디널리티가 높을수록(값의 종류가 많을수록) 인덱스 효과적
✔ B-트리 인덱스가 가장 일반적. 범위 검색에 유리
6. 관계 대수
관계형 데이터베이스에서 릴레이션을 조작하는 연산들입니다. 실기에서 연산자 기호와 의미를 묻는 문제가 나옵니다.
| 연산자 | 기호 | 설명 |
|---|---|---|
| 셀렉션(Selection) | σ (시그마) | 조건을 만족하는 행(튜플) 추출. SQL의 WHERE에 해당 |
| 프로젝션(Projection) | π (파이) | 특정 열(속성)만 추출. SQL의 SELECT 컬럼 지정에 해당 |
| 합집합(Union) | ∪ | 두 릴레이션의 튜플 합침. 중복 제거. 두 릴레이션 구조 같아야 함 |
| 차집합(Difference) | − | 한 릴레이션에만 있는 튜플 반환 |
| 교집합(Intersection) | ∩ | 두 릴레이션에 모두 있는 튜플 반환 |
| 카티션 곱(Cartesian Product) | × | 두 릴레이션의 모든 조합. 행 수 = n × m |
| 조인(Join) | ⋈ | 두 릴레이션을 공통 속성으로 연결. 카티션 곱 + 셀렉션 |
| 디비전(Division) | ÷ | 특정 릴레이션의 모든 값과 대응하는 튜플만 반환 |
7. 동시성 제어
여러 트랜잭션이 동시에 같은 데이터에 접근할 때 발생하는 문제를 막기 위한 기법입니다.
| 기법 | 설명 |
|---|---|
| 잠금(Locking) | 데이터에 잠금을 걸어 다른 트랜잭션의 동시 접근 차단. 공유 잠금(읽기), 배타 잠금(쓰기) |
| 2단계 잠금(2PL) | 잠금 확장 단계(취득만)와 잠금 수축 단계(해제만)로 나눔. 직렬성 보장. 교착상태 가능 |
| 타임스탬프 | 트랜잭션에 시작 시간을 부여해 충돌 시 오래된 트랜잭션을 롤백 |
| 낙관적 동시성 제어 | 충돌이 없다고 가정하고 진행 후 완료 시점에 충돌 검사. 충돌 시 롤백 |
| MVCC | 데이터의 여러 버전을 유지. 읽기 작업에 잠금 불필요. PostgreSQL, MySQL InnoDB에서 사용 |
• 로그 기반 회복: 변경 전·후 값을 로그에 기록. 장애 발생 시 Redo(재실행) 또는 Undo(취소)
• 체크포인트: 주기적으로 메모리 내용을 디스크에 저장. 회복 시 체크포인트 이후만 처리
• 그림자 페이지: 수정 전 페이지를 별도 보관. 장애 시 원본 복구
마무리
데이터베이스 이론은 SQL과 함께 실기에서 가장 중요한 영역입니다. 특히 정규화는 단계별 조건을 정확히 알고, 주어진 테이블이 어느 정규형인지 판별할 수 있어야 합니다. 트랜잭션 ACID와 격리 수준은 서술형으로 자주 나오니 각 용어의 정확한 설명을 써보는 연습을 반복하세요.