모든 아티클

Text Diff: 텍스트 차이를 찾는 알고리즘의 작동 원리

한국어 맞춤법에는 띄어쓰기 규정이 있지만 실제로는 "할수있다"처럼 붙여 쓰거나 "할 수 있다"처럼 띄어 쓰는 표기가 문서마다 뒤섞여 나타난다. 의미는 완전히 같은데 띄어쓰기 하나만 다르면, 줄 단위 diff는 그 줄 전체를 "변경됨"으로 표시해버려 실제로 무엇이 바뀐 것인지 한눈에 알기 어렵다.

최장 공통 부분열

전통적인 diff 방식은 텍스트 두 버전 사이 줄들의 최장 공통 부분열(LCS)을 찾는 데 기반합니다. 이 부분열에 속하는 줄은 변경되지 않은 것으로 간주되고, 나머지는 이전 버전에서 삭제되었거나 새 버전에 추가된 것으로 표시됩니다. 이 방식은 가능한 임의의 순서가 아니라 최소한의 변경 집합을 만들어냅니다.

결과를 읽는 방법

삭제된 줄은 보통 - 기호와 빨간색으로, 추가된 줄은 + 기호와 초록색으로 표시됩니다. 일상적인 의미로 "바뀐" 줄은 기술적으로 이전 줄의 삭제와 새 줄의 추가가 합쳐진 것으로 표시됩니다 — diff에는 한 줄을 그 자리에서 편집한다는 독립된 개념이 없습니다.

줄 단위 비교가 항상 직관적이지 않은 이유

텍스트 중간에 새 줄이 삽입되면, 줄 단위 비교에서 이후의 모든 줄이 "변경된" 것으로 표시될 수 있습니다 — 알고리즘이 그것이 삽입인지 대량 교체인지 항상 구분할 수 있는 것은 아니기 때문입니다. 한국어 문서에서는 띄어쓰기 표기가 일관되지 않은 경우가 많아, 의미상 동일한 문장인데도 띄어쓰기 차이만으로 diff가 줄 전체를 다르다고 표시하는 일이 자주 벌어집니다.

이 기능이 필요한 이유

  • 설정 파일이나 문서의 두 버전 사이에 정확히 무엇이 바뀌었는지 확인하기.
  • diff 알고리즘의 로직을 이해하며 코드 리뷰하기.
  • 리팩터링 전후의 스크립트 출력을 비교해 회귀가 없는지 확인하기.

줄 단위 diff와 문자 단위 diff

줄 단위 비교는 코드나 설정 파일에는 적합하지만, 한 단어나 하나의 띄어쓰기만 바뀐 문장에서는 줄 전체를 삭제되고 다시 추가된 것으로 표시해버립니다. 줄 안에서 단어나 문자 단위로 비교하면 실제로 바뀐 부분을 더 정확히 보여줄 수 있지만, 그 대가로 큰 텍스트에서는 계산 비용이 더 높아집니다.

도구 사용해보기