개발자가 라이브러리 없이 마크다운 파서를 직접 만든 이유 (Technical Deep Dive)
Kini
·
‘의존성 지옥’에서 탈출하기
처음엔 당연히 marked.js나 markdown-it 같은 유명한 라이브러리를 썼습니다. 근데 문제가 터지더라고요. 최신 버전으로 업데이트하면 기존에 잘 돌아가던 커스텀 렌더러 로직이 깨지거나, 인자 구조가 객체로 변하면서 [object Object]라는 외계어를 뿜어냈습니다.
1인 창업가에게 시간은 곧 돈입니다. 라이브러리 내부 소스 뜯어보며 “왜 인자가 이렇게 바뀌었지?” 고민할 시간에 내가 완벽하게 통제할 수 있는 코드를 짜는 게 낫겠다 싶었죠. 그래서 ‘Vanilla JS + Regex’ 조합으로 선회했습니다. 외부 라이브러리 0개, 오직 순수 함수로만 돌아가는 파서를 만든 이유입니다.
코드 블록 보호를 위한 ‘치환자(Placeholder)’ 전략
마크다운 파싱에서 가장 골치 아픈 게 바로 코드 블록(“`)입니다. 전체 텍스트를 줄바꿈(\n) 기준으로 잘라서 문단(`p`) 태그를 입히다 보면, 코드 블록 내부의 줄바꿈까지 다 잘려서 코드가 엉망이 되거든요.
저는 이 문제를 해결하기 위해 ‘선 추출 후 삽입’ 전략을 썼습니다.
Step 1: 정규표현식으로 코드 블록만 먼저 싹 긁어모읍니다.
Step 2: 그 자리에 __CODE_BLOCK_0__ 같은 고유한 식별자를 남겨둡니다.
Step 3: 본문의 제목, 볼드, 링크 등을 다 변환한 뒤 마지막에 식별자를 실제 코드 HTML로 갈아 끼웁니다.
이렇게 하면 코드 내부의 특수문자나 줄바꿈이 다른 정규표현식 규칙에 오염되는 걸 완벽하게 막을 수 있습니다. 5년 차 짬바에서 나온 나름의 ‘안전장치’인 셈이죠.
제목(H1) 추출과 볼드(**) 기호의 세밀한 제어
블로그 플랫폼마다 요구하는 규격이 다릅니다. 티스토리는 제목칸이 별도로 있고, 워드프레스는 구텐베르크 에디터에서 제목 블록이 따로 있죠.
저는 파서 상단에서 # 제목을 먼저 추출해서 객체로 반환하게 만들었습니다. 덕분에 클립보드에 제목만 따로 담을 수 있게 됐죠.
볼드 처리도 마찬가지입니다. **강조**를 <strong>으로 바꿀 수도 있지만, 저는 더 가볍고 직관적인 <b> 태그를 택했습니다. 티스토리 제목칸처럼 태그를 아예 못 읽는 곳을 위해 제목에서는 모든 마크다운 기호를 지워버리는 replace 로직도 추가했고요.