OLTP System
ACID, 정규화, 트랜잭션 특성, OLTP vs OLAP 비교
📚 시리즈 네비게이션
→ 시리즈 목차
🎯 OLTP란?
OLTP (Online Transaction Processing): 실시간으로 트랜잭션을 처리하는 운영계 시스템
핵심 특징:
- 실시간 데이터 입력/수정/삭제
- 짧고 빠른 트랜잭션
- 동시 사용자 많음
- 현재 상태 데이터 중심
📊 OLTP 특징
트랜잭션 특성
| 특성 | 설명 |
|---|---|
| 빈번함 | 초당 수천~수만 건 |
| 단순함 | 소량 데이터 조회/변경 |
| 빠름 | 밀리초 단위 응답 |
| 동시성 | 수천~수만 동시 사용자 |
ACID 속성
OLTP 시스템은 ACID를 보장해야 함.
| 속성 | 의미 | 설명 |
|---|---|---|
| A | Atomicity (원자성) | 트랜잭션은 전부 성공하거나 전부 실패 |
| C | Consistency (일관성) | 트랜잭션 전후 데이터 무결성 유지 |
| I | Isolation (격리성) | 동시 트랜잭션 간 간섭 없음 |
| D | Durability (지속성) | 완료된 트랜잭션은 영구 저장 |
-- 계좌 이체 예시 (원자성)
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100000 WHERE id = 'A';
UPDATE accounts SET balance = balance + 100000 WHERE id = 'B';
COMMIT;
-- 둘 다 성공하거나 둘 다 실패 (부분 성공 없음)🗄️ 데이터 모델링
정규화 (Normalization)
OLTP는 높은 수준의 정규화를 사용함.
이유:
- 데이터 중복 최소화
- 갱신 이상(Anomaly) 방지
- 데이터 무결성 유지
정규화 단계:
| 단계 | 설명 |
|---|---|
| 1NF | 원자값, 반복 그룹 제거 |
| 2NF | 부분 함수 종속 제거 |
| 3NF | 이행 함수 종속 제거 |
| BCNF | 모든 결정자가 후보키 |
flowchart TB subgraph Before["정규화 전 (비정규화)"] BT["주문ID | 고객명 | 고객주소 | 상품명 | 상품가격 | 수량"] end subgraph After["정규화 후 (3NF)"] Customer["고객<br/>고객ID (PK)<br/>고객명<br/>고객주소"] Order["주문<br/>주문ID (PK)<br/>고객ID (FK)<br/>상품ID (FK)<br/>수량"] Product["상품<br/>상품ID (PK)<br/>상품명<br/>상품가격"] Customer --> Order Product --> Order end Before --> After
🆚 OLTP vs OLAP 비교
| 구분 | OLTP | OLAP (DW) |
|---|---|---|
| 목적 | 업무 처리 | 분석/의사결정 |
| 쿼리 | 단순, INSERT/UPDATE | 복잡, SELECT/집계 |
| 데이터 | 현재 상태 | 히스토리 |
| 정규화 | 높음 (3NF) | 낮음 (비정규화) |
| 응답 시간 | 밀리초 | 초~분 |
| 사용자 | 현업 직원 | 분석가, 경영진 |
| 동시 사용자 | 수천~수만 | 수십~수백 |
🛠️ 주요 OLTP 시스템
상용 RDBMS
| 제품 | 벤더 | 특징 |
|---|---|---|
| Oracle Database | Oracle | 엔터프라이즈 시장 1위, 기능 풍부 |
| Microsoft SQL Server | Microsoft | Windows 환경, BI 통합 |
| IBM Db2 | IBM | 메인프레임, 대기업 |
오픈소스 RDBMS
| 제품 | 특징 |
|---|---|
| MySQL | 웹 서비스에서 가장 많이 사용 |
| PostgreSQL | 기능 풍부, Oracle 대안 |
| MariaDB | MySQL 포크, 호환성 |
업무 시스템 예시
| 시스템 | 설명 |
|---|---|
| ERP | 전사자원관리 (SAP, Oracle ERP) |
| CRM | 고객관계관리 (Salesforce) |
| SCM | 공급망관리 |
| MES | 생산관리시스템 |
| 주문/결제 | 이커머스, POS |
| 뱅킹 코어 | 계정계, 수신/여신 |
⚙️ 성능 최적화
인덱스 (Index)
데이터 검색 속도 향상을 위한 자료구조임.
-- 인덱스 생성
CREATE INDEX idx_customer_name ON customers(name);
-- 복합 인덱스
CREATE INDEX idx_order_date_customer ON orders(order_date, customer_id);| 인덱스 종류 | 설명 |
|---|---|
| B-Tree | 기본, 범위 검색에 적합 |
| Hash | 동등 비교에 빠름 |
| Bitmap | 카디널리티 낮은 컬럼 |
| Full-text | 텍스트 검색 |
커넥션 풀 (Connection Pool)
DB 연결을 미리 만들어두고 재사용함.
flowchart LR App["Application"] Pool["Connection Pool<br/>[conn1][conn2]..."] DB["Database"] App --> Pool --> DB
파티셔닝 (Partitioning)
대용량 테이블을 물리적으로 분할함.
| 방식 | 설명 | 예시 |
|---|---|---|
| Range | 범위 기준 | 날짜별 |
| List | 목록 기준 | 지역별 |
| Hash | 해시 기준 | 균등 분산 |
🔄 OLTP → DW 연계
OLTP 데이터는 ETL을 통해 DW로 이동함.
flowchart LR subgraph OLTP["OLTP (운영계)"] O1["주문 DB"] O2["고객 DB"] O3["상품 DB"] end ETL["ETL<br/>추출 → 변환 → 적재"] subgraph DW["DW (분석계)"] D1["매출 분석"] D2["고객 분석"] D3["리포트"] end OLTP -->|실시간 처리<br/>INSERT/UPDATE| ETL -->|배치 분석<br/>SELECT/집계| DW