텍스트 Diff란?
텍스트 diff는 두 버전의 텍스트를 구조적으로 비교해 무엇이 추가됐는지, 무엇이 삭제됐는지, 무엇이 그대로인지를 식별하는 작업입니다. 결과물은 차이점을 강조 표시해서 두 버전 전체를 읽지 않아도 무엇이 바뀌었는지 빠르게 파악할 수 있게 해줍니다.
이 개념은 소프트웨어 개발의 기본입니다. Git 같은 버전 관리 시스템은 diff 알고리즘 위에 구축되어 있습니다. 하지만 문서 개정 비교, 설정 파일 관리, 데이터 내보내기 비교, 두 버전의 텍스트를 조율해야 하는 모든 상황에서도 똑같이 유용합니다.
Diff 알고리즘의 원리
가장 널리 쓰이는 diff 알고리즘은 최장 공통 부분 수열(LCS) 문제를 기반으로 합니다. 두 시퀀스가 주어졌을 때, LCS는 두 시퀀스 모두에서 같은 순서로 나타나는 가장 긴 요소 시퀀스를 찾습니다. LCS에 포함되지 않는 요소들이 차이점입니다. 첫 번째 버전에만 있으면 삭제, 두 번째 버전에만 있으면 추가입니다.
고전적인 diff 알고리즘은 1976년 Hunt와 McIlroy가 발표했으며, 유닉스 diff 도구와 많은 파생 도구의 기반이 됩니다. 더 큰 입력에 대해서는 Myers diff 알고리즘(1986)이 최단 편집 스크립트, 즉 하나의 텍스트를 다른 텍스트로 변환하는 데 필요한 최소 삽입·삭제 횟수를 찾아 성능을 개선합니다.
중요한 구분은 라인 수준 diff와 문자 수준 diff입니다. 라인 수준 diff는 각 줄을 단위로 취급해 어떤 완전한 줄이 바뀌었는지 보여줍니다. 문자 수준(또는 단어 수준) diff는 더 세밀한 세분성을 제공해 변경된 줄 내에서 정확히 어떤 단어나 문자가 바뀌었는지 보여줍니다.
Diff 읽기
표준 diff 출력은 특정 규칙을 사용합니다. -로 시작하는 줄은 원본에 있었지만 삭제된 줄입니다. +로 시작하는 줄은 새 버전에서 추가된 줄입니다. 접두사가 없는 줄은 변경되지 않은 맥락 줄로, 독자가 위치를 파악하도록 돕습니다.
대부분의 현대 도구(GitHub 풀 리퀘스트 리뷰에서도 친숙한)에서 쓰이는 시각적 diff 형식은 삭제는 빨간색, 추가는 녹색으로 색상 코딩합니다. 나란히 보기(side-by-side) diff는 왼쪽에 원본, 오른쪽에 새 버전을 보여주며 대응하는 섹션이 같은 세로 위치에 나타나도록 정렬합니다.
코드 리뷰
소프트웨어 개발에서 diff는 코드 리뷰의 핵심 산출물입니다. GitHub, GitLab, Bitbucket의 풀 리퀘스트는 기본 브랜치 대비 제안된 변경사항의 diff를 보여줍니다. 리뷰어는 diff를 읽어 무엇이 변경됐는지 파악하고, 버그나 스타일 문제를 식별하며, 개선을 제안합니다.
diff를 효과적으로 읽는 것은 기술입니다. 가장 좋은 접근법은 변경 의도를 먼저 파악하는 것입니다. 풀 리퀘스트 설명을 읽고, 어떤 파일이 바뀌었는지 보고, 그다음 라인 수준 변경으로 들어갑니다. 대규모 diff(수백 개 파일)는 철저한 리뷰가 어렵습니다. 하나의 일을 하는 명확하게 범위가 정해진 변경이 검증하기 훨씬 쉽습니다.
문서 편집과 버전 관리
작가들은 문서 버전 간 개정을 추적하기 위해 diff 도구를 사용합니다. 여러 차례 편집 과정을 거치는 연구 논문, 협상 중인 법률 계약서, 업데이트 중인 정책 문서 — diff 도구로 버전을 비교하면 두 버전을 동시에 기억하지 않아도 정확히 무엇이 바뀌었는지 파악할 수 있습니다.
Microsoft Word 같은 워드 프로세서에도 유사한 목적의 변경 내용 추적 기능이 있지만, 텍스트 diff 도구는 모든 일반 텍스트나 마크다운 문서에서 작동하고 크고 복잡한 문서를 비교할 때 더 안정적인 결과를 냅니다.
학술 작문에서는 제출 원고와 수정본을 비교해 모든 심사위원 의견이 반영됐는지 쉽게 확인할 수 있습니다. 법률 문서에서는 계약서 버전 간 diff가 각 협상 라운드에서 무엇이 합의됐는지 명확한 감사 추적을 제공합니다.
설정 파일 관리
시스템 관리자와 DevOps 엔지니어는 설정 파일 관리에 diff 도구를 자주 사용합니다. 프로덕션 설정과 스테이징 설정 비교, 배포 스크립트가 의도한 설정만 변경했는지 확인, 템플릿 설정과 배포된 버전의 차이 검토 — 이 모든 것이 diff 작업입니다.
Terraform, Ansible 같은 인프라-as-코드 도구는 변경사항을 적용하기 전에 diff를 표시해 인프라에서 무엇이 변경될지 정확히 보여줍니다. 이 diff를 이해하는 것은 프로덕션 장애가 발생하기 전에 실수를 잡는 데 필수적입니다.
설정 diff는 보안에도 중요합니다. 현재 서버 설정을 알려진 정상 기준선과 비교하면 무단 변경을 감지할 수 있습니다 — 간단하지만 효과적인 보안 모니터링 기법입니다.
변경사항 병합
두 사람이 같은 파일을 독립적으로 편집했을 때, diff 도구는 그들의 변경사항이 충돌하는지 파악할 수 있습니다. A가 10번째 줄을 변경하고 B가 20번째 줄을 변경했다면 자동으로 병합할 수 있습니다. 둘 다 10번째 줄을 변경했다면 수동으로 해결해야 하는 충돌이 발생합니다.
3-방향 병합 — 원본, A의 버전, B의 버전을 비교 — 은 버전 관리 시스템이 사용하는 알고리즘입니다. 병합 충돌이 어떻게 발생하고 충돌된 파일에서 diff가 무엇을 보여주는지 이해하는 것은 협업 환경에서 일하는 모든 사람에게 필수적인 지식입니다.