텍스트 비교 도구
텍스트 비교란?
텍스트 비교는 두 텍스트의 차이를 비교하는 도구로, LCS(최장 공통 부분 수열) 알고리즘을 사용하여 추가, 삭제 및 변경되지 않은 내용을 식별합니다. 코드 검토, 문서 버전 비교, 설정 파일 차이 확인 등의 시나리오에서 자주 사용됩니다. 배경색은 녹색으로 추가된 줄을, 빨간색으로 삭제된 줄을 표시합니다. 비교 결과는 공백, 줄바꿈, 대소문자, 탭 처리 방식에 따라 크게 달라질 수 있습니다. 코드나 계약 문서를 볼 때는 의미 있는 변경과 단순 서식 변경을 구분해야 합니다.
사용 방법
사용 방법
- 왼쪽 입력 상자에 원본 텍스트를 붙여넣으세요
- 오른쪽 입력 상자에 수정된 텍스트를 붙여넣으세요
- 시스템이 자동으로 차이를 계산하고 강조 표시합니다. 상태 표시줄에는 추가 및 삭제된 줄 수가 표시됩니다.
검토 팁
- 실제 변경 내용이 서식이 아닌 콘텐츠인 경우 비교 전에 줄 바꿈과 공백을 정규화하세요.
- 코드 또는 법률 텍스트의 경우 강조된 변경 사항을 수동으로 검토하세요. 자동 차이 분석은 차이를 보여주지만 의도나 정확성을 판단하지는 않습니다.
활용 사례
기술 원리
줄 단위 diff는 최장 공통 부분 수열(LCS) 문제를 기반으로 합니다. 두 줄 시퀀스 A와 B가 주어졌을 때, 같은 상대 순서로 양쪽에 나타나는 가장 긴 수열을 찾는 것입니다. LCS에 포함되지 않는 모든 것은 삽입(B에는 있지만 A에는 없음) 또는 삭제(A에는 있지만 B에는 없음)이며, 이것이 나란히 보기에 표시되는 빨간색과 녹색 행의 집합입니다. 기본 LCS 동적 프로그래밍 테이블은 O(M × N) 시간과 공간이 필요합니다(M과 N은 두 입력의 줄 수). 실제로 diff 엔진은 Myers diff 알고리즘(Eugene Myers, 1986)을 사용합니다. 이는 동일 문제를 O((M + N) × D) 시간으로 풀며, D는 두 파일 사이의 편집 거리입니다. 대부분 동일한 두 파일의 경우 D가 작아 Myers가 전체 DP 테이블보다 훨씬 빠릅니다. Git의 기본 diff 백엔드, GitHub의 웹 diff 뷰, 대부분의 IDE diff 패널이 바로 이 이유로 Myers 또는 그 변형인 patience diff, histogram diff를 사용합니다. Patience diff는 고유하게 나타나는 줄을 먼저 정렬하여 코드 블록이 이동된 경우에도 더 읽기 좋은 헹크를 생성합니다. 출력은 CLI 도구에서는 통합 diff 형식(@@ -m,n +p,q @@ 헹크 헤더와 줄당 단일 +/- 접두사)으로, 웹 UI에서는 나란히 색상 행으로 렌더링되는 equal/insert/delete 연산 시퀀스입니다. 문자 단위 또는 단어 단위 diff는 더 세밀한 시퀀스에 동일한 알고리즘을 적용하며, 치환을 단일 연산으로 계수해야 할 때 Levenshtein 거리(삽입 + 삭제 + 치환 비용)와 결합됩니다. Neil Fraser의 diff-match-patch 라이브러리가 웹 기반 문자 단위 diff의 대표적인 참조 구현입니다.
- LCS 기반: 두 줄 배열의 최장 공통 부분 수열이 변경되지 않은 행을 정의; 나머지는 모두 삽입 또는 삭제
- Myers diff(1986): O((M + N) × D) 시간, D는 편집 거리; Git, GitHub, 대부분의 IDE diff 뷰의 기본 백엔드
- 기본 DP: O(M × N) 시간과 공간 — 작은 입력에는 적합하지만 이차 메모리로 인해 대용량 파일에는 부적합
- Patience diff: 고유하게 나타나는 줄을 먼저 정렬; 이동되거나 재정렬된 블록에 대해 더 깔끔한 헹크 생성
- 출력 형식: CLI용 @@ -m,n +p,q @@ 헹크 헤더의 통합 diff; 웹 UI용 나란히 색상 행
- 세분화 수준: 줄/단어/문자 diff가 입력의 다른 분할에 동일한 알고리즘을 적용
- Levenshtein 거리: 삽입 + 삭제 + 치환을 계수; diff-match-patch가 대표적인 웹 라이브러리
예시
단락 안에서 단어 한 개의 변경 찾기
원본:
The server starts on port 3000 by default.
수정본:
The server starts on port 8080 by default.
결과: 1줄 변경 (3000 -> 8080)설정 블록의 두 버전 비교
원본: 수정본:
timeout: 30 timeout: 60
retries: 3 retries: 3
debug: false debug: true
log_level: info
결과: 2줄 추가, 2줄 삭제릴리스 노트의 변경 전후 비교
삭제됨 (빨강):
- Fixed login redirect on Safari 16
추가됨 (초록):
- Fixed login redirect on Safari 16 and 17
- Added dark mode preference sync
결과: 2줄 추가, 1줄 삭제JSON 키 순서 변경 감지
원본: 수정본:
{ "name": "alice", { "id": 1,
"id": 1, "name": "alice",
"role": "admin" } "role": "admin" }
결과: 2줄 변경 (키 순서가 다름, 값은 동일)자주 묻는 질문
어떤 종류의 diff를 보여 주나요?
줄 단위 diff입니다. 좌우 두 패널에 텍스트를 나란히 보여 주며, 왼쪽에는 삭제된 줄을 빨간색, 오른쪽에는 추가된 줄을 초록색으로 강조합니다. 줄 번호로 변경 위치를 쉽게 파악할 수 있고, 상태 표시줄에서 추가·삭제된 줄 수를 확인할 수 있습니다.
어떤 diff 알고리즘을 사용하나요?
최장 공통 부분 수열(LCS) 알고리즘으로 줄 단위 편집 스크립트를 계산합니다. 일반적인 문서 크기에서는 입력하는 동시에 결과가 갱신될 만큼 빠르며, 알고리즘은 왼쪽 텍스트를 오른쪽 텍스트로 바꾸는 데 필요한 가장 짧은 삽입·삭제 시퀀스를 찾아냅니다.
git diff와 결과가 다른 이유는 무엇인가요?
Git은 자체 구현과 설정 가능한 알고리즘으로 diff를 계산합니다. 이 페이지는 브라우저에서만 동작하는 JavaScript 기반 LCS diff를 사용하므로 출력 형식이나 hunk 경계가 git diff와 약간 다를 수 있지만, 줄 단위 변경 검출 결과 자체는 정확합니다.
단락이나 문장 안의 변경만 비교할 수도 있나요?
네, 비교할 두 버전을 각 패널에 붙여넣으면 됩니다. 변경된 줄 안에서는 글자 단위 강조도 보여 주는데, 덕분에 'foo를 bar로 변경' 같은 수정이 두 개의 무관한 변경 대신 한 줄 안의 인라인 교체로 표시됩니다.
공백을 무시할 수 있나요?
아니요. 기본적으로 공백 차이도 모두 인식합니다. 줄 끝 공백, 추가된 빈 줄, 줄바꿈 문자(LF/CRLF) 차이도 모두 변경으로 표시됩니다.
JSON이나 XML을 구조 단위로 비교할 수 있나요?
이 페이지의 텍스트 diff는 줄 단위입니다. JSON에서 키 'a'가 1번 위치에서 3번 위치로 이동했지만 값이 같다면 변경 없음으로 보고 싶다면, jsondiffpatch나 json-diff처럼 JSON 구조를 이해하는 도구를 사용하세요. 이 페이지는 텍스트 비교 전용입니다.
입력한 텍스트가 업로드되나요?
아니요. diff는 브라우저에서 실행되며, 양쪽 입력은 모두 로컬에서 처리되고 외부로 전송되지 않습니다.