콘텐츠로 이동

의미 린터와 구문 린터

contextlint의 태그라인은 “markdownlint for syntax. contextlint for meaning.”입니다. 이는 markdownlint와 기능이 겹치는 도구를 만든 것이 아니라, 다른 레이어를 담당하는 보완 관계 에 있음을 나타냅니다. 이 페이지에서는 의미 린터(semantic linter)와 구문 린터(syntax linter)의 차이를 정리합니다.

린터는 검증하는 대상에 따라 레이어가 나뉩니다.

레이어검증 대상
구문 (syntax)표기가 문법을 따르고 있는가제목 레벨, 리스트 표기법, 테이블 구문
포맷 (format)표기 스타일이 통일되어 있는가행 끝 공백, 리스트 기호의 통일
의미 (semantic)내용이 논리적으로 정합한가필수 컬럼의 유무, ID의 고유성, 참조 대상의 존재

markdownlint는 구문과 포맷 을 담당합니다. contextlint는 의미적 정합성과 파일 간 정합성 을 담당합니다. 양자는 경합하지 않으며, 레이어가 다릅니다.

관점markdownlintcontextlint
Markdown 구문
포맷·스타일
제목 레벨의 일관성
테이블 구문의 정확성
테이블 내 데이터 정합성
필수 섹션의 존재
필수 섹션의 순서
ID의 고유성
파일 간 참조 정합성
의존 관계 그래프 검증
용어의 일관성

같은 테이블에 대해, 양자는 다른 측면을 검증합니다.

| ID | Status | Description |
| ----------- | ------ | ----------- |
| REQ-AUTH-01 | | 로그인 요건 |
| REQ-AUTH-01 | stable | |
  • markdownlint가 보는 것: 파이프 개수, 구분 행의 정형, 공백의 처리 — 테이블이 Markdown으로서 유효한가
  • contextlint가 보는 것:
    • Status 컬럼에 빈 셀이 있다 (TBL-002)
    • ID 컬럼에 중복이 있다 (TBL-006)
    • Description 컬럼에 빈 셀이 있다 (TBL-002)
    • 테이블 내용이 업무상의 정합성을 유지하고 있는가

양자를 조합함으로써, 표기의 정확성 + 내용의 정확성 을 양면에서 커버할 수 있습니다.

구문 린터만으로는 커버할 수 없는 영역은, 문서가 규모를 키울수록 표면화됩니다.

  • 링크가 Markdown으로서 올바른 표기법으로 작성되어 있어도, 링크 대상 파일이 존재하지 않는 경우가 있다
  • 테이블이 Markdown으로서 올바른 구문이어도, 필수 컬럼이 누락되어 있는 경우가 있다
  • 같은 ID가 여러 파일에서 정의되어 있어도, Markdown으로서는 아무 문제가 없다
  • stable 상태의 요구사항이 draft 상태의 요구사항에 의존하고 있어도, Markdown 구문상으로는 오류가 되지 않는다

이들은 Markdown 레이어에서는 검출 불가능한 문제입니다. 문법이 아닌 의미 레이어 에 있기 때문에, 별도의 린터가 필요합니다.

contextlint는 markdownlint를 대체하지 않습니다. 양자는 병용함으로써 비로소, 문서를 다층적으로 검증할 수 있습니다.

  • markdownlint — “Markdown으로서 올바르게 작성되었는가”
  • contextlint — “문서의 내용이 정합한가”

CI 파이프라인에서는 양쪽을 순서대로 실행할 것을 권장합니다. markdownlint로 구문을, contextlint로 의미를 — 각각의 강점 영역에 분담시키는 것이 자연스러운 사용 방법입니다.