우리는 매일같이 JPA, MyBatis와 같은 ORM을 통해 MySQL과 소통합니다. 하지만 ORM이라는 편리함 뒤에 가려진 MySQL의 진짜 모습, 그 내부 동작 원리와 RDB 설계의 깊이를 알고 계신가요?
이 책은 단순히 SQL 문법을 나열하는 것을 넘어, CS 전공자로서 그리고 스프링 백엔드 개발자로서 MySQL을 더욱 깊이 이해하고 실무에 효과적으로 활용할 수 있도록 돕기 위해 집필되었습니다. MySQL의 아키텍처부터 시작해 효율적인 RDB 설계, 인덱싱 전략, 트랜잭션과 동시성 제어, 그리고 쿼리 최적화 기법까지, 여러분의 백엔드 시스템 성능을 한 단계 끌어올릴 핵심 지식을 담았습니다.
이론적 배경과 함께 실무에서 마주칠 수 있는 다양한 시나리오와 해결책을 제시하여, 단순한 지식 습득을 넘어 실제 문제 해결 능력을 키울 수 있도록 구성했습니다. 이 책을 통해 여러분은 MySQL을 더욱 자신 있게 다루고, 더 견고하고 성능 좋은 백엔드 시스템을 구축하는 개발자로 성장할 수 있을 것입니다.
[이 책의 대상 독자]
- MySQL을 사용하지만 내부 동작 원리에 대해 더 깊이 알고 싶은 스프링 백엔드 개발자
- ORM 사용법은 알지만, RDB 설계 원칙과 최적화에 대해 체계적으로 배우고 싶은 개발자
- 데이터베이스 성능 문제로 고민해 본 경험이 있는 개발자
- 단순 SQL 사용자를 넘어, MySQL 전문가로 성장하고 싶은 개발자
[이 책의 목표]
- MySQL의 핵심 아키텍처와 내부 동작 원리 이해
- 올바른 RDB 설계 원칙 습득 및 실무 적용 능력 향상
- 효율적인 인덱싱 전략 수립 및 활용 능력 배양
- 트랜잭션과 동시성 제어 메커니즘 이해 및 문제 해결 능력 강화
- SQL 쿼리 분석 및 최적화 기법 습득
- 스프링 환경에서 MySQL을 최적으로 활용하기 위한 실무 팁 습득
[챕터 구성]
Part 1: MySQL과 RDBMS, 그리고 개발 환경 구축
-
Chapter 1: 왜 MySQL인가? 그리고 RDBMS란 무엇인가?
- 1.1. 백엔드 개발자에게 데이터베이스란? (데이터 영속성, 성능의 핵심)
- 1.2. RDBMS의 역사와 특징 (관계형 모델, ACID 간략 소개)
- 1.3. MySQL의 탄생 배경, 특징 및 현황 (오픈소스, 커뮤니티, 주요 사용처, 버전별 주요 변화)
- 1.4. MySQL 설치 및 기본 환경 설정 (OS별, Docker 활용, 기본 보안 설정)
- 1.5. MySQL 클라이언트 도구 소개 및 기본 사용법 (mysql CLI, GUI 도구 - DBeaver/DataGrip 등)
-
Chapter 2: SQL 기본 마스터하기 (CRUD를 넘어 고급 활용까지)
- 2.1. 데이터 정의어 (DDL):
CREATE,ALTER,DROP(데이터베이스, 테이블, 제약 조건) - 2.2. MySQL 데이터 타입 심층 분석 (선택 가이드, 주의사항)
- 2.3. 데이터 조작어 (DML):
INSERT,SELECT,UPDATE,DELETE고급 활용법 - 2.4.
WHERE절과 다양한 연산자,ORDER BY정렬,LIMIT결과 제한 - 2.5. 데이터 요약과 분석: 집계 함수와
GROUP BY,HAVING - 2.6. 테이블 연결의 핵심: 다양한
JOIN(INNER, LEFT/RIGHT, SELF) 원리와 활용 - 2.7. 쿼리 속의 쿼리: 서브쿼리(Scalar, Inline View, Nested)와 상관/비상관 서브쿼리
- 2.8. (Optional) 고급 SQL: 윈도우 함수(Window Functions) 기본 개념 및 활용 예시
- 2.9. (Optional) 데이터 제어어 (DCL):
GRANT,REVOKE사용자 권한 관리 기초
- 2.1. 데이터 정의어 (DDL):
Part 2: 견고하고 효율적인 RDB 설계를 위한 핵심 원칙
-
Chapter 3: 데이터 모델링과 ERD: 좋은 설계의 첫걸음
- 3.1. 데이터 모델링의 중요성과 프로세스 (요구사항 분석부터)
- 3.2. 개념적, 논리적, 물리적 데이터 모델링 단계별 이해와 산출물
- 3.3. ERD(Entity-Relationship Diagram) 작성법과 주요 표기법 (까마귀발 등)
-
Chapter 4: 정규화(Normalization): 데이터 무결성과 중복 최소화의 기술
- 4.1. 정규화란 무엇이고 왜 필요한가? (이상 현상 방지)
- 4.2. 정규화의 기초: 함수 종속성(Functional Dependency) 이해 (완전/부분/이행 함수 종속)
- 4.3. 제1정규형 (1NF): 모든 값은 원자적이어야 한다
- 4.4. 제2정규형 (2NF): 부분 함수 종속 제거하기
- 4.5. 제3정규형 (3NF): 이행적 함수 종속 제거하기
- 4.6. 보이스-코드 정규형 (BCNF): 더 강력한 제3정규형
- 4.7. (Optional) 그 이상의 정규형 (4NF, 5NF) 간략 소개
-
Chapter 5: 키(Key) 완전 정복: 데이터 식별과 관계 설정의 핵심
- 5.1. 데이터 식별의 시작: 슈퍼키(Superkey)와 후보키(Candidate Key)
- 5.2. 테이블의 대표 얼굴: 기본키(Primary Key) - 선택 기준과 중요성
- 5.3. 테이블 간의 다리: 외래키(Foreign Key)와 참조 무결성, 참조 액션
- 5.4. 또 다른 선택지: 대체키(Alternate Key)와 유니크키(Unique Key)
- 5.5. 실무적 고민: 자연키(Natural Key) vs 대리키(Surrogate Key) - 장단점과 선택 가이드
-
Chapter 6: 성능과 유연성 사이의 균형: 반정규화(Denormalization)와 설계 최적화 전략
- 6.1. 정규화의 한계와 반정규화의 필요성
- 6.2. 주요 반정규화 기법 (테이블 통합, 중복 컬럼, 파생 컬럼, 이력 테이블 등)
- 6.3. 반정규화의 장단점과 적용 시 고려사항 (데이터 일관성 유지 방안)
- 6.4. (Optional) 읽기 전용 테이블, 요약 테이블 설계 전략
Part 3: MySQL 아키텍처와 InnoDB 스토리지 엔진 심층 탐구
-
Chapter 7: MySQL 서버 아키텍처와 쿼리 처리 흐름
- 7.1. MySQL의 논리적 아키텍처 (MySQL 엔진 vs 스토리지 엔진)
- 7.2. 주요 컴포넌트 상세: 커넥션 핸들러, SQL 파서, 옵티마이저, 실행 엔진 등
- 7.3. MySQL 스레딩 구조: 포그라운드 스레드와 백그라운드 스레드 (주요 역할)
- 7.4. MySQL 메모리 구조: 글로벌 메모리 영역과 세션 메모리 영역
- 7.5. SQL 쿼리가 실행되는 전체 여정 (파싱부터 결과 반환까지)
-
Chapter 8: InnoDB 스토리지 엔진 완전 정복 (Part 1) - 핵심 구조와 기능
- 8.1. 스토리지 엔진이란? (플러그인 방식, InnoDB vs MyISAM 비교)
- 8.2. InnoDB의 주요 특징: ACID 트랜잭션, 행 레벨 잠금, MVCC, 외래키, 클러스터형 인덱스
- 8.3. InnoDB의 심장: 버퍼 풀(Buffer Pool) 상세 구조와 관리 (LRU 리스트, Flush 리스트, 워밍업 등)
- 8.4. 데이터 지속성의 보루: 리두 로그(Redo Log)와 WAL(Write-Ahead Logging)
- 8.5. 롤백과 MVCC의 기반: 언두 로그(Undo Log)와 퍼지(Purge)
- 8.6. 데이터 저장 공간: 테이블스페이스(System, File-Per-Table, General, Undo)
-
Chapter 9: InnoDB 스토리지 엔진 완전 정복 (Part 2) - 고급 내부 메커니즘
- 9.1. 변경 버퍼(Change Buffer): 비클러스터형 인덱스 쓰기 성능 최적화
- 9.2. 어댑티브 해시 인덱스(Adaptive Hash Index, AHI): 동적 검색 최적화
- 9.3. 이중 쓰기 버퍼(Doublewrite Buffer): 페이지 파셜 라이트 방지와 데이터 무결성
- 9.4. InnoDB의 주요 백그라운드 스레드 상세 (마스터, I/O, 페이지 클리너, 퍼지 등)
- 9.5. (Optional) 기타 스토리지 엔진 간략 소개 (MEMORY, CSV, NDB Cluster 등)
Part 4: MySQL 성능 최적화의 정수: 인덱스와 동시성 제어 마스터하기
-
Chapter 10: 인덱스(Index) 제대로 알고 쓰기: 검색 성능의 마법
- 10.1. 인덱스란 무엇인가? (필요성, 장단점)
- 10.2. B-Tree 인덱스 심층 분석 (B-Tree vs B+Tree, 구조와 검색 과정)
- 10.3. 핵심 데이터 저장 방식: 클러스터형 인덱스(Clustered Index)와 기본키 전략
- 10.4. 다양한 검색 경로 제공: 비클러스터형 인덱스(Secondary Index)와 이중 조회
- 10.5. 똑똑한 인덱스 활용법: 인덱스 설계 전략 (선택도, 복합 인덱스, 커버링 인덱스 등)
- 10.6. 인덱스가 외면당하는 이유와 주의사항 (컬럼 가공, 타입 불일치, LIKE, OR 등)
- 10.7. (Optional) 고급 인덱스: 전문 검색(Full-text) 인덱스, 공간(Spatial) 인덱스 간략 소개
-
Chapter 11: 트랜잭션과 ACID 원칙: 데이터 일관성의 수호자
- 11.1. 트랜잭션의 개념과 필요성 (All or Nothing)
- 11.2. 트랜잭션의 4대 원칙: ACID 완전 정복 (원자성, 일관성, 고립성, 지속성)
- 11.3. MySQL에서 트랜잭션 직접 다루기: 제어 명령어 (
START,COMMIT,ROLLBACK,SAVEPOINT) - 11.4. 자동 커밋(Autocommit) 설정의 의미와 주의점
-
Chapter 12: 동시성 제어 심층 탐구: 잠금의 세계와 트랜잭션 고립
- 12.1. 함께 쓰면 문제가 생겨요: 동시성 문제점들 (Dirty Read, Non-Repeatable Read, Phantom Read)
- 12.2. 서로 간섭하지 않도록: 트랜잭션 격리 수준(Isolation Level) 상세 분석 및 선택 가이드
- 12.3. 잠금의 기본: 공유 잠금(S-Lock)과 배타 잠금(X-Lock) (호환성, 명시적 잠금)
- 12.4. 잠금의 범위와 대상: 테이블 락, 페이지 락, 그리고 행 레벨 락 (레코드 락)
- 인덱스와 레코드 락의 관계 (인덱스 부재 시 문제점)
- 12.5. InnoDB의 특수 잠금: 갭 락(Gap Lock)과 넥스트 키 락(Next-Key Lock) (Phantom Read 방지)
- 인서트 인텐션 락(Insert Intention Lock) 개념
- 12.6. (Optional) 인텐션 락(Intention Lock)과 자동 증가 락(Auto-Increment Lock)
- 12.7. 2단계 잠금 프로토콜 (2PL): 고립성 보장의 고전적 토대 (Strict 2PL, 데드락 문제)
- 12.8. InnoDB의 동시성 처리 마법: MVCC(Multi-Version Concurrency Control) 상세 원리
- 12.9. 끝나지 않는 기다림: 데드락(Deadlock) 발생 원인, 감지, 해결 전략 (InnoDB Status 분석)
Part 5: 실전! MySQL 성능 분석과 튜닝 전략
-
Chapter 13: 쿼리 실행의 비밀 지도: 실행 계획(Execution Plan) 완전 정복
- 13.1.
EXPLAIN명령어 사용법과 결과의 첫인상 - 13.2. 실행 계획 핵심 지표:
id,select_type,table,type컬럼 분석 - 13.3. 인덱스 활용도 판단:
possible_keys,key,key_len,ref컬럼 분석 - 13.4. 추가 정보의 보고:
rows,filtered,Extra컬럼 심층 분석 (Using index,Using filesort,Using temporary등) - 13.5. (Optional)
EXPLAIN FORMAT=JSON을 통한 상세 분석 및 옵티마이저 트레이스
- 13.1.
-
Chapter 14: SQL 튜닝 실전 테크닉: 느린 쿼리 성능 개선하기
- 14.1. 느림보 쿼리 찾기: 슬로우 쿼리 로그(Slow Query Log) 활용 및 분석 도구
- 14.2.
WHERE절 최적화: SARGable 쿼리 작성과 인덱스 활용 극대화 - 14.3.
JOIN최적화: 조인 컬럼 인덱스, 데이터 타입, 조인 순서, 조인 알고리즘 - 14.4.
GROUP BY및ORDER BY최적화: 인덱스 활용,filesort및temporary회피 - 14.5. 서브쿼리 최적화 전략: 상관/비상관 서브쿼리,
INvsEXISTSvsJOIN(옵티마이저 발전 고려) - 14.6. 옵티마이저에게 힌트 주기: 인덱스 힌트(
USE,IGNORE,FORCE INDEX) 신중한 사용법 - 14.7. 대량 데이터
INSERT,UPDATE,DELETE시 성능 고려사항 (트랜잭션 분할,LOAD DATA등)
-
Chapter 15: MySQL 서버 건강검진: 설정 튜닝과 모니터링
- 15.1. MySQL의 심장을 조율하다: 주요 시스템 변수와 설정 팁 (메모리, 연결, InnoDB 등)
- 15.2. InnoDB 버퍼 풀 최적화: 크기 설정, 인스턴스, 워밍업, 상태 변수 모니터링
- 15.3. 문제 해결의 실마리: 로그 파일(에러, 제너럴, 바이너리 등) 종류와 활용법
- 15.4. 서버 상태 한눈에 보기:
SHOW STATUS명령어와 주요 상태 변수 분석 - 15.5. (Optional)
performance_schema와sys스키마를 활용한 고급 성능 분석 기초 - 15.6. (Optional) MySQL 주요 모니터링 도구 소개 (PMM, Prometheus/Grafana 등)
Part 6: 스프링 백엔드와 MySQL 고급 활용 및 확장 전략
-
Chapter 16: Spring (Boot)에서 MySQL 효과적으로 사용하기
- 16.1. 데이터베이스 연결의 핵심: DataSource와 커넥션 풀(HikariCP) 이해 및 최적화
- 16.2. Spring Data JPA 사용 시 주의점과 N+1 문제 해결 전략 (페치 조인, EntityGraph, BatchSize)
- 16.3. MyBatis 사용 시 동적 SQL과 성능 고려사항 (N+1 문제 포함)
- 16.4. 스프링의 선언적 트랜잭션 관리:
@Transactional속성(격리수준, 전파옵션) 제대로 알고 쓰기 - 16.5. ORM의 편리함 뒤에 숨겨진 SQL: 실행 SQL 확인 및 튜닝 포인트 찾기 (로깅, P6Spy)
-
Chapter 17: MySQL 복제(Replication)와 읽기 확장성 확보
- 17.1. 데이터베이스 복제란 무엇인가? (기본 개념, 마스터/슬레이브, 바이너리 로그 기반)
- 17.2. MySQL 복제 방식 상세: 비동기, 반동기, (Optional) GTID 기반 복제
- 17.3. 복제 구성 및 모니터링: 주요 설정, 상태 확인, 복제 지연(Lag) 문제와 해결
- 17.4. 읽기/쓰기 분리(Read/Write Splitting) 아키텍처 구축 전략
- 애플리케이션 레벨 구현 (Spring
AbstractRoutingDataSource) - 데이터베이스 프록시/미들웨어 활용 (ProxySQL 등 간략 소개)
- 복제 지연으로 인한 데이터 불일치 문제와 대응 방안
- 애플리케이션 레벨 구현 (Spring
-
Chapter 18: (Optional) MySQL 고가용성(HA) 및 고급 주제 맛보기
- 18.1. 고가용성(High Availability) 기본 개념과 필요성
- 18.2. MySQL 고가용성 솔루션 간략 소개 (InnoDB Cluster/Group Replication, MHA, Orchestrator 등)
- 18.3. (Optional) 데이터 샤딩(Sharding) 기본 개념과 고려사항
- 18.4. (Optional) 클라우드 환경에서의 MySQL 활용 (AWS RDS, Google Cloud SQL 등)
부록
- A. MySQL 자주 사용되는 명령어 모음
- B. 주요 MySQL 에러 코드와 일반적인 대처법
- C. 추천 학습 자료 및 커뮤니티