완벽한 파이썬 한글 깨짐 해결: macOS 실전 가이드

한번쯤 Python 한글 깨짐 해결을 위해서 골치가 아픈 적이 있으셨죠?
파이썬 시각화를 하다가 제목이나 축 라벨에 한글을 넣는 순간,
글자가 네모(□)로 변하거나 아래처럼 에러가 뜨는 경우가 있습니다.
제가 겪은 것은 아래와 같은거예요.
seaborn heatmap을 그리는데 나타난 에러예요.
Glyph xxxx missing from font(s) Arial.이건 “파이썬이 한글을 못 읽는다”가 아니라,
그래프를 그리는 라이브러리(Matplotlib)가
한글이 없는 폰트(예: Arial) 로 렌더링하려고 해서 생기는 문제예요.
그래서 핵심은 하나입니다.
한글이 들어있는 폰트를 찾아서,
Matplotlib(그리고 Seaborn에도) 폰트를 “확실히” 고정한다.
문제 재현: 가장 흔한 한글 깨짐 코드 패턴

아래처럼 Seaborn/Matplotlib로 그래프를 그리는데 한글을 넣자마자 깨지는 게 전형적인 증상입니다.
import seaborn as sns
import matplotlib.pyplot as plt
sns.set_theme()
sns.barplot(...)
plt.title("안전 사고 분석") # 여기서 한글 깨짐 또는 Glyph missing
plt.show()여기서 중요한 포인트
- Seaborn은 스타일을 잡아주지만, 실제 그림을 그리는 최종 엔진은 Matplotlib입니다.
- 그래서 파이썬 한글 깨짐 해결은 “Seaborn만 설정”이 아니라 “Matplotlib까지 같이 설정”하는 게 안전합니다.
해결 전략 한 줄 요약
- 내 OS에 있는 한글 폰트를 찾는다
- Matplotlib 폰트를 그 폰트로 고정한다
- Seaborn을 쓰면 Seaborn 테마(rc)에도 같이 고정한다
macOS에서 파이썬 한글 깨짐 해결
맥에서 특히 많이 보이는 오류가 “Glyph missing from Arial”입니다.
아래 “첫 셀” 코드를 한 번 실행해두면,
이후 그래프(히트맵/막대/박스플롯/선그래프 등)가 전부 한글로 정상 출력되는 경우가 대부분입니다.
macOS 첫 셀용 영구 설정 코드 (복사해서 그대로 사용)
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns
# 1) macOS 시스템 폰트에서 한글 폰트 자동 탐지
font_path = next(
(f for f in fm.findSystemFonts() if "AppleGothic" in f or "Apple SD Gothic" in f),
None
)
# 2) 폰트 이름 추출 (없으면 기본값)
font_name = fm.FontProperties(fname=font_path).get_name() if font_path else "Apple SD Gothic Neo"
# 3) seaborn + matplotlib 동시 고정 (핵심)
sns.set_theme(style="whitegrid", rc={"font.family": font_name, "axes.unicode_minus": False})
plt.rcParams["font.family"] = font_name
plt.rcParams["axes.unicode_minus"] = False왜 macOS에서 “Seaborn + Matplotlib 동시 설정”이 핵심인가
- Seaborn만 설정하면, 일부 상황에서 Matplotlib 기본 폰트(Arial)가 다시 개입할 수 있어요.
- 그래서 plt.rcParams로 한 번 더 못 박아 “한글 폰트로만 그려라”를 강제하는 방식이 파이썬 한글 깨짐 해결의 승률을 가장 높입니다.
Windows에서 파이썬 한글 깨짐 해결
윈도우는 보통 “맑은 고딕(Malgun Gothic)”이 설치되어 있어서
그걸 고정하면 끝나는 경우가 많습니다.
import matplotlib.pyplot as plt
import seaborn as sns
font_name = "Malgun Gothic" # 윈도우 기본 한글 폰트
sns.set_theme(style="whitegrid", rc={"font.family": font_name, "axes.unicode_minus": False})
plt.rcParams["font.family"] = font_name
plt.rcParams["axes.unicode_minus"] = False리눅스/서버에서 파이썬 한글 깨짐 해결
리눅스는 “한글 폰트가 아예 없는” 경우가 흔합니다.
이때는 폰트 설치가 먼저예요. (예: Noto Sans CJK, Nanum 폰트 등)
설치 후에는 아래처럼 폰트 이름으로 고정하면 됩니다.
import matplotlib.pyplot as plt
import seaborn as sns
font_name = "Noto Sans CJK KR" # 설치한 폰트에 맞게 수정
sns.set_theme(style="whitegrid", rc={"font.family": font_name, "axes.unicode_minus": False})
plt.rcParams["font.family"] = font_name
plt.rcParams["axes.unicode_minus"] = False
print(f"✅ 파이썬 한글 깨짐 해결 완료: {font_name}")
설정이 제대로 됐는지 10초 검증하는 테스트 코드
“설정은 했는데 진짜 됐나?” 싶을 때는 아래 테스트 1번이면 충분합니다.
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import seaborn as sns
import pandas as pd
# 1) macOS 시스템 폰트에서 한글 폰트 자동 탐지
font_path = next(
(f for f in fm.findSystemFonts() if "AppleGothic" in f or "Apple SD Gothic" in f),
None
)
# 2) 폰트 이름 추출 (없으면 기본값)
font_name = fm.FontProperties(fname=font_path).get_name() if font_path else "Apple SD Gothic Neo"
# 3) seaborn + matplotlib 동시 고정 (핵심)
sns.set_theme(style="whitegrid", rc={"font.family": font_name, "axes.unicode_minus": False})
plt.rcParams["font.family"] = font_name
plt.rcParams["axes.unicode_minus"] = False
df = pd.DataFrame({"유형": ["안전", "위생", "환경"], "건수": [25, 12, 8]})
sns.barplot(data=df, x="유형", y="건수", hue="유형", legend=False)
plt.title("파이썬 한글 깨짐 해결 테스트: 막대그래프")
plt.xlabel("유형")
plt.ylabel("건수")
plt.tight_layout()
plt.show()- 아래 그림과 같이 제목/축 라벨이 한글로 정상 출력되면 파이썬 한글 깨짐 해결 성공입니다.
- 마이너스 값 그래프에서 “-”가 네모로 나오지 않으면 axes.unicode_minus도 제대로 적용된 겁니다.

그래도 안 될 때 체크리스트
- 커널 재시작: Jupyter/VSCode는 이전 설정을 물고 있을 때가 많습니다. 커널을 재시작하고 첫 셀을 다시 실행하세요.
- Matplotlib 캐시 문제(맥):
rm -rf ~/Library/Caches/matplotlib후 커널 재시작 - 폰트 이름 확인: 설치는 되어 있는데 이름이 다를 수 있습니다. (예: “Apple SD Gothic Neo” vs “AppleSDGothicNeo”)
- 서버/도커 환경: 컨테이너에 폰트가 없으면 100% 실패합니다. 폰트 설치가 먼저입니다.
마무리: 파이썬 한글 깨짐 해결의 결론은 “폰트 고정”
정리하면,
파이썬 한글 깨짐 해결은 어려운 문제가 아니라
“한글 폰트를 잡아주느냐”의 문제입니다.
가장 추천하는 사용 습관은 이거예요.
노트북/프로젝트의 첫 셀(또는 공통 모듈)에 폰트 설정을 고정해두고,
이후 그래프에서는 한글을 마음껏 쓴다!





