본문 바로가기

IT & AI

Git diff를 함수 단위로 읽는 sem, 코드 변경 추적이 달라져요

728x90

Git diff를 함수 단위로 읽는 sem, 코드 변경 추적이 달라져요

AI 뉴스 썸네일
AI 뉴스 썸네일

Git diff는 정확하지만, 큰 리팩터링에서는 읽기 어려워져요. 함수가 다른 파일로 옮겨지거나 이름이 바뀌면 삭제와 추가가 길게 나타나기 때문이에요. 오픈소스 도구 sem은 변경된 줄 대신 함수·메서드·클래스 같은 코드 엔티티를 비교해 이 문제를 풀어요. 1

핵심 요약

구분핵심왜 볼 만한가요
변경 비교함수·클래스 단위로 추가, 수정, 삭제, 이동, 이름 변경을 보여줘요리팩터링의 의도를 줄 단위 diff보다 빠르게 파악할 수 있어요
영향 분석의존 코드, 호출자, 영향받는 테스트를 엔티티 기준으로 찾아요변경 전에 확인할 범위를 좁히는 데 쓸 수 있어요
개발 흐름Git 저장소에서 별도 설정 없이 시작하고 JSON·Markdown 출력도 지원해요코드 리뷰, CI, 코딩 도구에 결과를 연결하기 쉬워요

1. 줄 번호 대신 함수의 변화를 보여줘요

sem은 tree-sitter로 소스 코드를 파싱한 뒤 함수, 클래스, 메서드 같은 엔티티를 추출해요. `sem diff`를 실행하면 작업 트리와 스테이징 영역, 특정 커밋, 커밋 범위를 엔티티 기준으로 비교할 수 있어요. Git 저장소 밖에서도 파일 2개를 직접 비교할 수 있고, 일반 텍스트와 JSON, Markdown 형식을 제공해요. 2

이름이 같으면 엔티티 ID로 연결하고, 이름이 달라졌다면 구조 해시와 토큰 유사도를 차례로 확인해요. 토큰이 80% 넘게 겹치면 이름 변경 가능성이 있는 엔티티로 판단해요. 그래서 함수가 이동하거나 이름만 바뀐 리팩터링을 단순 삭제·추가와 구분할 수 있어요. 다만 자동 판정인 만큼 큰 폭으로 다시 작성한 함수는 별도 변경으로 잡힐 수 있어요.

728x90

`sem impact`는 특정 함수가 바뀔 때 영향을 받을 의존 코드와 호출자, 테스트를 찾아줘요. `sem blame`은 파일의 함수·클래스별 마지막 수정자를 보여주고, `sem log`는 한 엔티티가 Git 기록에서 어떻게 달라졌는지 추적해요. 저장소에서 자주 바뀐 코드와 같은 커밋에서 함께 수정된 엔티티도 확인할 수 있어요.

GitHub Actions에 연결하면 Pull Request마다 바뀐 함수와 클래스를 댓글로 남길 수 있어요. 포맷이나 주석만 달라진 변경도 따로 표시해요. 빌드를 실패시키는 품질 게이트보다는 리뷰어가 변경 범위를 읽는 보조 화면에 가까워요.

현재 README 기준으로 TypeScript, Python, Go, Rust, Java, Swift, C/C++, SQL 등 32개 프로그래밍 언어를 파싱해요. JSON, YAML, TOML, CSV, Markdown 같은 구조화된 파일도 다뤄요. 엔티티 캐시는 저장소 밖의 운영체제 캐시 디렉터리에 SQLite로 보관해 작업 트리에 파일을 남기지 않아요.

왜 중요한가요

대규모 리팩터링에서 줄 단위 diff는 변경량을 보여주지만, 어떤 함수가 옮겨졌고 무엇과 연결되는지는 개발자가 다시 해석해야 해요. sem의 엔티티 diff와 영향 분석을 함께 쓰면 리뷰어가 확인할 함수와 테스트 후보를 먼저 좁힐 수 있어요. 특히 파일 이동과 이름 변경이 잦은 Pull Request에서 차이가 커요.

코딩 도구에도 맞는 출력 구조를 갖췄어요. `sem context`는 대상 엔티티와 의존 관계를 정해진 토큰 예산 안에 묶고, JSON 출력은 CI나 다른 개발 도구가 후속 처리를 하기 쉬워요. 그래도 파서가 만든 의존 그래프가 실제 런타임 동작과 항상 같다고 볼 수는 없어요. 동적 호출이나 코드 생성이 많은 프로젝트에서는 기존 테스트와 줄 단위 diff를 함께 확인하는 편이 안전해요.

도입 전에는 저장소의 주력 언어가 지원되는지, 리네임과 이동 감지가 팀의 실제 리팩터링에서 얼마나 정확한지 작은 Pull Request로 확인해 보는 게 좋아요. GNU Parallel에도 이름이 같은 `sem` 실행 파일이 있으므로 설치 뒤 `sem --version`으로 어떤 바이너리가 실행되는지도 확인해야 해요. 2

참고 자료

  1. sem - Git 위에 함수·클래스 단위 변경 추적을 추가하는 시맨틱 버전 관리 도구 — GeekNews
  2. Ataraxy-Labs/sem — GitHub
728x90