2. MySQL 환경설정

0. 학습 목표
→ Workbench 작업 환경을 정리하고, 샘플 DB(employees)를 넣은 뒤, 다른 PC에서 이 서버로 원격 접속하는 상태까지 만듭니다.
0.1 이번 글에서 다룰 내용
이번 글은 실습 중심 강의입니다.
1강에서 설치한 MySQL과 Workbench를 실제 수업에서 쓸 수 있는 상태로 만듭니다.
폰트를 바꿔 SQL 가독성을 높이고, 실습에 쓸 샘플 데이터베이스를 넣고,
마지막으로 "내 PC의 MySQL에 옆자리 PC에서 접속"하는 원격 연결을 완성합니다.
원격 연결은 이후 Server-Client 수업과 PySide6 앱 개발의 기반이 됩니다.
| 구분 | 내용 |
| 이해할 것 | bind-address의 의미, 방화벽(ufw)과 포트의 관계, root 원격 접속이 막혀 있는 이유 |
| 만들 것 | employees 샘플 DB가 들어 있고, 원격 계정(user1)으로 외부 접속이 되는 MySQL 서버 |
강의 흐름은 다음과 같습니다.
Workbench 폰트 변경 → 한글이 깨지지 않는 코딩 폰트 적용
샘플 DB 추가 → employees DB를 source 명령으로 가져오기
네트워크 상태 확인 → IP·ping으로 서버와 통신 가능한지 점검
외부 접속 허용 → bind-address 수정과 방화벽 개방
원격 계정 생성·테스트 → user1 계정으로 다른 PC에서 접속
1. MySQL Workbench 폰트 변경
→ D2Coding 폰트를 설치하고 Workbench의 SQL 에디터에 적용합니다.
1.1 D2Coding 폰트 설치
D2Coding은 한글과 코드를 함께 표기하기 좋은 코딩 전용 폰트입니다. 숫자 0과 알파벳 O, 소문자 l과 숫자 1이 명확히 구분되어 SQL 오타를 줄여줍니다.
참고 글: 우분투 초기세팅5 - 폰트
BasicLike
어? 나 프로그래밍 좋아하네?
basiclike.tistory.com
# 사용자 폰트 폴더 생성 후 이동
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
# D2Coding 폰트 다운로드 및 압축 해제
wget https://github.com/naver/d2codingfont/releases/download/VER1.3.2/D2Coding-Ver1.3.2-20180524.zip
unzip D2Coding-Ver1.3.2-20180524.zip
# 폰트 캐시 갱신
fc-cache -f -v
1.2 Workbench에 폰트 적용하기

▶ 지금 해보세요
- Workbench 상단 메뉴에서
Edit > Preferences를 엽니다. - 좌측에서
Fonts & Colors를 선택합니다. - SQL Editor 항목의 폰트를
D2Coding 12로 변경하고 OK를 누릅니다. - 쿼리 탭을 새로 열어 한글 주석을 입력해 봅니다. 깨지지 않으면 적용 완료입니다.
2. 샘플 DB employees 추가하기
→ "이것이 MySQL이다" 교재의 샘플 DB를 내려받아 source 명령으로 가져옵니다.
2.1 예제 파일 다운로드와 압축 해제
앞으로의 SQL 실습은 실제 데이터가 있어야 재미있습니다.
30만 건 규모의 직원 데이터가 들어 있는 employees 샘플 DB를 사용합니다.


# 다운로드할 폴더로 이동 (예: 홈 디렉토리 아래 db_sample)
mkdir -p ~/db_sample
cd ~/db_sample
# 예제 파일 다운로드
wget http://download.hanbit.co.kr/mysql/8.0/employees.zip
# 압축 해제 (-d 옵션으로 새 폴더에 풀기)
unzip employees.zip -d employees
2.2 다운로드한 파일의 권한 확인 및 필요시 변경


💡 팁: 다운로드 후 ls -l로 파일 권한을 확인합니다. 읽기 권한이 없는 경우에만 chmod +r employees.zip으로 권한을 부여하면 됩니다. wget으로 직접 받은 파일은 대부분 그대로 사용 가능합니다.
2.3 source 명령으로 가져오기


▶ 지금 해보세요
- MySQL에 접속합니다:
mysql -u root -p - 압축 해제한 경로의 sql 파일을 실행합니다:
source ~/db_sample/employees/employees.sql - Query OK 메시지가 여러 줄 올라가며 몇 분 정도 걸릴 수 있습니다. 끝날 때까지 기다립니다.
- 가져오기가 끝나면 확인합니다:
SHOW DATABASES;
2.4 가져온 샘플 데이터베이스 확인


