📌개발 회고

마크다운 굵게(**)가 한국어에서만 깨지는 이유 — 닫는 별표 뒤의 조사

AI 답에서 굵게가 별표째 보였다. 마크다운 표준 규칙이 띄어쓰기를 전제로 해서, 조사가 붙는 한국어에서만 생기는 문제였다.

📅 2026년 9월 30일·📖 5분 읽기·👁 7
마크다운 굵게(**)가 한국어에서만 깨지는 이유 — 닫는 별표 뒤의 조사

AI 챗봇의 답을 마크다운으로 그리고 있다. 어느 날 받은 화면 캡처에 이런 글이 그대로 찍혀 있었다.

**'아무것도 없는 안전한 잠자리'**를 만들어 주세요.

굵게 보여야 할 부분이 별표째 나왔다. 영어 답에서는 한 번도 본 적 없는 모습이었다. 찾아보니 한국어라서 생기는 문제였다. 마크다운 표준 규칙이 영어의 띄어쓰기를 전제로 만들어져 있어서다.

결론부터 적는다.

이렇게 쓰면보이는 결과이유
**'잠자리'**를별표가 그대로 보임닫는 별표 앞이 따옴표, 뒤가 조사
**100%**가별표가 그대로 보임닫는 별표 앞이 %, 뒤가 조사
**주의:**확인별표가 그대로 보임닫는 별표 앞이 콜론, 뒤가 글자
'**잠자리**'를굵게 됨문장부호를 굵게 바깥으로 뺐다

1. 표준 규칙이 뭐라고 하나

지금 대부분의 마크다운 렌더러는 CommonMark 라는 표준을 따른다. 이 표준은 별표 두 개(**)가 굵게를 닫을 수 있는지를 앞뒤 글자로 정한다. 요약하면 이렇다.

  • 닫는 별표 바로 앞이 글자이면 닫힌다.
  • 닫는 별표 바로 앞이 문장부호(따옴표·괄호·%·콜론·마침표 등)이면, 바로 뒤가 공백이나 문장부호일 때만 닫힌다.

영어에서는 거의 문제가 안 된다. 굵게 뒤에는 보통 공백이 온다.

He said **"stop"** and left.

한국어는 다르다. 조사가 바로 붙는다. **'잠자리'**를 에서 닫는 별표의 앞은 따옴표(문장부호)이고 뒤는 를(글자)이다. 규칙상 닫을 수 없다. 여는 쪽도 같은 규칙이 거꾸로 걸린다. 아기는**'잠자리'** 처럼 여는 별표 앞이 글자이고 뒤가 따옴표이면 열리지 않는다.

렌더러가 틀린 게 아니다. 표준대로 동작한 것이다.

2. 왜 AI 답에서 자주 나오나

사람이 쓸 때는 한 번 보고 고치면 된다. AI 답은 다르다. 모델은 강조하고 싶은 말을 따옴표로 감싸고 그 바깥을 굵게 하는 경우가 많다. 숫자에 단위를 붙인 채 굵게 하기도 한다(**90%**가). 한국어 문장이니 조사가 바로 붙는다.

모델이 쓰는 모양을 매번 통제할 수는 없다. 그래서 화면에 그리기 직전에 코드로 고쳤다.

3. 고친 방법 — 문장부호를 굵게 바깥으로

방법은 몇 가지가 있다.

방법장점단점
문장부호를 굵게 바깥으로 옮기기보이는 글자가 그대로따옴표·%는 굵지 않게 됨
별표 앞뒤에 폭 없는 공백 넣기모양을 그대로 유지복사하면 보이지 않는 문자가 섞임
<strong> 태그로 바꾸기확실함HTML 허용 여부에 따라 막힘

우리는 첫 번째를 골랐다. 정규식 두 개다(아래는 따옴표 종류를 줄인 형태).

// **'텍스트'** → '**텍스트**'
const WRAPPED =
  /\*\*(['"‘“(「『])([^*\n]+?)(['"’”)」』])\*\*/g;

// **100%**가 → 100%가 const TRAILING = /**([^*\n]+?)([:.,!?;%'"’”)」』])**(?=[0-9A-Za-z가-힣])/g;

export function fixCjkEmphasis(md: string) { if (!md.includes("")) return md; return md .replace(WRAPPED, "$1$2**$3") .replace(TRAILING, "$1$2"); }

첫 번째 식은 따옴표나 괄호로 감싼 굵게를 뒤집는다. 두 번째 식은 닫는 별표 바로 앞의 문장부호를 바깥으로 뺀다. 이때 뒤에 글자가 바로 붙을 때만 바꾼다. 뒤가 공백이면 원래도 잘 되니 건드리지 않는다.

이 함수는 마크다운을 렌더러에 넘기기 직전에 한 번 부른다. 채팅 화면과 공유 페이지가 같은 함수를 쓴다.

4. 검증

렌더러와 같은 파서(micromark)로 예문 9개를 돌렸다.

예문고치기 전고친 뒤
**'안전한 잠자리'**를별표 노출굵게
**90%**가별표 노출굵게
**주의:**확인별표 노출굵게
여는 쪽이 붙은 경우 2개별표 노출굵게
원래 잘 되던 경우 4개굵게그대로

깨지던 5개는 모두 굵게가 됐다. 원래 잘 되던 4개는 한 글자도 바뀌지 않았다. 실제 서비스 화면에서도 별표가 사라진 것을 확인했다.

5. 한계

  • 따옴표와 %가 굵은 글씨에서 빠진다. 읽는 데는 차이가 거의 없다.
  • 코드 블록 안의 별표까지 바꾸지 않도록 조심해야 한다. 우리 경우는 줄 단위 패턴이라 코드 블록에 굵게 표시가 들어갈 일이 거의 없었다. 코드가 많은 문서라면 코드 블록을 먼저 떼어 놓고 고치는 게 안전하다.

정리

  • 한국어 마크다운에서 굵게가 별표째 보이면, 닫는 별표 앞의 문장부호부터 본다.
  • 표준 규칙은 "문장부호 뒤에서 닫으려면 그 뒤가 공백이어야 한다"이다. 조사가 붙는 한국어는 이 조건을 자주 못 지킨다.
  • 사람이 쓰는 글이면 문장부호를 굵게 바깥에 두는 습관 하나로 해결된다. AI 가 쓰는 글이면 렌더링 직전에 코드로 고친다.

이 블로그 글도 같은 규칙을 지켜서 썼다. 굵게는 글자에서 끝내고, 따옴표와 기호는 바깥에 둔다.

태그

#마크다운 굵게 안됨#CommonMark#react-markdown#한국어 마크다운#AI 챗봇#정규식#문제 해결