0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Markdown의 링크 문장을 혼란스럽게 재고하는 작은 Python 스크립트

0
Posted at

Markdown 링크 문구 점검과 관리

README나 설계 메모를 작성하다 보면 외부 링크는 자연스럽게 늘어납니다. 처음에는 “여기”, “참고”, “link” 같은 짧은 표현도 충분해 보입니다. 문서를 막 작성한 시점에는 앞뒤 문맥이 선명하기 때문입니다. 하지만 몇 달이 지나 다시 읽으면 상황이 달라집니다. 어떤 페이지를 가리키는지, 왜 필요한 링크인지, 지금도 참고할 가치가 있는지 한눈에 파악하기 어려워집니다.

링크가 끊어졌는지 확인하는 작업도 물론 중요합니다. 그러나 그보다 먼저 살펴볼 부분이 있습니다. 바로 링크 문구 자체의 전달력입니다. 주소가 정상적으로 열리더라도 앵커 텍스트가 모호하면 독자는 링크를 열기 전까지 목적지를 알기 어렵습니다.

기술 문서에서는 특히 이런 차이가 큽니다. 설치 방법, API 사양, 인증 방식, 릴리스 정보처럼 목적이 분명한 자료라면 링크 문구에서도 그 목적이 드러나는 편이 좋습니다. 이번 글에서는 Markdown 파일에서 링크를 추출하고, 의미가 불분명한 앵커 텍스트를 찾아내는 간단한 Python 스크립트와 활용 방법을 정리합니다.
Screen_Shot_2024-09-12_at_2.48.31_PM.png

점검 대상

이번 점검의 범위는 링크 주소의 생존 여부가 아닙니다. 네트워크 요청 없이 Markdown 본문에 적힌 링크 문구만 확인합니다.

대표적인 대상은 다음과 같습니다.

  • 여기
  • 이곳
  • 자세히
  • 참고
  • link
  • links
  • click
  • click here

물론 이런 표현이 언제나 잘못된 것은 아닙니다. 문맥상 의미가 명확하거나 반복적인 안내 영역에서는 짧은 표현도 충분할 수 있습니다. 문제는 독자가 링크를 열기 전까지 목적을 알 수 없는 경우입니다.

예를 들어 “자세한 내용은 여기”보다 “API 인증 방식 안내”가 훨씬 구체적입니다. 후자의 경우 독자는 클릭 전부터 연결 페이지의 성격을 예상할 수 있습니다. 문서의 흐름 역시 끊기지 않습니다.

Python 스크립트

다음 스크립트는 지정한 폴더 아래의 .md 파일을 검색하고 Markdown 링크의 앵커 텍스트를 확인합니다. 미리 지정한 모호한 표현과 일치하는 링크만 파일명, 줄 번호, 앵커 텍스트, URL과 함께 표시하는 구조입니다.

from pathlib import Path
import re
import sys

BAD_ANCHORS = {
    "여기",
    "이곳",
    "자세히",
    "참고",
    "link",
    "links",
    "click",
    "click here",
}

LINK_PATTERN = re.compile(r"\[([^\]]+)\]\(([^)]+)\)")

def scan_file(path: Path):
    text = path.read_text(encoding="utf-8", errors="ignore")

    for line_no, line in enumerate(text.splitlines(), start=1):
        for match in LINK_PATTERN.finditer(line):
            anchor = match.group(1).strip()
            url = match.group(2).strip()

            if anchor.lower() in BAD_ANCHORS:
                yield {
                    "file": path,
                    "line": line_no,
                    "anchor": anchor,
                    "url": url,
                }

def main():
    root = Path(sys.argv[1]) if len(sys.argv) > 1 else Path(".")
    markdown_files = list(root.rglob("*.md"))

    if not markdown_files:
        print("Markdown files were not found.")
        return

    found = False

    for path in markdown_files:
        for issue in scan_file(path):
            found = True
            print(
                f"{issue['file']}:{issue['line']} "
                f"ambiguous anchor: {issue['anchor']}"
            )

    if not found:
        print("No ambiguous link anchors found.")

if __name__ == "__main__":
    main()

실행 방식도 단순합니다.

python scripts/audit_markdown_links.py docs

이 방식의 장점은 네트워크 접근이 없다는 점입니다. 특정 사이트의 응답 상태나 인증 여부와 관계없이 Markdown 파일 자체의 품질만 빠르게 확인할 수 있습니다. 로컬 검토 과정이나 CI의 초기 단계에도 비교적 부담 없이 추가할 수 있습니다.