✔ 확인 기준: SHOW DATABASES; 결과에 employees가 보이고, USE employees; SELECT COUNT(*) FROM employees; 결과가 30만 건 규모로 나오면 성공입니다.
💡 팁: source에서 "Failed to open file" 오류가 나면 경로 문제입니다. employees.sql은 내부에서 다른 .dump 파일들을 상대 경로로 불러오므로, sql 파일이 있는 폴더로 cd 한 뒤 mysql에 접속해 source employees.sql을 실행하는 것이 가장 안전합니다.
3. 네트워크 상태 확인
→ 원격 접속 전에 IP와 ping으로 두 PC가 통신 가능한 상태인지 먼저 점검합니다.
원격 접속이 안 될 때 원인은 크게 세 층입니다:
- 네트워크가 안 통하거나,
- 서버(MySQL 설정·방화벽)가 막았거나,
- 계정 권한이 없거나.
이 챕터에서 첫 번째 층을 먼저 확인해 두면, 뒤에서 문제가 생겼을 때 원인을 빠르게 좁힐 수 있습니다.
3.1 서버 IP 확인

# IP 주소와 네트워크 정보 출력
ip addr show
출력에서 inet 10.10.21.xxx 형태의 주소가 이 서버의 IP입니다.
접속하는 쪽(클라이언트)이 이 주소를 사용하게 됩니다. 127.0.0.1은 자기 자신을 가리키는 주소이므로 원격 접속에는 쓸 수 없습니다.
3.2 ping으로 통신 확인

# 서버 PC와 통신이 되는지 확인 (클라이언트 PC에서 실행)
ping 10.10.21.xxx
# 인터넷 자체가 되는지 확인
ping google.com
ping은 내 컴퓨터와 상대 컴퓨터 사이의 네트워크 연결이 살아 있는지 확인하는 가장 기본적인 도구입니다. 응답이 오면 네트워크 층은 통과입니다. Ctrl+C로 중단합니다.
4. 외부 접속 허용 설정
→ MySQL의 bind-address를 수정하고 방화벽에서 3306 포트를 엽니다.
4.1 bind-address 수정
MySQL은 기본적으로 bind-address = 127.0.0.1, 즉 자기 자신에게서 오는 접속만 받도록 설정되어 있습니다.
이 값을 바꿔야 다른 PC의 접속 요청을 받아들입니다.

# 설정 파일 열기
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
파일에서 bind-address 줄을 찾아 다음과 같이 수정합니다.
# bind-address = 127.0.0.1 ← 로컬 전용이던 기존 줄은 주석 처리
bind-address = 0.0.0.0 ← 모든 네트워크에서의 접속 허용
▶ 지금 해보세요
- nano로 설정 파일을 열어 bind-address를 위와 같이 수정합니다.
- Ctrl+O, Enter로 저장하고 Ctrl+X로 나옵니다.
- MySQL을 재시작합니다:
sudo systemctl restart mysql
💡 팁: 재시작 시 노란색 경고와 함께 daemon-reload 안내가 나오면 안내대로 sudo systemctl daemon-reload를 실행한 뒤 다시 재시작합니다. 0.0.0.0은 학습 환경(같은 강의실 네트워크) 기준이며, 실무 서버라면 접속을 허용할 특정 IP나 내부망 대역만 여는 것이 원칙입니다.
4.2 방화벽(ufw)에서 3306 포트 열기
bind-address를 열어도 방화벽이 막고 있으면 접속되지 않습니다. 3306은 MySQL의 기본 포트이며, 아래 명령은 "이 서버로 들어오는 3306번 포트의 TCP 연결을 허용한다"는 의미입니다.
# MySQL 기본 포트(3306/tcp) 허용
sudo ufw allow 3306/tcp
# 방화벽 상태와 규칙 확인
sudo ufw status
| 상황 | 명령 |
| 특정 IP만 허용 (더 안전) | sudo ufw allow from 192.168.0.10 to any port 3306 proto tcp |
| 포트 다시 닫기 | sudo ufw deny 3306/tcp |
| 최후의 수단 — 방화벽 자체 끄기 | sudo ufw disable (상태 확인: sudo ufw status) |
💡 팁: 방화벽을 끄는 것은 원인 확인용 최후의 수단입니다. 껐을 때 접속이 되면 "방화벽 규칙 문제"로 원인이 확정되는 것이니, 규칙을 바로잡은 뒤 반드시 sudo ufw enable로 다시 켭니다. ufw는 systemctl보다 ufw disable/enable 명령으로 제어하는 것이 표준입니다.
5. 원격 계정 생성과 접속 테스트
→ 원격 접속용 user1 계정을 만들고, 다른 PC에서 실제로 접속해 이번 강의를 마무리합니다.
5.1 원격 접속용 user1 계정 만들기
Ubuntu 24.04 + MySQL 8.x 기본 설정에서 root 계정은 원격 접속이 불가능합니다. root는 'root'@'localhost'로만 존재하기 때문입니다. 그래서 원격용 계정을 따로 만듭니다. 계정명 뒤의 '%'는 "어느 호스트에서 접속하든 허용"이라는 뜻입니다.

