Files
brain_dogfood/docs/Bug/data_loss_bug_20260418.md
T

2.3 KiB

버그 조치 보고서: 마크다운 문서 저장 시 데이터 소실 (2026-04-18)

1. 버그 내용

  • 현상: 마크다운 형식의 메모(가장 흔하게는 roadmap.md)를 저장할 때, 본문 중간에 위치한 수평선(---) 이후의 내용이 모두 삭제되는 현상 발생.
  • 원인:
    • 메모 하단에 $그룹, #태그를 추출하여 푸터로 모아주는 로직이 본문 내의 마크다운 수평선(---)과 그 뒤에 나오는 헤더(# 제목)를 '자동 생성된 푸터'로 오인함.
    • 정규식이 너무 탐욕적(Greedy)이었으며, 줄 단위 구분이 명확하지 않아 파일 끝까지의 모든 내용을 푸터로 간주하고 삭제함.

2. 조치 사항

푸터 식별 로직 정교화 (app/utils/__init__.py)

  • 수단: 정규식을 파일의 가장 끝에 위치한 **'수평선 + 순수 메타데이터 줄'**의 조합으로만 한정하도록 수정.
  • 적용: re.MULTILINE 플래그를 활용하여 줄 시작(^)과 끝($)을 명확히 구분하고, # 뒤에 공백이 있는 헤더는 절대로 푸터 구성 요소로 보지 않도록 개선.
  • 결과: 본문 중간의 수평선 및 마크다운 헤더 구조가 완벽히 보존됨.

태그 추출 정규식 개선

  • 수단: # 뒤에 공백이나 숫자가 먼저 오는 경우(마크다운 헤더 등)를 제외하고, 문자로 시작하는 경우만 태그로 인식하도록 강화.
  • 적용: (?<!\w)#([^\s\#\d\W][^\s\#]*) 패턴 적용.

자동 제목 생성 로직 개선

  • 수단: 첫 번째 --- 이전만 본문으로 보던 방식에서, 전체 내용 중 가장 상단의 유의미한 텍스트를 찾아 제목으로 사용하도록 변경.

3. 결과 및 확인

  • 재현 스크립트(scratch/repro_bug.py)를 통해 roadmap.md와 같은 복합 마크다운 구조에서도 데이터가 삭제되지 않고 정확히 보존됨을 확인.
  • 의도적으로 추가한 푸터 메타데이터는 정상적으로 제거 후 재배치됨을 확인.

4. 향후 주의사항

  • 텍스트 후처리 로직 수정 시 마크다운의 특수 기호와 충돌할 가능성을 항상 염두에 두어야 함.
  • 특히 [\s\S]*와 같은 광범위한 매칭은 앵커($)가 있더라도 지양하고, 줄 단위 매칭을 우선할 것.