앵커 텍스트 개선

모호한 링크를 발견했다고 해서 문구를 무조건 길게 만들 필요는 없습니다. 핵심은 짧은 표현 안에 목적을 담는 것입니다.

기존 표현 개선 예시
여기 설치 가이드
자세히 API 인증 사양
참고 공식 설정 예제
link 릴리스 노트
click here 문제 해결 절차

좋은 앵커 텍스트는 링크를 열지 않은 상태에서도 어느 정도의 정보를 제공합니다. “무엇을 보기 위한 링크인가?”라는 질문에 짧게 답할 수 있다면 충분합니다.

또 하나의 기준은 주변 문장과의 관계입니다. 같은 문서 안에서 “설치 가이드”라는 표현이 반복적으로 사용된다면 굳이 새로운 표현을 만들 필요가 없습니다. 오히려 프로젝트 내부에서 일정한 용어를 유지하는 편이 관리에 유리합니다.
2.jpg

링크 모음의 구성

README에는 관련 자료를 한곳에 모아 두는 영역이 자주 등장합니다. 이때도 단순한 주소 나열보다는 용도별 구성이 효과적입니다. 설치, API, 운영, 문제 해결, 변경 이력처럼 독자의 목적에 따라 묶으면 필요한 자료의 탐색 시간이 줄어듭니다.

외부의 링크 정리 방식을 참고할 때에는 링크모음처럼 여러 주소를 분류한 사례도 하나의 참고 대상으로 볼 수 있습니다. 다만 다른 페이지의 구조를 그대로 가져오기보다는 현재 프로젝트의 문서 구조와 독자의 이용 흐름에 맞는지 먼저 확인하는 편이 안전합니다.

CI 적용 방식

처음부터 모호한 링크 하나만 발견되어도 빌드를 실패시키는 방식은 기존 문서가 많은 저장소에서 부담이 될 수 있습니다. 과거 문서에 이미 수많은 경고 대상이 있다면 개발자가 새로운 코드 변경과 관계없는 문제까지 처리해야 하기 때문입니다.

초기 단계에서는 경고 방식이 현실적입니다.

  1. 로컬 실행
  2. 기존 모호한 링크 수량 확인
  3. 신규 또는 변경 파일 중심의 경고
  4. 핵심 문서에 대한 CI 적용
  5. 팀 기준에 맞춘 허용 목록 조정

이후 기준이 안정되면 중요도가 높은 문서부터 엄격한 검사를 적용할 수 있습니다. 예를 들어 설치 문서나 API 안내처럼 신규 사용자가 자주 찾는 페이지에는 더 엄격한 기준을 적용하고, 오래된 내부 메모에는 경고 수준만 유지하는 방식입니다.

유지 관리 기준

문서 품질은 한 번의 대규모 정리보다 작은 점검의 반복에 가깝습니다. README 수정, 기능 추가, 의존성 변경, API 업데이트 같은 작업마다 관련 링크의 문구를 함께 살펴보는 정도면 충분합니다.

특히 링크 주소보다 문구의 의미를 먼저 확인하면 검토 속도가 빨라집니다. “이 링크가 아직 열리는가?”와 함께 “이 링크가 무엇을 제공하는지 지금도 문구만으로 알 수 있는가?”를 확인하는 것입니다.

문서가 커질수록 이런 차이는 더욱 분명해집니다. 링크 하나의 문제는 작아 보이지만, 수십 개의 모호한 링크가 쌓이면 독자의 탐색 비용이 커집니다. 반대로 목적이 분명한 앵커 텍스트는 문서 전체의 구조를 조금 더 선명하게 만들어 줍니다.

마무리

Markdown 링크 관리에서 주소의 정상 여부만이 전부는 아닙니다. 링크 문구 역시 문서 품질의 일부입니다. 특히 “여기”, “참고”, “link”처럼 목적이 드러나지 않는 표현은 시간이 지날수록 관리 비용을 높일 수 있습니다.

작은 Python 스크립트 하나만으로도 이런 대상을 빠르게 찾아낼 수 있습니다. 처음부터 완벽한 자동화를 목표로 하기보다, 로컬 점검과 경고부터 시작하는 편이 부담이 적습니다.

결국 중요한 기준은 간단합니다. 링크를 열기 전에도 독자가 그 목적을 이해할 수 있는가. 이 질문 하나를 README와 설계 메모의 정기적인 점검 기준으로 삼는다면, 문서의 가독성과 유지 관리성이 함께 좋아질 수 있습니다.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?