피드로 돌아가기
A reformatted PR shows 80 changed lines but changed nothing — I built a zero-dep diff that sees through it
Dev.toDev.to
DevOps

Token-based Diff 설계로 80라인의 포맷팅 노이즈 제거

A reformatted PR shows 80 changed lines but changed nothing — I built a zero-dep diff that sees through it

benjamin2026년 6월 22일4intermediate

Context

기존 git diff -w는 공백만 무시할 뿐 Line-anchored 방식의 한계로 인해 함수 시그니처의 줄 바꿈 등 Reflow 변경사항을 여전히 변경점으로 인식함. 이로 인해 단순 포맷팅 변경이 포함된 PR에서 실제 로직 변경분을 식별하는 데 과도한 리뷰 비용이 발생함.

Technical Solution

  • Line-based 비교를 제거하고 파일 전체를 Token stream으로 변환하여 공백과 줄 바꿈을 완전히 배제한 비교 구조 설계
  • [A-Za-z0-9_] 및 단일 문장 부호를 Token 단위로 정의하여 언어 독립적인(Language-agnostic) 분석 환경 구축
  • Myers diff 알고리즘의 Tie-breaking 규칙을 엄격히 정의하여 Node.js와 Python 두 언어 간 바이트 단위의 동일한 출력 보장
  • Latin-1 인코딩을 통한 Byte-Codepoint 일대일 매핑으로 언어별 문자열 인덱싱 차이 및 인코딩 이슈 해결
  • 정규표현식의 \w, \s 대신 명시적 ASCII 클래스를 사용하여 환경별 Unicode 처리 방식에 따른 결과 상이함 방지

- PR 리뷰 전 logicdiff와 같은 도구를 CI에 통합하여 Formatting-only 변경 여부 자동 판별 - 서로 다른 언어로 동일한 로직을 구현할 때 결정론적 결과 보장을 위해 알고리즘의 세부 분기 조건(Tie-breaking)을 명세화 - 외부 라이브러리 의존성을 제거한 Zero-dependency 설계를 통해 런타임 오버헤드 최소화 및 이식성 확보

원문 읽기