텍스트 비교 및 차이 분석
두 텍스트를 브라우저에서 즉시 비교. 좌우 대조 뷰, 인라인 단어 단위 하이라이트, 통합 diff 출력, 대소문자/공백/빈 줄 무시. 100% 브라우저 처리, 업로드 없음.
무시 옵션
텍스트 비교란?
텍스트 비교는 두 텍스트 문서의 구조적 비교로, 하나를 다른 하나로 변환하는 데 필요한 최소한의 삽입과 삭제 집합을 찾아냅니다. 출력은 변경을 시각적으로 드러냅니다. 추가 줄은 초록, 삭제 줄은 빨강이며, 좌우 대조 형태나 `git`, GitHub, Unix `patch` 명령어가 쓰는 `---/+++/@@` 통합 패치 형식으로 표현됩니다.
내부적으로 모든 현대 diff는 최장 공통 부분 수열(LCS) 알고리즘입니다. Eugene Myers의 1986년 O((N+M)D) 논문이 효율적 구현의 정석이고, 본 도구가 채택한 고전적 동적 계획법(공통 접두/접미사 트리밍 포함)은 더 단순하면서 일반적인 웹 입력에는 충분히 동작합니다. 줄 단위 정렬이 끝난 후, 인접한 삭제 + 추가 쌍은 두 번째 토큰 수준 LCS를 거쳐 렌더러가 한 줄 안에서 실제로 바뀐 단어만 강조할 수 있게 합니다 — 리뷰어들이 줄 내부 diff 또는 단어 수준 diff라 부르는 것입니다.
왜 단순히 문자 단위로 비교하지 않을까요? 편집은 평면적이지 않기 때문입니다. 200 줄 파일 중간에 한 줄을 삽입하면 그 아래 모든 줄이 밀립니다. 순진한 `===`는 아래의 199 줄을 모두 다르다고 판정합니다. LCS는 진실을 알려줍니다. 추가는 1 줄, 변경 없는 줄은 199 줄.
이 도구는 모든 비교를 브라우저 안에서 실행합니다. 업로드 없음, 임시 파일 없음, 로그 없음. 사유 코드, 레드라인이 들어간 계약서, 비공개 로그 — 제3자 서버에 붙여 넣기 꺼려지는 모든 것에 안전합니다. JSON을 diff하고 싶나요? 구조화된 JSON Diff를 사용해 키 순서와 공백이 노이즈가 되지 않게 하세요. YAML이나 CSV로 된 두 설정을 비교한다면 먼저 YAML → JSON 또는 JSON → CSV로 변환한 다음 형식에 맞는 도구로 diff하세요.
// Two strings that look 'mostly the same' but a naïve check disagrees const a = 'hello world'; const b = 'hello, world!'; // Character equality a === b; // false — but only 3 characters actually changed. // LCS-style diff (this tool, at line + word granularity) // → 1 line modified, inline highlight: 'hello[, ]world[!]' // → unified patch: // --- original // +++ modified // @@ -1 +1 @@ // -hello world // +hello, world!
핵심 기능
좌우 대조 + 통합 뷰
사람 리뷰용 2열 시각화 뷰와 `git apply`, 코드 리뷰 도구, 버그 리포트용 표준 통합 diff 패치 형식 사이를 자유롭게 전환할 수 있습니다.
줄 내부 단어 단위 하이라이트
두 줄이 수정으로 짝지어지면 바뀐 토큰만 색상 배경을 가집니다. 80 문자를 훑지 않고도 시선이 즉시 편집 지점을 찾아갑니다.
대소문자 / 공백 / 빈 줄 무시
네 가지 독립 토글: 대소문자, 모든 공백, 줄 끝 공백만, 빈 줄. 몇 번의 클릭으로 `git diff -i -w -b`를 재현할 수 있습니다.
통합 diff 내보내기
3 줄 컨텍스트가 포함된 깨끗한 `---/+++/@@` 패치를 복사하세요. PR 댓글, 버그 리포트, `patch -p1`에 바로 붙여 넣을 수 있습니다.
100% 브라우저 기반
입력은 기기를 떠나지 않습니다. 업로드 없음, 텍스트에 대한 분석 없음. 페이지 로드 후 오프라인에서도 동작합니다. 사유 코드와 기밀 문서에도 안전합니다.
유니코드 + RTL 인식
유니코드 단어 경계로 토큰을 분리합니다. 아랍어, 히브리어, CJK 콘텐츠도 깔끔하게 비교되며 줄 끝 변형(CRLF, LF, CR)은 모두 정규화됩니다.
예시
코드 리뷰 — 변수 이름 변경
function getUser(id) {
const u = db.users.find(x => x.id === id);
return u;
} function getUser(userId) {
const u = db.users.find(x => x.id === userId);
return u;
} 좌우 대조 뷰는 이름 변경이 일어난 모든 줄을 강조하고, 줄 내부 word diff는 바뀌지 않은 토큰을 흐리게 처리해 리뷰어가 어떤 식별자가 변경됐는지 정확히 볼 수 있습니다.
계약서 수정 — 조항 한 줄 추가
1. The service is provided as-is. 2. Either party may terminate with 30 days notice. 3. Disputes are resolved in California courts.
1. The service is provided as-is. 2. Either party may terminate with 30 days notice. 2a. Termination notice must be in writing. 3. Disputes are resolved in California courts.
삽입된 단일 조항(2a 줄)이 유일한 차이입니다. 주변 컨텍스트 줄은 깔끔하게 유지되어 계약서나 정책 문서의 레드라인 작업에 적합합니다.
로그 조사 — 요청 시간 변화
GET /api/users 200 14ms POST /api/orders 201 88ms GET /api/orders/42 200 21ms
GET /api/users 200 14ms POST /api/orders 201 4200ms GET /api/orders/42 500 21ms
두 줄이 바뀝니다. 줄 내부 하이라이트가 88ms → 4200ms의 지연 시간 변화와 200 → 500 상태 코드를 보여줍니다. 장애 타임라인 분석의 정석입니다.
줄 끝 공백 — '끝 공백 무시' 옵션 토글
margin: 0; padding: 0; border: none;
margin: 0; padding: 0; border: none;
옵션 없이는 1 줄이 차이로 표시됩니다(끝 공백 때문). '줄 끝 공백 / 탭 무시'를 켜면 차이가 0이 됩니다. `git diff -b`와 같은 동작입니다.
사용 방법
- 1
두 버전을 붙여 넣기
원본 텍스트는 왼쪽에, 변경된 텍스트는 오른쪽에. 입력하는 동안 라이브 diff가 렌더링되며, 큰 입력(합산 200 KB 초과)은 수동 Diff 버튼으로 전환됩니다.
- 2
필요한 무시 옵션 켜기
대소문자 무시, 모든 공백 무시, 줄 끝 공백 무시, 빈 줄 무시 — 각각 독립적이며 방문 간에 유지됩니다.
- 3
diff를 읽거나 패치를 가져가기
사람 리뷰용 좌우 대조, `---/+++/@@` 패치 형식용 통합 뷰. '통합 diff 복사'는 코드 리뷰나 `patch -p1`용으로 깨끗한 패치를 클립보드에 보냅니다.
흔한 Diff 함정
Windows ↔ Unix 복사 후 파일 전체가 '바뀐' 것처럼 보임
Windows의 메모장에서 Unix가 편집한 원본에 붙여 넣으면 모든 줄에서 \r 차이가 나타납니다. '줄 끝 공백 / 탭 무시'를 켜면 CR 문자를 잠재울 수 있습니다.
Diff: 200건 수정(전부 줄 끝 \r 때문)
줄 끝 공백 / 탭 무시 → 실제 변경은 2건
들여쓰기만 다른데 diff가 비명을 지름
탭 ↔ 공백 재포맷팅은 줄 단위 diff를 폭발시킵니다. '모든 공백 무시'는 실제 의미적 변경만 남깁니다.
Diff: 87건 수정(전부 들여쓰기 변경)
모든 공백 무시 → 실제 변경 4건
빈 줄 하나 때문에 같은 단락이 변경으로 표시됨
산문에 빈 줄 하나를 추가하거나 제거하면 영역 전체가 어긋날 수 있습니다. '빈 줄 무시'는 본문을 건드리지 않고 이를 바로잡습니다.
Diff: 단락 2가 '완전히 바뀜'(빈 줄 하나가 이동)
빈 줄 무시 → 단락 2에 변경 없음
diff는 '동일'이라고 하는데 파일은 다름
거의 항상 이전 세션의 대소문자 또는 공백 무시 옵션이 켜진 상태로 남아 있는 경우입니다. '무시 옵션' 패널을 여세요 — 모든 토글이 거기 보입니다. 바이트 단위 엄격 비교를 원하면 전부 끄세요.
차이 0건으로 표시되지만 `cmp`는 파일이 다르다고 함
모든 무시 옵션 해제 → 실제 diff가 나타남
붙여 넣은 JSON이 '전부 바뀐' 것처럼 보임
텍스트 diff는 키 순서를 의미 있게 다루지만 JSON은 그렇지 않습니다. JSON 페이로드는 전용 JSON Diff 도구를 사용하세요. 키 순서를 무시하고 타입 엄격성을 존중합니다.
JSON에 텍스트 diff: 줄의 100%가 변경(실은 키 재정렬일 뿐)
<a href="/ko/tools/json-diff">JSON Diff</a>: 차이 0건
'Diff 잘림' 경고를 무시함
한쪽당 5,000 줄을 초과하면 입력이 잘립니다. 경고가 보이면 커맨드라인 `diff -u file1 file2`나 `git diff --no-index`로 전환하세요. 둘 다 스트리밍으로 GB 단위를 처리합니다.
20,000 줄 로그를 붙여 넣음 — 첫 5,000 줄만 diff됨
터미널에서 `diff -u a.log b.log`로 파일 전체 처리
주요 사용 사례
- 코드 리뷰 스니펫
- 함수의 두 버전을 좌우 상자에 떨어뜨려 이름 변경, 제거된 분기, 새 가드 절을 한눈에 확인하세요. 한 줄 변경을 찾는다면 GitHub diff를 스크롤하는 것보다 줄 내부 단어 하이라이트가 더 빠릅니다.
- 계약서 / 정책 레드라인
- 어제 계약서와 오늘의 수정본을 붙여 넣으세요. 삽입된 조항이 도드라지고 변경 없는 단락은 회색으로 가라앉습니다. 법무 검토 기록용으로 통합 패치를 내보내세요.
- 로그 타임라인 조사
- SRE의 장애 이전 로그 조각을 장애 발생 중의 조각과 비교하세요. `awk` 없이도 지연 시간, 상태 코드, 빈도 변화가 즉시 드러납니다.
- 원고 / 초안 개정
- 초안과 편집자 버전을 붙여 넣으세요. 줄 내부 단어 diff가 어떤 문장이 다시 쓰였는지 정확히 보여줍니다 — 변경을 하나씩 수락 또는 거절할 때 매우 유용합니다.
- 번역 검토
- 기존 번역과 재번역을 diff해 새 카피가 의미, 구조, 플레이스홀더를 보존하는지 확인하세요. '줄 끝 공백 무시'를 켜면 번역가들이 자주 들여오는 노이즈를 잠재울 수 있습니다.
- 설정 / .env 파일 감사
- 두 개의 `.env`, `docker-compose.yaml`, 셸 rc 파일을 비교하세요. '빈 줄 무시'를 켜면 diff가 서식 흔들림 대신 기능적 차이에 집중합니다.
기술 세부 사항
- 접두/접미사 트리밍이 적용된 LCS
- 동적 계획법 LCS를 실행하기 전에 공통의 시작/끝 줄을 제거합니다. '2,000 줄짜리 설정 두 개에서 한 줄만 바뀐' diff는 1×1 DP 표로 축소되어 1 밀리초 이내에 렌더링됩니다.
- 토큰 단위 줄 내부 diff
- 인접한 삭제 + 추가 헝크가 짝지어지고, 유니코드 단어 / 비단어 / 공백 런으로 토큰화됩니다. 두 번째 LCS가 초록 / 빨강 토큰 스팬을 만들어 수정된 줄을 읽기 쉽게 만듭니다.
- 통합 diff = git/patch 호환
- 출력은 GNU patch용으로 정의되고 Git, GitHub, 모든 코드 리뷰 도구가 사용하는 `---/+++/@@ -L,C +L,C @@` 형식을 따릅니다. `pbpaste | patch -p0`로 적용하세요.
- 한쪽당 5,000 줄 입력 상한
- 상한을 넘으면 diff는 잘라내고 경고를 보냅니다. 수 MB 입력에는 커맨드라인 `diff -u`나 `git diff --no-index`를 사용하세요. 둘 다 스트리밍으로 GB 단위를 처리합니다.
모범 사례
- 읽기 전에 무시 옵션부터 정하기
- 줄 끝 공백, CRLF, 대소문자 노이즈는 신호를 묻어버립니다. 먼저 알맞은 옵션을 켜세요. diff가 훨씬 읽기 쉬워지고, '가짜' 변경을 건너뛰는 습관이 들지 않습니다.
- 공유에는 통합, 리뷰에는 좌우 대조
- 시각적 열은 당신의 눈을 위한 것이고, 통합 패치는 다른 모두의 터미널을 위한 것입니다. 복사된 통합 diff는 번역 없이 Slack 메시지, Jira 댓글, `patch -p1`에 그대로 들어갑니다.
- 일치율 %로 건전성 검사
- 두 파일이 '거의 같은데' 일치율이 30%라면 줄 끝이나 공백 문제가 있는 것입니다. '모든 공백 무시'를 켜고 다시 확인한 뒤 diff를 읽으세요.
자주 묻는 질문
붙여넣은 텍스트가 서버로 전송되나요?
텍스트 diff와 JSON diff의 차이는 무엇인가요?
공백, 대소문자, 빈 줄을 무시하려면 어떻게 하나요?
통합 diff(unified diff)란 무엇이고 언제 복사하나요?
단어 하나만 고쳤는데 왜 줄 전체가 바뀐 것으로 표시되나요?
CRLF와 LF 줄 끝은 어떻게 처리되나요?
두 입력의 최대 크기는 얼마인가요?
코드를 diff할 수 있나요? 제가 쓰는 언어를 알아보나요?
한 번의 편집이 가끔 삭제 줄 + 추가 줄로 표시되는 이유는?
% 일치율은 어떻게 계산되나요?
diff를 동료와 공유할 수 있나요?
아랍어나 히브리어 같은 우측에서 좌측 언어도 지원하나요?
관련 도구
모든 도구 보기 →무료 정규식 테스터 — 패턴을 웹에서 디버그하고 일치 확인하기
텍스트 도구
정규 표현식을 모든 텍스트에 즉시 온라인 테스트합니다. 일치 강조, 캡처 그룹, 치환 미리보기, 분할, 설명 지원. JavaScript 정규식, 100% 비공개, 가입 없음.
무료 글자 수 세기 & 단어 카운터
텍스트 도구
단어, 문자, 문장, 단락 수와 읽기 시간을 즉시 계산합니다. Twitter, 메타 설명, Instagram 길이 제한 검사를 실시간으로 지원하는 무료 브라우저 카운터입니다.
진법 변환기 (Number Base Converter)
변환 도구
2진수, 16진수, 10진수, 8진수 및 임의 진법(2-36)을 즉시 변환합니다. 온라인에서 무료로 사용할 수 있으며 모든 처리는 브라우저에서 이루어집니다.
Base64 디코더 · 인코더 (Base64 Decoder & Encoder)
인코딩 & 포매팅
Base64를 온라인에서 무료로 인코딩하고 디코딩합니다. UTF-8과 이모지를 완벽 지원하는 실시간 변환으로, 100% 브라우저에서 처리되어 회원 가입이 필요 없습니다.
crontab 생성기 & cron 표현식 빌더
날짜 & 시간
브라우저에서 cron 표현식을 만들고 검증·해석합니다. 로컬 또는 UTC로 다음 실행을 미리 보고, POSIX 5필드 문법과 프리셋을 온라인에서 무료로 사용합니다.
CSV to JSON 변환기 (CSV to JSON Converter)
인코딩 & 포매팅
브라우저에서 CSV를 JSON으로 변환합니다. RFC 4180, 타입 추론, 헤더 행, 큰 정수 안전 처리. 100% 비공개, 업로드 없음.