# EasyMDE + Alpine.js 환경에서 발생한 ‘타이밍 버그’ 해결기 — 숨겨진 DOM과 초기화 충돌 프론트엔드 개발 과정에서 마주하는 버그는 크게 두 가지다. 하나는 논리적 오류나 오타 같은 ‘코드의 문제’, 다른 하나는 바로 ‘타이밍의 문제’다. 전자는 디버깅이 명확하다. 코드를 수정하면 해결된다. 하지만 후자는 **차원이 다르다.** 코드는 틀린 곳이 없는데 동작하지 않는다. 이번 글은 Django 기반 서비스에서 EasyMDE와 Alpine.js를 연동하며 겪은, 프론트엔드 개발의 난제인 **타이밍 버그** 추적기다. > **"원인은 코드가 아니라, 실행 시점이었다."** ----- ## 💥 증상: 텍스트는 보이나 제어가 불가능하다 {#sec-f2d06a47aa6b} Django 템플릿 위에서 Markdown 에디터인 EasyMDE와 DOM 제어를 위한 [[Alpine.js]]를 함께 사용 중이었다. 특히 "임시 저장된 초안 불러오기" 기능을 구현하던 중 치명적인 문제가 발생했다. 서버에서 전달받은 `raw_markdown` 데이터는 정상적으로 에디터에 로드되었다. 하지만 그 직후 에디터가 얼어붙었다. * **커서 이동 불가**: 에디터 내부를 클릭해도 커서가 생기지 않음. * **입력 불가**: 키보드 이벤트가 전혀 먹히지 않음. * **UI 깨짐**: 에디터 상단에 의문의 공백 발생. * **콘솔 에러**: 클릭 시 다음과 같은 치명적 에러 발생. ```text Uncaught TypeError: can't access property "map", r is undefined Error: Incorrect contents fetched, please reload. ``` 이 에러는 EasyMDE의 코어인 **CodeMirror가 DOM과의 동기화를 잃었을 때** 발생한다. 즉, 라이브러리가 제어하려는 DOM 요소가 예상과 다른 상태라는 뜻이다. ----- ## 🔍 가설과 검증 {#sec-aa6082ae42f4} ### 가설 1: 인스턴스 중복 초기화? {#sec-890fc3cf12ee} EasyMDE는 동일 요소에 대해 두 번 초기화될 경우 내부 상태가 꼬이는 경향이 있다. 로그를 통해 초기화 시점을 확인했다. ```text [postEditor] Creating new EasyMDE instance [postEditor] EasyMDE already initialized ``` 중복 방지 로직을 추가했으나 문제는 여전했다. 특히 '신규 작성'시에는 잘 작동하고, '초안 불러오기' 시에만 에러가 발생한다는 점에서 단순 초기화 문제는 아니었다. ### 가설 2: Textarea 값 주입 방식의 문제? {#sec-931b00738f5b} 서버 사이드 렌더링 시 `