본문으로 건너뛰기
LeedyBox
후원

텍스트 비교의 원리

diff는 한 가지 질문에 답합니다. 첫 번째 텍스트를 두 번째 텍스트로 만들려면 무엇을 바꿔야 할까? 이 가이드는 diff 도구가 답을 찾는 방식, 결과를 읽는 방법, 그리고 잡음 대신 중요한 변경이 드러나도록 두 버전을 준비하는 방법을 설명합니다.

diff가 보여 주는 것

LeedyBox 텍스트 비교를 포함한 대부분의 diff 도구는 텍스트를 줄 단위로 비교합니다. 결과의 각 줄은 세 종류 중 하나입니다. 두 버전에 모두 있는 변경 없는 줄, 원본에만 있는 삭제된 줄, 새 버전에만 있는 추가된 줄입니다. "변경된 줄"이라는 종류는 따로 없으므로, 단어 하나를 고친 줄은 삭제된 줄과 추가된 줄로 두 번 나타납니다.

  Dear customer,
- Your order ships on Monday.
+ Your order ships on Tuesday.
  Kind regards

표시는 오래된 관례를 따릅니다. 삭제는 -, 추가는 +, 변경 없는 줄은 공백입니다. 보통 빨간색과 초록색으로 같은 정보를 한 번 더 보여 줍니다.

줄을 맞추는 방법

diff 도구는 두 텍스트에 같은 순서로 나타나는 가장 긴 줄의 순서, 즉 최장 공통 부분 수열을 찾습니다. 그 줄들은 변경 없는 줄로 남고, 나머지는 모두 삭제나 추가로 표시됩니다. 원본이 A, B, C, D이고 새 텍스트가 A, C, B, D라면 가장 긴 공통 순서는 예를 들어 A, B, D처럼 세 줄이므로, C는 한 곳에서 삭제되고 다른 곳에 추가되는 식으로 이동이 표시됩니다.

길이가 같은 답이 여러 개인 경우가 많고, 도구마다 고르는 방식이 다릅니다. 그래서 같은 두 파일도 프로그램에 따라 diff가 조금씩 다를 수 있습니다. Git은 기본으로 Myers 알고리즘을 쓰고 patience와 histogram을 대안으로 제공하는데, 이 둘은 닫는 괄호만 있는 줄이 많은 코드에서 더 읽기 쉬운 결과를 내는 경우가 많습니다.

가장 긴 공통 순서를 찾는 작업량은 한 텍스트의 줄 수와 다른 텍스트의 줄 수를 곱한 만큼 늘어납니다. LeedyBox 도구는 먼저 앞뒤의 같은 줄을 따로 빼 두고 나머지를 비교하며, 그 곱이 4,000,000을 넘으면, 예를 들어 서로 다른 줄이 약 2,000줄 대 2,000줄이면 안내 메시지를 보여 주고 멈춥니다.

Git과 코드 리뷰의 unified diff 읽기

버전 관리 시스템은 파일에서 바뀐 부분만 unified diff 형식으로 보여 줍니다.

--- a/config.yml
+++ b/config.yml
@@ -12,4 +12,5 @@
 server:
-  port: 8080
+  port: 8081
+  timeout: 30
 database:

---와 +++ 줄은 옛 파일과 새 파일의 이름입니다. 헝크 헤더 @@ -12,4 +12,5 @@는 이 블록이 옛 파일에서는 12번째 줄부터 4줄, 새 파일에서는 12번째 줄부터 5줄에 걸친다는 뜻입니다. 변경 주위의 변경 없는 줄 몇 개(기본 3줄)가 맥락을 보여 줍니다. LeedyBox처럼 전체 텍스트를 보여 주는 도구는 모든 줄이 보이므로 헝크 헤더가 없고, 그래서 그 결과를 패치로 적용할 수는 없습니다.

쓸모 있는 비교를 위해 텍스트 준비하기

