14주차 자료의 모든 토픽을 "데이터 타입 → HA/확장 → SQL 고급" 흐름으로 재배열한 학습 경로.
13주차가 DB 이론과 인덱스 였다면, 14주차는 DB 운영 측면 으로 확장.
- 데이터 타입과 인코딩 (CHAR/VARCHAR, BLOB/TEXT, Collation)
- 고가용성 (HA) (Clustering, Replication, PXC, Backup)
- 데이터 분할 (Sharding, Partitioning)
- SQL 고급 기능 (Trigger, JOIN, VIEW, PROCEDURE)
[Phase 1] 데이터 타입과 인코딩 (CHAR/VARCHAR, BLOB/TEXT, Collation)
↓
[Phase 2] DB Clustering — 고가용성의 시작
↓
[Phase 3] Replication과 백업 — Master-Slave + PXC
↓
[Phase 4] 데이터 분할 — Sharding과 Partitioning
↓
[Phase 5] DELETE/TRUNCATE/DROP과 ROLLBACK 메커니즘
↓
[Phase 6] SQL 고급 기능 — Trigger, JOIN, VIEW, PROCEDURE
총 6 Phase × 17 Unit — 단일 주차로 적정 분량.
| 주차 | 주제 | 핵심 변화 |
|---|---|---|
| 1주차 | OOP·JVM·GC·컬렉션·I/O 개론 | 자바 큰 그림 |
| 2주차 | JVM 내부·바이트코드·G1 GC | "어떻게 돌아가나" |
| 3주차 | 컬렉션·제네릭·함수형 | 자바 표현력 |
| 4주차 | 멀티스레딩·동시성·Executor | 동시성 정복 |
| 5주차 | Atomic + Spring IoC/DI 입문 | 자바 → Spring 다리 |
| 6주차 | 테스트 + 웹 인프라 + DB 접근 진화 | Spring 실전 환경 |
| 7주차 | JPA/ORM 입문 + 트랜잭션 추상화 | DB 추상화 입문 |
| 8주차 | 프록시의 진화 | AOP 메커니즘 |
| 9주차 | Spring AOP 실전 + 트랜잭션 전파 | AOP 실전 활용 |
| 10주차 | 트랜잭션 정리 + 빈 라이프사이클 + 격리 수준 | 트랜잭션 마무리 |
| 11주차 | JPA의 정체와 영속성 컨텍스트 | JPA 메커니즘 완전 이해 |
| 12주차 | 연관관계 + N+1 등 성능 최적화 | JPA 실전 활용 |
| 13주차 | DB 펀더멘털 - 모델링부터 인덱스까지 | DB 본연의 영역 (이론) |
| 14주차 (지금) | DB 운영 - 데이터 타입·HA·확장·SQL 고급 | DB 운영의 영역 |
13주차와 14주차의 관계:
| Day | Phase | 학습 목표 |
|---|---|---|
| 1일차 | Phase 1 | 데이터 타입과 Collation |
| 2일차 | Phase 2 + 3 | Clustering + Replication + PXC |
| 3일차 | Phase 4 | Sharding + Partitioning |
| 4일차 | Phase 5 + 6 (전반) | DELETE/TRUNCATE/DROP + Trigger + JOIN |
| 5일차 | Phase 6 (후반) + 종합 | VIEW + PROCEDURE + 자기 점검 |
여유 일정 (7일): Phase 2-3에 +1일 (HA는 그림이 필요함). Phase 6은 직접 쿼리 돌리며 학습 권장.
목표: SQL 컬럼 설계의 출발점인 데이터 타입 선택과 문자열 비교 규칙을 잡는다.
선수 지식: 6주차 Phase 6 (DB 기초)
핵심 비교 ⭐ :
| CHAR(n) | VARCHAR(n) | |
|---|---|---|
| 길이 | 고정 길이 | 가변 길이 |
| 짧은 데이터 저장 시 | 공백으로 채움 | 실제 길이만 |
| 속도 | 빠름 (특히 짧은 문자열) | 약간 느림 (길이 계산 필요) |
| 공간 효율 | 낮음 | 높음 |
예시:
-- CHAR(5)
INSERT INTO test VALUES ('Hi');
-- 저장: 'Hi ' (공백 3개 추가, 총 5바이트)
-- VARCHAR(5)
INSERT INTO test VALUES ('Hi');
-- 저장: 'Hi' (실제 2바이트만)
사용 가이드:
✅ CHAR 적합 — 길이가 일정한 데이터:
CHAR(2) ('US', 'KR')CHAR(1) ('M', 'F')CHAR(5)✅ VARCHAR 적합 — 길이 가변:
VARCHAR(50)VARCHAR(100)VARCHAR(255)ILIC 적용:
자기 점검
선수 지식: Unit 1.1
핵심 비교 ⭐ :
| BLOB | TEXT | |
|---|---|---|
| 데이터 종류 | 이진(Binary) | 문자(Text) |
| 사용 사례 | 이미지, 동영상, 파일 | 긴 글, 댓글, 설명 |
| 대소문자 | 구분(Case-Sensitive) | 구분 안 함(기본) |
| 비교 방식 | 바이트 단위 | Collation 규칙 |
| 인코딩 | 없음 (원본 그대로) | UTF-8/ASCII 등 |
| 문자열 함수 | 사용 X | LIKE/CONCAT 가능 |
예시:
BLOB:
CREATE TABLE files (
id INT,
image BLOB -- 이미지 바이너리
);
TEXT:
CREATE TABLE posts (
id INT,
content TEXT -- 게시글 본문
);
MySQL의 BLOB/TEXT 변형:
실무 권장:
ILIC 적용:
자기 점검
선수 지식: Unit 1.2
핵심 개념
Collation (정렬 규칙):
"문자열을 비교/정렬 하는 방법을 결정하는 규칙"
MySQL Collation 명명 규칙:
utf8_general_ci — UTF-8, 일반 비교, case-insensitive (대소문자 무시)utf8_bin — UTF-8, 바이너리 비교 (대소문자 구분)utf8mb4_unicode_ci — UTF-8 4바이트 (이모지 지원)TEXT의 기본 동작:
utf8_general_ci 등 → 대소문자 무시예시:
SELECT * FROM users WHERE name = 'alice';
-- 'Alice', 'ALICE', 'alice' 모두 매칭 (case-insensitive 기본)
대소문자 구분이 필요할 때:
SELECT * FROM users WHERE name COLLATE utf8_bin = 'alice';
-- 'alice' 만 정확히 매칭
또는 BINARY 키워드:
SELECT * FROM users WHERE BINARY name = 'alice';
컬럼 단위로 Collation 지정:
CREATE TABLE users (
name VARCHAR(50) COLLATE utf8_bin -- 이 컬럼은 대소문자 구분
);
ILIC 활용:
자기 점검
목표: 단일 서버 한계를 넘는 첫 번째 도구인 클러스터링의 본질을 이해한다.
선수 지식: 13주차 Phase 5 (Scale-Up vs Scale-Out)
핵심 문제
단일 서버의 위험:
Clustering의 해결:
"여러 서버가 동일한 논리적 데이터베이스를 분산 운영"
핵심 의미:
구조 (DB 서버 2대 시):
[Client]
↓
[Load Balancer]
/ \
[DB Server 1] [DB Server 2]
↓ ↓
[DB Storage] [DB Storage]
(physically separate)
이점:
자기 점검
선수 지식: Unit 2.1
핵심 2가지 패턴:
Active-Active (동시 운영):
장점:
단점:
Active-Standby (대기 모드):
장점:
단점:
비교 매트릭스:
| Active-Active | Active-Standby | |
|---|---|---|
| 자원 사용 | 모두 활성 | 절반만 활성 |
| Failover 시간 | 거의 0 | 수 초 ~ 분 |
| 비용 | 높음 | 낮음 |
| 복잡도 | 높음 | 낮음 |
ILIC 시나리오:
자기 점검
선수 지식: Unit 2.2
핵심 원리
클러스터 투표 (Quorum):
"노드 일부가 다운되었을 때 나머지가 다수(majority)를 차지하는지 판단"
과반수 룰 ⭐ :
왜 필요한가:
예시 (3노드 클러스터):
핵심 통찰 ⭐ :
"클러스터링은 최소 3개 노드 권장 — 1개 다운 시 2개로 정상 운영 가능"
2노드의 위험:
홀수 노드 권장:
Quorum의 응용:
ILIC 적용:
자기 점검
목표: Master-Slave 구조와 클러스터링의 차이를 명확히 잡고, PXC와 백업 전략을 본다.
선수 지식: Phase 2, 13주차 Phase 5
핵심 구조
Replication:
"Master 서버의 변경을 Slave 서버로 복제"
구조:
[Master DB] ──복제──> [Slave DB 1]
↓ ↑
(Write) (Read only)
↓
[Slave DB 2]
역할 분리:
얻는 이점 ⭐ :
읽기 부하 분산
Master 부하 ↓
백업·분석 부하 격리
복제 방식:
복제 지연 (Replication Lag):
Master/Slave 성능 고려:
ILIC 시나리오:
자기 점검
선수 지식: Phase 2, Unit 3.1
핵심 차이 ⭐ :
| Replication | Clustering | |
|---|---|---|
| 구조 | Master → Slave (단방향) | 모든 노드 동등 |
| Write | Master만 | 모든 노드 가능 |
| Read | Slave 분산 | 모든 노드 |
| 일관성 | 비동기 (지연 가능) | 동기 또는 즉시 |
| Failover | 수동/반자동 | 자동 |
| 주 목적 | 읽기 성능 + 백업 | 고가용성 + 즉시 Failover |
시각적 비교:
Replication:
[Master] ─wirte─> Master 자신
│
│ 비동기 복제
↓
[Slave 1] ─read 만─
[Slave 2] ─read 만─
Clustering (Active-Active):
[Node 1] ↔ [Node 2] ↔ [Node 3]
↓ ↓ ↓
모두 read/write 가능 (동기 동기화)
선택 기준:
Replication 적합:
Clustering 적합:
둘 다 사용 가능 (실무 표준):
ILIC 시나리오:
자기 점검
선수 지식: Unit 3.2
Percona XtraDB Cluster (PXC) ⭐ :
"MySQL 호환 Active-Active 클러스터링 솔루션"
왜 PXC를 선택하는가:
Replication의 한계:
1. Slave가 Read만 담당 → 성능 좋은 Master 의존
2. Master 장애 시 Slave 자동 승격 X
3. Slave 성능을 낮게 잡으면 Master 대체 어려움
PXC의 해결:
Galera Cluster 기반:
ILIC 적용 가능성:
XtraBackup vs mysqldump (백업 도구):
| XtraBackup | mysqldump | |
|---|---|---|
| 방식 | Hot Backup (서비스 중) | Logical (SQL 추출) |
| 속도 | 매우 빠름 | 느림 |
| 결과물 | 바이너리 파일 | SQL 텍스트 |
| 복구 | 빠름 | 느림 (재실행) |
| 운영 영향 | 최소 | 락 발생 가능 |
| 도구 | Percona 도구 | MySQL 기본 |
| 적합 | 대용량 운영 DB | 작은 DB, 마이그레이션 |
XtraBackup 권장:
mysqldump 권장:
ILIC 시나리오:
자기 점검
목표: 한 테이블/한 DB가 너무 커졌을 때의 두 가지 분할 전략을 비교한다.
선수 지식: 13주차 Phase 5 (NoSQL의 Sharding)
핵심 개념
Sharding:
"여러 DB 서버로 데이터를 분할 — 각 서버가 일부 데이터만 가짐"
구조:
[Shard 1: user_id 1~1000만]
[Shard 2: user_id 1000만~2000만]
[Shard 3: user_id 2000만~3000만]
샤드 키 (Shard Key):
샤딩 전략:
Range-based (범위):
Hash-based (해시):
Geographic (지리):
Sharding의 어려움 ⭐ :
JOIN 어려움:
트랜잭션 분산:
재샤딩 비용:
샤드 키 선택의 어려움:
NoSQL과의 자연스러운 궁합:
ILIC 적용 시 검토:
자기 점검
선수 지식: Unit 4.1
핵심 차이 ⭐ :
| Partitioning | Sharding | |
|---|---|---|
| 분할 단위 | 단일 DB 내 테이블 | 여러 DB 서버 |
| 위치 | 한 DBMS | 분산 시스템 |
| 관리 | DBMS 자동 | 애플리케이션 |
| 트랜잭션 | 정상 | 분산 어려움 |
| 복잡도 | 낮음 | 높음 |
Partitioning의 본질:
"한 테이블을 여러 물리적 조각으로 분할 — DBMS가 자동 라우팅"
Partition 종류:
1. Range Partitioning (범위):
CREATE TABLE sales (
sale_date DATE,
amount DECIMAL
)
PARTITION BY RANGE (YEAR(sale_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026)
);
2. List Partitioning (목록):
PARTITION BY LIST (region) (
PARTITION p_kr VALUES IN ('SEOUL', 'BUSAN'),
PARTITION p_us VALUES IN ('NY', 'LA')
);
3. Hash Partitioning (해시):
PARTITION BY HASH (user_id) PARTITIONS 4;
-- 4개 파티션으로 균등 분산
4. Key Partitioning:
Partitioning의 효과:
쿼리 성능 ↑:
WHERE sale_date = '2024-...' → p2024 파티션만 조회관리 용이:
인덱스 부담 ↓:
ILIC 적용 가능:
Partitioning 우선, Sharding은 마지막:
자기 점검
목표: 자주 헷갈리는 데이터 삭제 명령의 차이와 ROLLBACK 가능 여부의 본질을 이해한다.
선수 지식: 6주차 Phase 6, 10주차 Phase 5
핵심 비교 ⭐ :
| DELETE | TRUNCATE | DROP | |
|---|---|---|---|
| 분류 | DML | DDL | DDL |
| 대상 | 특정 행 | 모든 행 | 테이블 자체 |
| WHERE 절 | 가능 | 불가 | 불가 |
| 속도 | 느림 | 빠름 | 즉시 |
| ROLLBACK | 가능 ✅ | 불가 ❌ | 불가 ❌ |
| AUTO_INCREMENT | 유지 | 초기화 | (테이블 사라짐) |
| 인덱스/제약조건 | 유지 | 유지 | 삭제 |
| 트리거 발동 | ✅ | ❌ | ❌ |
DELETE — 안전한 삭제:
DELETE FROM users WHERE id = 5;
DELETE FROM users WHERE created_at < '2020-01-01';
-- ROLLBACK 가능
START TRANSACTION;
DELETE FROM users WHERE id = 5;
ROLLBACK; -- 복구됨
왜 느린가:
TRUNCATE — 빠른 전체 삭제:
TRUNCATE TABLE users;
-- 모든 행 삭제 (구조는 유지)
왜 빠른가:
주의:
DROP — 완전 제거:
DROP TABLE users;
-- 테이블 + 데이터 + 인덱스 + 제약조건 + 트리거 모두 삭제
복구 불가:
언제 무엇을?:
| 상황 | 명령 |
|---|---|
| 일부 데이터 삭제 | DELETE |
| 모든 데이터 삭제 (테이블 유지) | TRUNCATE |
| 테이블 자체 제거 | DROP |
| 트랜잭션으로 안전하게 | DELETE |
ILIC 시나리오:
자기 점검
선수 지식: Unit 5.1, 6주차 Phase 6 (ACID)
핵심 메커니즘
ROLLBACK이 가능한 이유:
"UNDO LOG 덕분"
UNDO LOG:
예시 흐름:
1. UPDATE users SET age = 30 WHERE id = 1;
(age는 원래 25였음)
2. UNDO LOG 기록: "id=1의 age를 25로 되돌릴 것"
3. ROLLBACK 호출
→ UNDO LOG 적용
→ age = 25 복구
InnoDB의 두 로그 ⭐ :
| UNDO LOG | REDO LOG | |
|---|---|---|
| 목적 | ROLLBACK 지원 | 복구 (Crash Recovery) |
| 시점 | 트랜잭션 중 | 변경 즉시 |
| 내용 | 이전 상태 (Before) | 변경 후 (After) |
| 용도 | 롤백·MVCC | Durability 보장 |
MVCC (Multi-Version Concurrency Control):
TRUNCATE는 왜 ROLLBACK 안 되나:
DELETE의 비용:
ILIC 적용:
자기 점검
목표: Trigger·JOIN·VIEW·PROCEDURE 등 SQL의 도구함을 정리한다.
선수 지식: Phase 5
핵심 개념
Trigger:
"INSERT/UPDATE/DELETE 시 자동으로 실행되는 코드"
예시 — 학생 삭제 시 이력 보관:
CREATE TRIGGER trg_student_delete
AFTER DELETE ON students
FOR EACH ROW
BEGIN
INSERT INTO deleted_students (id, name, deleted_at)
VALUES (OLD.id, OLD.name, NOW());
END;
작동:
DELETE FROM students WHERE id = 5;
-- → 자동으로 deleted_students에 INSERT
트리거 종류:
시점:
BEFORE — 작업 전 실행AFTER — 작업 후 실행이벤트:
INSERT / UPDATE / DELETE범위:
FOR EACH ROW — 행마다FOR EACH STATEMENT — 명령마다 (MySQL 미지원)활용 사례 ⭐ :
ILIC 활용 가능성:
Trigger의 단점 ⚠️ :
실무 권장:
자기 점검
선수 지식: 6주차 Phase 6 (JOIN)
핵심 개념
JOIN의 본질:
"두 개 이상 테이블을 결합하여 데이터 조회"
INNER JOIN — 매칭만 포함:
SELECT u.name, o.product
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
→ users와 orders 양쪽 모두에 매칭되는 행만 반환
→ 매칭 안 되는 user는 결과에서 빠짐
OUTER JOIN — 모든 행 포함:
LEFT OUTER JOIN (왼쪽 기준):
SELECT u.name, o.product
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
→ users 모든 행 포함
→ orders 없는 user는 NULL로 채워짐
RIGHT OUTER JOIN (오른쪽 기준):
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
→ orders 모든 행 포함
FULL OUTER JOIN (양쪽 모두):
-- MySQL은 기본 미지원, UNION으로 시뮬레이션
SELECT * FROM A LEFT JOIN B ON ...
UNION
SELECT * FROM A RIGHT JOIN B ON ...;
→ 양쪽 모든 행, 매칭 안 되면 NULL
시각적 비교:
[INNER]
A ∩ B (교집합만)
[LEFT OUTER]
A 전체 + (B에서 매칭되는 부분)
[RIGHT OUTER]
B 전체 + (A에서 매칭되는 부분)
[FULL OUTER]
A ∪ B (합집합)
언제 무엇을?:
| 상황 | JOIN 종류 |
|---|---|
| 양쪽 모두 있는 행만 | INNER |
| 왼쪽 모두 + 매칭 | LEFT |
| 한 쪽이 없어도 모두 | OUTER |
| 매칭 안 되는 행 찾기 | LEFT + WHERE B IS NULL |
ILIC 시나리오:
JPA에서의 JOIN:
LEFT JOIN자기 점검
선수 지식: Unit 6.2
핵심 개념
VIEW:
"실제 데이터를 저장하지 않는 가상 테이블 — 쿼리 결과를 정의"
예시:
CREATE VIEW user_orders AS
SELECT users.id, users.name, orders.product
FROM users
INNER JOIN orders ON users.id = orders.user_id;
사용:
SELECT * FROM user_orders; -- 테이블처럼!
VIEW의 활용:
복잡한 쿼리 단순화:
-- 복잡한 JOIN을 한 번 정의 후 재사용
SELECT * FROM monthly_sales_summary;
보안:
CREATE VIEW public_users AS
SELECT id, name FROM users; -- email, password 제외
권한 분리:
레거시 호환:
VIEW의 한계 ⚠️ :
Materialized View (참고):
ILIC 적용:
자기 점검
선수 지식: Unit 6.3
핵심 개념
PROCEDURE (Stored Procedure):
"매개변수를 활용하여 정의한 작업을 DB에 저장 + 호출"
예시:
CREATE PROCEDURE add_user(
IN p_name VARCHAR(50),
IN p_email VARCHAR(100)
)
BEGIN
INSERT INTO users (name, email)
VALUES (p_name, p_email);
END;
-- 호출
CALL add_user('Alice', 'alice@example.com');
VIEW vs PROCEDURE ⭐ :
| VIEW | PROCEDURE | |
|---|---|---|
| 용도 | 정적 조회 | 동적 처리 |
| 반환 | 테이블 형태 | 결과 또는 영향만 |
| 매개변수 | X | ✅ |
| INSERT/UPDATE | 제한적 | 자유롭게 |
| 호출 | SELECT FROM view | CALL procedure |
프로시저의 활용:
현대적 관점에서의 평가 ⚠️ :
과거 (1990~2000년대):
현재:
프로시저의 단점:
1. 테스트 어려움 — DB에 의존
2. 버전 관리 어려움 — Git 등으로 관리 X
3. 포팅 어려움 — DBMS마다 문법 다름
4. 디버깅 어려움
5. CI/CD 어려움
실무 권장:
"비즈니스 로직은 애플리케이션에, DB는 데이터 저장에 집중"
다만 다음은 프로시저 적합:
Trigger vs VIEW vs PROCEDURE 정리 ⭐ :
| Trigger | VIEW | PROCEDURE | |
|---|---|---|---|
| 호출 | 자동 (이벤트) | SELECT | CALL (수동) |
| 매개변수 | OLD/NEW | X | ✅ |
| 용도 | 자동 부수 작업 | 가상 테이블 | 명시적 작업 단위 |
ILIC 권장:
자기 점검
★★★ 면접·실무 단골 (반드시):
★★ 매우 권장:
[ ] Phase 1 — 데이터 타입과 인코딩 (Unit 1.1~1.3)
[ ] Phase 2 — DB Clustering (Unit 2.1~2.3)
[ ] Phase 3 — Replication과 백업 (Unit 3.1~3.3)
[ ] Phase 4 — Sharding과 Partitioning (Unit 4.1~4.2)
[ ] Phase 5 — DELETE/TRUNCATE/DROP과 ROLLBACK (Unit 5.1~5.2)
[ ] Phase 6 — SQL 고급 기능 (Unit 6.1~6.4)
[ ] 종합 자기 점검 28문항 통과
13주차 (이론):
14주차 (운영):
→ 이제 DB 면접에서 마주칠 대부분의 질문에 답할 수 있다.
이번 주차는 운영 실무 색채가 강합니다. 직접 손을 더럽혀야 체화됩니다:
Phase 2-3 (Clustering/Replication):
Phase 4 (Partitioning):
Phase 5 (DELETE/TRUNCATE/DROP):
Phase 6 (Trigger/VIEW/PROCEDURE):
특히 ILIC와 연결해서 생각하세요: