MySQL를 실무 흐름으로 이해하기
웹 서비스와 마이크로서비스 환경에서 표준으로 인정받는 오픈소스 관계형 데이터베이스 MySQL을 학습합니다. InnoDB 스토리지 엔진 특성, 인덱스 튜닝(EXPLAIN), 복제(Replication) 구축 및 백업 등 실제 서비스 개발 및 운영에 핵심이 되는 내용을 정리합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
웹 서비스와 마이크로서비스 환경에서 표준으로 인정받는 오픈소스 관계형 데이터베이스 MySQL을 학습합니다. InnoDB 스토리지 엔진 특성, 인덱스 튜닝(EXPLAIN), 복제(Replication) 구축 및 백업 등 실제 서비스 개발 및 운영에 핵심이 되는 내용을 정리합니다.
웹 서비스와 마이크로서비스 환경에서 표준으로 인정받는 오픈소스 관계형 데이터베이스 MySQL을 학습합니다. InnoDB 스토리지 엔진 특성, 인덱스 튜닝(EXPLAIN), 복제(Replication) 구축 및 백업 등 실제 서비스 개발 및 운영에 핵심이 되는 내용을 정리합니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.
쿼리 문법과 함께 스키마 설계, 인덱스, 트랜잭션, 권한, 백업까지 운영 관점으로 봅니다.
글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 MySQL를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.
MySQL를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.
| 기능 / 특성 | InnoDB (권장) | MyISAM |
|---|---|---|
| 트랜잭션 (ACID) | 지원 | 지원 안 함 (원자성 보장 안 됨) |
| 잠금 단위 (Locking) | Row-level Lock (동시성 우수) | Table-level Lock (쓰기 작업 시 전체 락) |
| 외래키 (FK) | 지원 | 지원 안 함 |
| 데이터 복구 (Crash Recovery) | 자동 복구 (Redo Log 기반) | 수동 테이블 체크 및 복구 필요 |
여기서는 B+Tree 인덱스와 EXPLAIN 분석을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- 쿼리 실행 계획 확인
EXPLAIN SELECT emp_name, salary FROM employees WHERE dept_id = 10 AND salary > 50000;
-- 실행 결과 분석 초점
-- table: 조회 대상 테이블
-- type: ref, range, index, ALL (ALL은 전체 스캔이므로 튜닝 대상)
-- possible_keys: 후보 인덱스 목록
-- key: 실제 채택되어 사용된 인덱스
-- rows: 쿼리 처리를 위해 옵티마이저가 예측한 검색 행 수
-- Extra: Using index (커버링 인덱스), Using filesort (정렬 부하)여기서는 커넥션 풀(Connection Pool) 최적화을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
# Spring Boot HikariCP 설정 예시
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 10
idle-timeout: 30000
connection-timeout: 10000
max-lifetime: 1800000여기서는 주-부 복제 (Source-Replica)을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
여기서는 MySQL 권한 체계 & 보안을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- 1. 글로벌 권한 부여 (서버 전체의 모든 DB/테이블 대상)
GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'%' WITH GRANT OPTION;
-- 2. 데이터베이스 수준 권한 부여 (특정 schema 내 모든 객체)
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_user'@'localhost';
-- 3. 테이블 및 컬럼 수준 권한 부여 (보안 극대화: 급여 정보 등 특정 컬럼만 차단/허용)
GRANT SELECT (emp_id, emp_name), UPDATE (emp_name) ON mydb.employees TO 'helper_user'@'%';
-- 4. 부여된 권한 확인 (특정 사용자의 Grant 쿼리문 출력)
SHOW GRANTS FOR 'app_user'@'localhost';
-- 5. WITH GRANT OPTION의 전파
-- WITH GRANT OPTION을 부여받은 사용자는 자신이 가진 권한을 타인에게 부여할 수 있게 되므로 사용에 매우 주의해야 합니다.여기서는 MySQL 캐릭터셋 및 Collation 설정을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
-- 1. 시스템 변수를 통한 캐릭터셋 설정 상태 확인
SHOW VARIABLES LIKE 'char%';
SHOW VARIABLES LIKE 'colla%';
-- 2. 스키마 및 테이블 생성 시 캐릭터셋 지정
-- utf8mb4: 이모지(4바이트)를 온전히 지원하기 위한 표준 유니코드 캐릭터셋
-- utf8mb4_general_ci: 정렬 비교 연산 속도가 빠름 (대소문자 구분 없음)
CREATE DATABASE mydb_global
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;
USE mydb_global;
-- 테이블 단위 캐릭터셋 지정 (데이터베이스 기본값 상속 가능)
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
emoji_status VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin -- 컬럼별 정밀 지정 가능 (utf8mb4_bin: 바이너리 비교로 대소문자/이모지 완전 일치 비교)
);
-- 3. 기존 테이블 및 데이터베이스 캐릭터셋 변경
ALTER DATABASE mydb_global CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;여기서는 데이터 백업 & 복구 (mysqldump)을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.
# 특정 데이터베이스 백업
mysqldump -u root -p my_database > my_database_backup.sql
# 데이터베이스 복구
mysql -u root -p my_database < my_database_backup.sqlMySQL 실무 설계은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 결정 지점 | 확인 질문 | 실무 기준 |
|---|---|---|
| 경계 | MySQL 코드에서 바뀌기 쉬운 부분은 어디인가? | 입출력, 설정, 외부 연동, 핵심 규칙을 분리합니다. |
| 상태 | 상태가 어디서 생성되고 어디서 사라지는가? | 상태 소유자와 수명 주기를 코드로 드러냅니다. |
| 장애 | 실패했을 때 호출자는 무엇을 받는가? | timeout, fallback, error contract를 먼저 정합니다. |
이 섹션은 MySQL 운영 기준을 실무 관점에서 정리합니다. 개념을 외우기보다, 어떤 상황에서 이 기준을 꺼내 쓸지에 초점을 맞춰보세요.
MySQL 검증 전략은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.
| 품질 축 | 검증 방법 | 완료 기준 |
|---|---|---|
| 정확성 | 정상/실패 케이스를 자동화합니다. | 핵심 시나리오가 재현 가능하게 통과합니다. |
| 회귀 방지 | 버그 수정 시 동일 케이스를 테스트로 남깁니다. | 같은 장애가 다시 배포되지 않습니다. |
| 운영성 | 로그, 메트릭, 알림을 확인합니다. | 문제가 생겼을 때 원인 추적 경로가 있습니다. |