CREATE USER IF NOT EXISTS 'user1'@'%' IDENTIFIED WITH caching_sha2_password BY '1234';
GRANT ALL PRIVILEGES ON *.* TO 'user1'@'%';
💡 팁: 1강과 같은 이유로 인증 방식은 caching_sha2_password로 통일합니다(mysql_native_password는 8.4부터 기본 비활성화). CREATE USER·GRANT는 즉시 반영되므로 FLUSH PRIVILEGES;도 불필요합니다.
ALL PRIVILEGES ON *.*와 '%'는 학습용 최대 개방 설정입니다. 실무라면 필요한 DB에만 권한을 주고(ON employees.*) 접속 호스트도 제한하는 것이 원칙이며, WITH GRANT OPTION(다른 계정에 권한을 나눠주는 권한)은 관리자 계정이 아니면 붙이지 않습니다.
5.2 접속 테스트 — 로컬에서, 그리고 원격에서
원격 접속 명령의 형태는 다음과 같습니다. 지금까지 쓰던 명령에 -h(서버 주소)와 -P(포트)가 추가된 것뿐입니다.
mysql -u [사용자ID] -p -h [서버IP 또는 도메인] -P [포트번호]
| 옵션 | 설명 |
| -h | 접속할 서버의 IP 또는 도메인 (생략 시 localhost) |
| -P | 포트 번호 (대문자 P, 기본값 3306) |

▶ 지금 해보세요
- 먼저 서버 PC 자신에서 새 계정을 테스트합니다:
mysql -u user1 -p - 성공하면 옆자리 PC(클라이언트)로 이동해 접속합니다:
mysql -u user1 -p -h 10.10.21.xxx -P 3306 - 접속되면
SHOW DATABASES;로 employees가 보이는지 확인합니다.
✔ 확인 기준: 다른 PC에서 user1로 접속해 employees DB가 보이면 이번 강의 완료입니다. 실패한다면 3강 흐름 그대로 역추적하세요 — ping이 되는가(네트워크) → bind-address를 바꾸고 재시작했는가(MySQL 설정) → ufw에 3306이 열려 있는가(방화벽) → 계정 host가 '%'인가(권한).
6. (참고) 한글 인코딩 설정
→ 우분투 24 + MySQL 8.0 이상은 기본이 utf8mb4라 보통 진행할 필요가 없습니다. 한글이 깨질 때만 봅니다.
"우분투 24 이상 + MySQL 8.0 이상" 조합이면 utf8mb4 기반으로 자동 설정되어 한글 입출력에 문제가 없습니다.
먼저 현재 설정을 확인합니다.

SHOW VARIABLES WHERE Variable_name IN (
'character_set_server', 'collation_server',
'character_set_client', 'character_set_connection',
'character_set_database', 'max_allowed_packet'
);
결과가 모두 utf8mb4 계열이면 이 챕터는 여기서 끝입니다. 다만 두 경우에는 한글이나 이모지가 깨질 수 있습니다. 결과가 latin1 또는 utf8(utf8mb3)인 경우, 그리고 애플리케이션이 DB 접속 시 별도 문자셋을 지정(예: 커넥터에서 SET NAMES latin1)하는 경우입니다. 이때만 아래 설정을 적용합니다.

# /etc/mysql/mysql.conf.d/mysqld.cnf 의 [mysqld] 섹션에 추가
# 클라이언트 접속 시 자동 실행되는 SQL (문자셋 + 콜레이션을 한 줄로)
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_0900_ai_ci'
# 새로 생성되는 DB·테이블·컬럼의 기본 문자셋과 콜레이션
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
# 클라이언트 문자셋 협상 무시: 항상 서버의 utf8mb4 강제 적용
skip-character-set-client-handshake
# 최대 패킷 크기 (필요 시 조정)
max_allowed_packet = 1024M
💡 팁: init_connect를 두 줄로 나눠 쓰면 마지막 줄만 적용되므로, 위처럼 한 줄로 합쳐서 씁니다. 또한 init_connect는 관리자 권한(SUPER/CONNECTION_ADMIN) 계정에는 실행되지 않으므로, root로만 테스트하면 적용 여부를 확인할 수 없습니다. user1 같은 일반 계정으로 확인하세요.
수정 후 sudo systemctl restart mysql로 재시작하고, 위의 SHOW VARIABLES 쿼리를 다시 실행해 utf8mb4로 바뀌었는지 확인하면 됩니다.
→ 다음 강의 (3강): 이번에 넣은 employees DB를 재료로 SELECT 중심의 기본 쿼리를 실습하고, user1 원격 계정은 이후 Python(mysql-connector) 연동에서 그대로 사용합니다.