diff는 의미가 아니라 문자를 비교합니다. 눈에 보이지 않는 작은 차이 때문에 줄이 달라지고, 그 차이가 실제 변경을 가릴 수 있습니다.

  • 공백과 탭: 줄 끝의 공백이나, 한 버전은 탭이고 다른 버전은 공백인 경우입니다. 줄 끝 공백을 지우고 두 버전의 들여쓰기를 맞추세요.
  • 보이지 않는 문자: 웹 페이지나 워드 프로세서에서 복사한 텍스트에 흔한 줄바꿈 없는 공백이나 폭 없는 공백입니다.
  • 유니코드 형태: é 같은 악센트 문자는 한 글자로 저장되기도 하고, e와 결합 악센트로 저장되기도 합니다. macOS 파일 이름이나 일부 PDF의 텍스트는 두 번째 형태를 쓰는 경우가 많습니다.
  • 둥근 따옴표와 대시: 워드 프로세서는 "를 “ ”로, -를 –로 바꾸므로 붙여넣은 사본이 원래의 평범한 텍스트와 맞지 않게 됩니다.
  • 줄 끝 문자: Windows는 줄을 CR LF로, macOS와 Linux는 LF로 끝냅니다. 브라우저는 텍스트 상자의 모든 줄바꿈을 LF로 바꾸므로 LeedyBox 도구에서는 이 차이가 보이지 않지만, 파일을 직접 비교하는 도구에서는 보입니다.
  • 데이터와 코드의 서식: 다시 들여쓴 JSON이나 순서가 바뀐 키는 거의 모든 줄을 다르게 만듭니다. 먼저 키를 정렬하고 들여쓰기를 맞추는 등 두 버전의 서식을 똑같이 하세요.

일반 문서 비교하기

일반 문서에서는 한 문단 전체가 긴 한 줄인 경우가 많아서, 단어 하나만 고쳐도 문단 전체가 삭제되고 추가된 것으로 표시됩니다. 두 가지 습관이 도움이 됩니다. 비교하기 전에 문장마다 줄을 나눠 바뀐 문장만 드러나게 하거나, git diff --word-diff나 워드 프로세서에 들어 있는 변경 내용 비교 기능처럼 줄 안의 단어를 비교하는 도구를 쓰세요.

PDF에서 복사한 텍스트에는 함정이 따로 있습니다. 페이지 레이아웃에서 끊긴 자리에서 줄이 나뉘고, 줄 끝에서 단어가 하이픈으로 나뉠 수 있습니다. 원본 문서와 비교하기 전에 각 문단의 줄을 다시 이어 붙이세요.

줄 단위 diff가 알려 주지 못하는 것

  • 이동: 다른 위치로 옮긴 문단은 한 곳에서 삭제되고 다른 곳에 추가된 것으로 나타납니다. --color-moved를 쓴 git처럼 이동한 블록을 따로 표시하는 도구도 있습니다.
  • 의미: 같은 내용을 다른 말로 쓴 두 텍스트는 완전히 다르게 나타나고, "not" 하나가 빠진 것처럼 한 글자짜리 변경은 작아 보여도 문장의 뜻을 뒤집을 수 있습니다.
  • 바이너리 내용: Word 문서, PDF, 이미지는 일반 텍스트가 아닙니다. 먼저 텍스트를 추출하거나, 그 파일을 만든 프로그램의 비교 기능을 쓰세요.

문서를 비교할 때의 개인정보

계약서, 설정 파일, 로그에는 이름, 키, 비밀번호가 들어 있는 경우가 많습니다. 일부 온라인 비교 서비스는 붙여넣은 텍스트를 서버에 저장하며, 공유 링크로 공개하기도 합니다. LeedyBox 텍스트 비교는 브라우저에서 실행되어 텍스트를 보내거나 저장하지 않지만, 그래도 설정 파일을 어디에 붙여넣든 그 전에 비밀 정보는 지워 두는 것이 좋습니다.

자주 묻는 질문

단어 하나만 고쳤는데 문단 전체가 바뀐 것으로 표시되는 이유는 무엇인가요?

문단이 한 줄이고, 줄 단위 diff는 줄 전체를 비교하기 때문입니다. 비교하기 전에 텍스트를 문장이나 짧은 줄로 나누거나, 단어 단위 비교를 쓰세요.

공백 차이를 무시할 수 있나요?

LeedyBox 도구는 줄을 정확히 비교합니다. 먼저 줄 끝 공백을 지우고 탭을 공백으로 바꾸는 식으로 두 텍스트를 정리하세요. 파일을 비교할 때 git은 --ignore-space-change 같은 옵션을 제공합니다.

Word 문서 두 개는 어떻게 비교하나요?

Word에는 서식 변경까지 보여 주는 비교 기능이 들어 있습니다. 문구만 비교하려면 두 문서의 텍스트를 복사해 텍스트 비교 도구에 넣으세요.

3방향 병합(three-way merge)이란 무엇인가요?

두 사람이 같은 원본을 고쳤을 때, 병합 도구는 각 버전을 공통 원본과 비교합니다. 서로 다른 곳의 변경은 자동으로 합쳐지고, 같은 줄의 변경은 사람이 해결해야 하는 충돌로 표시됩니다.